mysql_real_escape_string()
mysql_real_escape_string ( $uzklausa [, resource $mid] )
Sutvarkomi kintamieji MySQL užklausoje taip, kad netrukdytų atlikti užklausos MySQL serveriui.
$uzklausa - Nurodoma nesutvarkyta užklausa kurią reikia sutvarkyti.
$mid - MySQL serverio prisijungimo ID.
Grąžinama sutvarkyti užklausa jei pavyko, kitu atveju FALSE.
Panaudojimas
Žemiau pateiktas pavyzdys parodo kaip niekada nedarykite norėdami gauti duomenis iš MySQL pasitelkdami vartotojo įvestais duomenimis.
<?php // Siunčiama užklausa į MySQL serverį patikrinti ar ra toks vartotojas su slaptažodžiu $uzklausa = "SELECT * FROM vartotojai WHERE vartotojas='{$_POST['vartotojas']}' AND slaptazodis='{$_POST['slaptazodis']}'"; mysql_query($uzklausa); // Mes nepatikrinome gautų duomenų iš $_POST['slaptazodis'], čia gali būti bet kas ko norės vartotojas! Pavyzdys: $_POST['username'] = 'coders'; $_POST['password'] = "' OR ''='"; // Tai reiškia užklausa atrodys taip: echo $query; // Užklausa: SELECT * FROM vartotojai WHERE vartotojas='coders' AND slaptazodis='' OR ''='' ?>
Žemiau pateiktas pavyzdys kaip geriausiai atlikti šią situaciją:
<?php if (isset($_POST['pavadinimas']) && isset($_POST['aprasymas']) && isset($_POST['id'])) { // Prisijungiame prie MySQL serverio $mid = mysql_connect('mysql_host', 'vartotojas', 'slaptazodis'); if(!is_resource($mid)) { echo "Nepavyko prisijungti prie MySQL serverio\n"; } else { if(get_magic_quotes_gpc()) { $pavadinimas = stripslashes($_POST['pavadinimas']); $aprasymas = stripslashes($_POST['aprasymas']); } else { $pavadinimas = $_POST['pavadinimas']; $aprasymas = $_POST['aprasymas']; } // Sudarome saugią užklausą $uzklausa = sprintf("INSERT INTO products (`pavadinimas`, `aprasymas`, `id`) VALUES ('%s', '%s', %d)", mysql_real_escape_string($pavadinimas, $mid), mysql_real_escape_string($aprasymas, $mid), $_POST['id']); mysql_query($uzklausa, $mid); if (mysql_affected_rows($link) > 0) { echo "Prekė įterpta\n"; } } } else { echo "Prašome užpildyti formą tinkamai\n"; } ?>
Discussion