-1

我在单击时用于图像缩略图的以下代码通过从数据库中获取它的“ID”来执行。

echo '<a class="thumbnail" href="view.php?id='.$row['id'] .'"">'; 

下面的代码实际上处理通过上述代码传递的 GET 变量。

<?php
require '../header.php';
if (isset($_GET['id']))
{
require '../../functions/function_db.php';
$id =mysql_real_escape_string (htmlentities($_GET['id']));
$sql = "SELECT * FROM `site_products` WHERE `id` = $id LIMIT 1";
$result = mysql_query($sql);
while ($row = mysql_fetch_assoc($result)) 
{
$product_name = $row['product_name'];
$price = $row['final_price'];
$desc = $row['short_description'];

}
}
?>

尽管使用了 mysql_real_escape_string,但在以下情况下,URL 仍会成为 SQL 注入漏洞。

http://localhost/cart/pages/men/view.php?id=1'
http://localhost/cart/pages/men/view.php?id=1 orderby 1

并且网页给出了以下mysql错误。

 Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given

这个怎么解决???

4

2 回答 2

0

更新是因为来自 Jason McCreary 的评论准备好的语句更安全,但在绑定值时总是强制类型。但是您仍然需要注意二阶 SQL 注入,即使您使用准备好的语句,它们仍然是可能的

Id 应该是一个整数,只需将其转换为一个 int 并过滤掉 NULL 字节,NULL 字节也是邪恶的东西

$id = (int)(str_replace("\0", "", $_GET['id']));
于 2013-08-31T17:51:16.120 回答
0
$id =mysql_real_escape_string (htmlentities($_GET['id']));
$sql = "SELECT * FROM `site_products` WHERE `id` = $id LIMIT 1";

这是一个常见的误用mysql_real_escape_string()。该函数仅用于转义 MySQL 查询的单引号字符串。单引号(撇号)应始终围绕返回值。为什么htmlentities()在这里?

将值转换为整数(例如 $id = (int)$_GET['id'];,具有仅保留数字 0-9 的效果),或在转义值周围加上单引号,或者更好的是,切换到mysqliPDO准备好的语句。

另请参阅:如何防止 PHP 中的 SQL 注入?

于 2013-08-31T17:54:38.190 回答