2013-02-03 75 views
-1

這個代碼錯誤嗎?mysql_real_escape_string它允許在SQL查詢中沒有引號?

<?php 

if (isset($_GET['Submit'])) { 

    // Retrieve data 

    $id = $_GET['id']; 
    $id = mysql_real_escape_string($id); 

    $getid = "SELECT first_name, last_name FROM users WHERE user_id = $id"; 

    $result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>'); 

    $num = mysql_numrows($result); 

    $i=0; 

    while ($i < $num) { 

     $first = mysql_result($result,$i,"first_name"); 
     $last = mysql_result($result,$i,"last_name"); 

     echo '<pre>'; 
     echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last; 
     echo '</pre>'; 

     $i++; 
    } 
} 
?> 

儘管事實上它使用了mysql_real_escape_string,攻擊者仍然可以注入不帶引號的代碼。

這是DVWA存在漏洞的Web應用程序的一部分。

請問函數mysql_real_escape_string()塊引號,但對我來說,似乎是讓沒有引號在所有...

,對嗎?

+3

[**'mysql_XXX'函數已被棄用**](http://www.php.net/manual/en/faq.databases.php#faq.databases.mysql.deprecated)。 –

+2

[此擴展從PHP 5.5.0開始已棄用,並且將來會被刪除](http://php.net/manual/en/function.mysql-real-escape-string.php) – rlatief

+0

爲什麼不使用對於一個int var只是'$ id =(int)$ _GET ['id']'? –

回答

1

mysql_real_escape_string()應該讓SQL注入攻擊的可能性較小但是,我們強烈建議您使用不會過時,如MySQLi (MySQL Improved)PDO MySQL數據庫的API,它已經制定更強的安全性。

我也相信你正在調用一個不存在的函數,你指定$num變量,它應該是mysql_num_rows()而不是mysql_numrows

0

mysql_real_escape_string()將函數參數放入SQL中可用的裏面的引號中。他們必須使用。即使在處理數字值時也可以使用它們。

在sql中不使用引號可防止轉義字符串的安全性。