在具有复杂的,用户指定的复杂WHERE子句并且您想要使用PDO和MySQL的场景中,最佳做法是什么?
我的用户需要能够为他们查询的表的一列或多列指定一个或多个选择条件。在PHP端的case语句中有太多可能的组合来预测。另一方面,允许他们直接输入他们的标准会破坏保护参数化查询应该提供的针对SQL注入攻击的保护。
我正在努力做到这个人做的事情:
How can execute a MySQL query with multiple WHERE-clauses?
...除了我试图成为一个好的小代码键并使用PDO而不是php_mysql,并且不依赖于字符串清理,除非这真的是人们为这种情况所做的事情。
哦,还有一件事:
我想我可以将每个用户提供的标准作为[column, operator, value]
数组传递(例如[ "age", ">", "30" ]
)。我可以验证该数组的前两个元素是否分别与有效的列名和运算符名完全匹配,将最后一个元素强制转换为数字,然后将它们附加到PHP脚本中包含WHERE子句的字符串中。但是像["fullname","like","M_rty M%cFly"]
这样的标准呢?现在我回到消毒用户创建的字符串,不是吗?
答案 0 :(得分:2)
但是像
["fullname","like","M_rty M%cFly"]
这样的标准呢?
对于列名称和运算符(包括LIKE
),请使用白名单来验证它们。如果用户输入与已知的有效选择不匹配,请不要使用该输入。
对于任何文字字符串值,例如“M_rty M%cFly”,请使用查询参数。数字或日期文字相同。查询参数最适用于任何应被视为SQL表达式中的文字值的动态内容。
对值使用查询参数,对其他情况使用白名单。