(PHP) Doğrulama, Güvenlik ve Hız - benim app bu var mı?

2 Cevap php

Şu vea PHP bir bina topluluk web sitesi üzerinde çalışıyorum. Bu kullanıcının diğer işlevsellik sürü kayıt sağ doldurabilirsiniz formlarını içerir. Ben bir nesne yönelimli bir adam değilim, bu yüzden çoğu zaman benim uygulama işlemek için işlevleri kullanıyorum. Ben OOPS öğrenmek zorunda biliyorum, ama şu vea bu web sitesi geliştirmek ve yakında çalışan almak gerekiyor.

Anyway, here's a sample of what I let my app. do: Consider a page (register.php) that has a form where a user has 3 fields to fill up, say: First Name, Last Name ve Email. Upon submission of this form, I want to validate the form ve show the corresponding errors to the users:

<form id="form1" name="form1" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>"> 

<label for="name">Name:</label>  
<input type="text" name="name" id="name" /><br />

<label for="lname">Last Name:</label>   
<input type="text" name="lname" id="lname" /><br />

<label for="email">Email:</label>   
<input type="text" name="email" id="email" /><br />


<input type="submit" name="submit" id="submit" value="Submit" />
</form>

Bu form aynı sayfaya bilgi yayınlayacağız. Yani burada POST'ed bilgi işleyecek kod:

<?php

require("functions.php");

if( isset($_POST['submit']) )
    {
    	$errors = fn_register();

    	if( count($errors) )
    	{
    		//Show error messages
    	}
    	else
    	{
    		//Send welcome mail to the user or do database stuff...
    	}

    }

?>




<?php

//functions.php page:

function sql_quote( $value )
{
     if( get_magic_quotes_gpc() )
    {

          $value = stripslashes( $value );
    }
    else
    { 
          $value = addslashes( $value );
    } 
    if( function_exists( "mysql_real_escape_string" ) )
    {
          $value = mysql_real_escape_string( $value );
    }

    return $value;

}


function clean($str) {
$str = strip_tags($str, '<br>,<br />');
$str = trim($str);
$str = sql_quote($str); 

return $str;

}


 foreach ($_POST as &$value)  
    {
               if (!is_array($value)) 
    	{ 
                       $value = clean($value); 

               }
               else 
    	{ 
                       clean($value);
               }
       }

 foreach ($_GET as &$value)  
    {
               if (!is_array($value)) 
    	{ 
                       $value = clean($value); 
               }
               else 
    	{ 
                       clean($value);
               }
       } 


function validate_name( $fld, $min, $max, $rule, $label ) {

    if( $rule == 'required' ) 
    {    
        if ( trim($fld) == '' ) 
        {
            $str = "$label: Cannot be left blank.";
            return $str;
        }        
    }


    if ( isset($fld) && trim($fld) != '' ) 
    {    
        if ( isset($fld) && $fld != '' && !preg_match("/^[a-zA-Z\ ]+$/", $fld)) 
    {
            $str = "$label: Invalid characters used! Only Lowercase, Uppercase alphabets ve Spaces vardır allowed";
        }

    else if ( strlen($fld) < $min or strlen($fld) > $max )  
    {
            $curr_char = strlen($fld);
            $str = "$label: Must be atleast $min character &amp; less than $max char. Entered characters: $curr_char";
        }
        else    
        {
            $str = 0;
        }        
    }
    else
    {
        $str = 0;
    }

    return $str;   
}


function validate_email( $fld, $min, $max, $rule, $label ) {

    if( $rule == 'required' ) 
    {    
        if ( trim($fld) == '' ) 
        {
            $str = "$label: Cannot be left blank.";
            return $str;
        }        
    }


    if ( isset($fld) && trim($fld) != '' ) 
    {    
        if ( !eregi('^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.([a-zA-Z]{2,4})$', $fld) ) 
    {
            $str = "$label: Invalid format. Please check.";
        }
    else if ( strlen($fld) < $min or strlen($fld) > $max )  
    {
            $curr_char = strlen($fld);
            $str = "$label: Must be atleast $min character &amp; less than $max char. Entered characters: $curr_char";
        }
        else    
        {
            $str = 0;
        }        
    }
    else
    {
        $str = 0;
    }

    return $str;   
}

function val_rules( $str, $val_type, $rule='required' ){

    switch ($val_type) 
    {
    	case 'name':
    			$val = validate_name( $str, 3, 20, $rule, 'First Name');
    	break;

    	case 'lname':
    			$val = validate_name( $str, 10, 20, $rule, 'Last Name');
    	break;        

    	case 'email':
    			$val = validate_email( $str, 10, 60, $rule, 'Email');
    	break;


    }

    return $val;
}


