如何清理查询?
问题描述:
我有我想这个消毒SQL查询:如何清理查询?
SELECT * FROM navigation_$cat ORDER BY parent ASC, prio ASC
的问题是,我不能得到$猫越快,因为它正在通过AJAX发送,并指出需要访问的数据库。我如何创建比简单地将字符串放在一起更安全的PDO语句?
答
您可以实现一个白名单,但另一种选择将是检查使用有效输入:
SHOW TABLES LIKE :tblname
和'navigation_'.$cat
作为参数。检查它是否只返回一个表,并且返回的表完全匹配传递的参数。
一旦完成,您就知道注入查询是安全的,因为您已经确定它确实是一个有效的表名。
这就是说,“从未知事件表中动态选择”通常表明您正在设计数据库时出错,并且您应该只有一个navigation
表,其中包含category
列。
+0
感谢您的提示!我其实已经有了一张分类表,我只是觉得我可以跳过这一点。现在更改我的代码,以便正常工作。谢谢! – smiet
'$ cat'从哪里来? – BenM
[我不相信你可以使用PDO参数化表名。](https://*.com/q/11312737/2191572)你可以/应该为'$ cat'建立一个可接受的值的白名单,并检查'$ cat'在构建查询字符串之前位于白名单中。 – MonkeyZeus
检查$ cat是否在期望值列表中 –