很难解决sql注入php

很难解决sql注入php,php,mysql,sql,code-injection,Php,Mysql,Sql,Code Injection,下面的代码是我在单击图像缩略图时使用的,它是通过从数据库中获取它的“ID”来执行的 echo '<a class="thumbnail" href="view.php?id='.$row['id'] .'"">'; 并且该网页给出了以下mysql错误 Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given 如何解决这个问题?因为Jason McCreary的评论而更新 预处理

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

echo '<a class="thumbnail" href="view.php?id='.$row['id'] .'"">'; 
并且该网页给出了以下mysql错误

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

如何解决这个问题?

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

Id应该是一个整数,只要将其转换为int并过滤掉空字节,空字节也是有害的

$id = (int)(str_replace("\0", "", $_GET['id']));
这是对mysql\u real\u escape\u string()的常见误用。该函数仅用于转义MySQL查询的单引号字符串。单引号(撇号)应始终围绕返回值。为什么在这里

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


另请参见:

不要使用函数,从PHP5.5.0开始,函数就不推荐使用。使用或代替。正确使用prepared语句可以消除(或至少减少)SQL注入的机会。使用mysqli或PDO可以解决这个问题吗?我个人更喜欢PDO,我准备这样的语句:
$statement=$db->prepare(“SELECT*FROM site_products,其中id=:id LIMIT 1”)
(假设
$db
是我的PDO连接),然后以后像这样绑定它:
$statement->bindParam(“:id”,$id,PDO::PARAM_INT”)谢谢,我正在尝试一次,希望它能起作用..我会给你举个例子,等等。是的,这很有效,谢谢很多人,但是jst能告诉我如何过滤空字节吗?也许一个例子是gr8,再次感谢“\0”是空字节,因此您已经有了一个示例,可以删除它们。谢谢,我现在最好再进行一些wiki搜索。此代码没有任何意义,空字节只是一种类型的漏洞。对于所有将来的读者,不要使用此选项。请花点时间来研究一下。@Jason McCreary真正准备好的陈述也不是万能的。对于准备语句,二阶SQL注入仍然是可能的。在Web应用程序中,空字节是一种严肃的处理方法,我总是在使用stringsThnks之前删除它们。我将尝试使用mysqli或PDO。当您只执行一次查询时,准备语句会导致额外的开销。。安全是有代价的
 Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given
$id = (int)(str_replace("\0", "", $_GET['id']));
$id =mysql_real_escape_string (htmlentities($_GET['id']));
$sql = "SELECT * FROM `site_products` WHERE `id` = $id LIMIT 1";