function fn_register() {

    $errors = array();

    $val_name        = val_rules( $_POST['name'], 'name' );
    $val_lname           = val_rules( $_POST['lname'], 'lname', 'optional' );
    $val_email       = val_rules( $_POST['email'], 'email' );

    if ( $val_name != '0' )     	{ $errors['name']   = $val_name;  }
    if ( $val_lname != '0' )    	{ $errors['lname']  = $val_lname; }
    if ( $val_email != '0' )    	{ $errors['email']  = $val_email; }

     return $errors;
}

//END of functions.php page
?>

OK, now it might look like there's a lot, but lemme break it down target wise: 1. I wanted the foreach ($_POST as &$value) ve foreach ($_GET as &$value) loops to loop through the received info from the user submission ve strip/remove all malicious input.

  1. Yukarıda belirtildiği gibi hedefe ulaşmak için ilk girişi temiz adında bir işlevi arıyorum. Bu fonksiyon Ayrı alan değerlerinin hatta diziler ve sadece
    etiketleri izin ve her şeyi kaldırmak olsun, girişin her işleyecek. Bunun dinlenme açıktır.

  2. Bu olunca, yeni / temizlenmiş değerleri fn_register () fonksiyonu tarafından işlenir ve doğrulama sonra geri değerlere dayalı olacaktır, biz (geçerliyse) ilgili hataları veya null değerleri olsun.

So here's my questions: 1. This pretty much makes me feel secure as I am forcing the user to correct malicious data ve won't process the final data unless the errors vardır corrected. Am I correct?

  1. (Ben fonksiyonları çok ve bunlara karşılık gelen çağrıları kullanıyorum gibi) takip yöntemi hızını garanti mi? Hala ediliyor form alanları farklıdır ve ben herhangi bir şekilde zaman herhangi bir noktada olabilir alanların asgari sayısı 3 olabilir ve 100 (veya daha fazla, ben web sitesi olarak emin değilim gibi yüksek kadar gidebilir ) geliştirdi. Yukarıdaki şekilde 100 alanları bulunuyor ve doğrulama sahip, uygulama hızını azaltacaktır (yarım milyon kadar, kullanıcıların aynı vea web sitesine erişim söylüyorlar?). Ne ben (eğer mümkünse) hızını artırmak ve işlev çağrıları azaltmak için ne yapabilirim?

3, ben doğrulama geçerli yollarını iyileştirmek için bir şey yapabilir miyim?

Ben nesne yönelimli yaklaşımı kapalı tutarak ve sonrası için PHP FİLTRELERİNİN kullanıyorum. Yani, hepiniz bana / geliştirmek akım yollarını çimdik ve komut savunmasız veya Canlı üretim ortamında kullanılabilecek kadar güvenli olup olmadığını bana önermek yol önermek isteyiniz. Eğer değilse, ne canlı kullanmak mümkün için ne yapabilirim?

Şimdiden teşekkür ederim.

2 Cevap

Sorularınızı cevaplamak için:

  1. Kod kötü niyetli verileri şerit olacak gibi üstünkörü inceleme üzerine, gözüküyor. Eğer kod onları argüman olarak geçirilen değerler konusunda faaliyet küçük fonksiyonları içine kırık olduğundan emin olun, kendinizi yeniden-test durumlarda çok ve çok oluşturmanıza olanak sağlayan bir komut satırı odaklı test paketi yazabilirsiniz hiçbir açıkları var eminiz böylece sistemde değişiklik yapmak istediğiniz zaman çalıştırabilirsiniz.
  2. Genel olarak, herhangi bir web uygulamasının yavaş parçası veritabanı tabakasıdır. Kötü hazırlanmış sorguları ve / veya çok sayıda sorgu ezici performans sorunları açısından PHP kod yürütülmesine gölge düşürecektir. Diğer bir deyişle, aşırı optimize PHP kodu hakkında endişelenmeyin.

Script ilk satırda çapraz site betik saldırılarına karşı zayıf. $ _SERVER ['PHP_SELF'] değeri güvenilir olamaz. Bunu filtre gerekir. Burada basit bir düzeltme:

<form id="form1" name="form1" method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES, 'utf-8'); ?>"> 

Gerekirse başka kodlama ile UTF-8 değiştirin.

Sen gibi giriş deneyebilirsiniz

http://site.com/page.php?a=%22onload%3D%22javascript%3Aalert('XSS')%22

UPS bir uyarı pop görmek için siteye karşı.

Güncelleme: en az PHP 5.3, kod parçacığını XSS ​​karşı savunmasız değil gibi görünüyor. Ancak, ben PHP_SELF eski PHP sürümleri, veya gelecekte üreteceği ne (sen ne) garanti edemez. PHP_SELF değeri kodlanmalıdır.