ugrás a tartalomhoz

Túlzásba vitt escape?

stan · 2009. Nov. 12. (Cs), 23.25
A saját készítésű php-mysql weboldalam php kódját elkezdtem optimalizálni, ami magában foglalja a fölösleges php utasítások eltávolítását. Először nem volt szempont a gyorsaság, csak azt akartam, hogy ne lehessen feltörni az adatbázist. Úgy érzem sok helyen túlzásba vittem a mysql_real_escape_string használatát, mert eddig biztos ami biztos alapon írtam mindenhová, amikor csak hozzányúltam az adatbázishoz.

Van egy űrlap mezőt ellenőrző kódom.
Leegyszerűsítve így néz ki:

if (ereg("^[A-Za-z0-9]{4,12}$",$_POST["username"])) {
   
   $con = mysql_connect($mysqlhost,$mysqlusername,$mysqlpassword);
   mysql_select_db($mysqldatabase, $con);	
   
   $username = mysql_real_escape_string($_POST["username"]);
   $exist_user = mysql_query("SELECT * FROM users WHERE username='$username'");
   
   if (mysql_num_rows($exist_user) == 1) $username_validate = "existing_username";
   else $username_validate = "OK";
   
   mysql_close();
}
else $username_validate = "wrong_chars";
A kérdés, hogy biztonsági szempontból fölösleges-e a mysql_real_escape_string-et elhelyezni ott?
Elvileg enélkül sem lehetne pl. egy mysql injection-t csinálni, mert a ^[A-Za-z0-9]{4,12}$ feltételnek nem felelne meg egy ilyen rosszindulatú karatersorozat. Vagy mégis?
 
1

Nem

janoszen · 2009. Nov. 13. (P), 01.40
Én alapvetően nem bíznék magamban annyira, hogy tudjam az összes lehetsééges karaktert, amivel injectiont lehet lekövetni. Ebben a speciális esetben pont lehet, de minden egyéb esetben azért nem fáj, ha ott van az escape. Arról nem is beszélve, hogy ezeket a műveleteket külön szokták szervezni.
2

Ajánlom még a mysql értékek

deejayy · 2009. Nov. 13. (P), 08.59
Ajánlom még a mysql értékek paraméterben történő átadását (mysqli->prepare, mysqli->bind_params), mivel azzal is jelentősen redukálni lehet a támadási pontok mennyiségét.