如果您有复杂的、用户指定的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"]这样的标准呢?现在我又开始清理用户创建的字符串了,不是吗?

最佳答案

但是像["fullname","like","M_rty M%cFly"]这样的标准呢?
对于列名和运算符(包括LIKE),使用白名单验证它们。如果用户输入与已知的有效选项不匹配,请不要使用该输入。
对于任何文本字符串值,例如“M_rtym%cFly”,请使用查询参数。数字或日期文本相同。查询参数最适合任何在SQL表达式中应被视为文本值的动态内容。
对值使用查询参数,对其他情况使用白名单。

10-01 06:58
查看更多