2009-03-16

SQL injection алдаанаас PHP дээр хэрхэн хамгаалах вэ? 2-р хэсэг.


PHP дээрх алдаатай жишээнүүд

Жишээ 1
$result=mysql_query('SELECT * FROM users WHERE username="'.$_GET['username'].'"');
Дайралт 1
http://host/?username=testuser' or 2=2

Жишээ 2
$result=mysql_query('SELECT * FROM news WHERE id="'.$_GET['id'].'"');
Дайралт 2
http://host/?id=-1 union select 1,2,3 ...




PHP хэл дээр хамгаалах жишээ 1

PHP хэлний функцуудыг ашиглан хамгаалж болно.


function Query_tseverleh($string)
{
// "\" тэмдэгтийн давхцал үүсгэхээс сэргийлэх
if(get_magic_quotes_gpc())
{
$string = stripslashes($string);
}
if (phpversion() >= '4.3.0')
{
$string = mysql_real_escape_string($string);
}
else
{
$string = mysql_escape_string($string);
}
return $string;
}

Хэрэглэгчийн нэрийг формоор дамжуулан авахдаа дараах хэлбэрийн коде бичиж сэргийлнэ.


if (isset($_GET['username']))
{
$hereglegch = Query_tseverleh($_GET['username']);
...
$result=mysql_query('SELECT * FROM news WHERE id="'.$hereglegch.'"');
...
}

PHP хэл дээр хамгаалах жишээ 2

PHP хэлний "mysqli" нэмэлт санг(http://www.php.net/mysqli) хэрэглэн хамгаалж болно. PHP 4.1-ээс дээших хувилбар дээр ажиллах болно.


$db = new mysqli("localhost", "username", "password", "database");
$stmt = $db -> prepare("SELECT username FROM testUsers
WHERE username=? AND password=?");
$stmt -> bind_param("ss", $user, $pass);
// Bind параметрүүд s - string, b - boolean, i - int, г.м
$stmt -> execute();
$stmt -> bind_results($result);
$stmt -> fetch();
echo "Username=" . $result ;
$stmt -> close();
...

3 comments: