2017-08-09 40 views
0

我有我想这个消毒SQL查询:如何清理查询?

SELECT * FROM navigation_$cat ORDER BY parent ASC, prio ASC 

的问题是,我不能得到$猫越快,因为它正在通过AJAX发送,并指出需要访问的数据库。我如何创建比简单地将字符串放在一起更安全的PDO语句?

+0

'$ cat'从哪里来? – BenM

+4

[我不相信你可以使用PDO参数化表名。](https://stackoverflow.com/q/11312737/2191572)你可以/应该为'$ cat'建立一个可接受的值的白名单,并检查'​​$ cat'在构建查询字符串之前位于白名单中。 – MonkeyZeus

+1

检查$ cat是否在期望值列表中 –

回答

2

您可以实现一个白名单,但另一种选择将是检查使用有效输入:

SHOW TABLES LIKE :tblname 

'navigation_'.$cat作为参数。检查它是否只返回一个表,并且返回的表完全匹配传递的参数。

一旦完成,您就知道注入查询是安全的,因为您已经确定它确实是一个有效的表名。

这就是说,“从未知事件表中动态选择”通常表明您正在设计数据库时出错,并且您应该只有一个navigation表,其中包含category列。

+0

感谢您的提示!我其实已经有了一张分类表,我只是觉得我可以跳过这一点。现在更改我的代码,以便正常工作。谢谢! – smiet