我一直在查看一系列主题,但还没有找到任何有用的东西 - 或许它确实如此,但我对PHP / MySQL很新,所以也许我只是遗漏了一些东西。
我有一个页面,允许用户输入项目名称以在(MySQL)数据库中查找。然后它生成一个结果表并显示它们,并将一些数据转换为链接。然后将链接的术语用作查询以搜索数据库的其他字段。
一切正常......除非其中一个搜索词包含撇号。显然我想防止注入问题,但我还需要用撇号进行搜索。这是我的代码:
$query = mysql_real_escape_string($query);
$query = htmlspecialchars($query);
$queryentered = $query;
$query = strtolower($query);
这是传递给查询的URL:
echo " from <a href='index.php?volume=".$results2['book']."' class='where'>"
.$results2['book']."</a>";
查询:
$raw_results = mysql_query("SELECT * FROM $database1 WHERE $wh LIKE '%$query%'
ORDER BY displayname") or die(mysql_error());
我编码的权利是什么?当我运行搜索时,它会显示“找不到[搜索词]的结果”,其中我得到的是任何撇号。
答案 0 :(得分:2)
此代码段的顺序错误:
$query = mysql_real_escape_string($query);
$query = htmlspecialchars($query);
$queryentered = $query;
$query = strtolower($query);
应该在数据库查询字符串连接之前的最后一次执行转义。在这种情况下,它无关紧要,因为strtolower不会撤消转义。更严重的是HTML转义,它不属于SQL上下文。不要覆盖主变量,而是:
$queryentered = htmlspecialchars($query);
$query = strtolower($query);
$query = mysql_real_escape_string($query);
繁琐的数据库转义,顺便说一下,很容易避免。查看PDO and prepared statements。
答案 1 :(得分:1)
我强烈建议使用预准备语句和PDO库。
您所要做的就是编写查询,然后准备一个连接字符串(包含数据库类型和详细信息),然后触发查询。随查询一起发送一系列参数,以解耦数据。
有用的链接:
http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/
答案 2 :(得分:1)
问题在于这一行:
$query = htmlspecialchars($query);
如果您搜索Death's book
,您的最终$query
将是death\'s book
!
删除htmlspecialchars
您的查询就可以了!