2013-02-03 69 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中不使用引号可防止转义字符串的安全性。