1

如果您有复杂的、用户指定的 WHERE 子句并且您想使用 PDO 和 MySQL,那么最佳实践是什么?

我的用户需要能够为他们正在查询的表的一个或多个列指定一个或多个选择标准。在 PHP 端的 case 语句中有太多可能的组合无法预料。另一方面,允许他们直接输入标准会破坏参数化查询应该提供的针对 SQL 注入攻击的保护。

我正在尝试完全按照这个人所做的事情:

如何使用多个 WHERE 子句执行 MySQL 查询?

...除了我想成为一个优秀的小 codemonkey 并使用 PDO 而不是 php_mysql,并且不依赖字符串清理,除非这真的是人们在这种情况下所做的。

哦,还有一件事:

我想我可以将每个用户提供的标准作为一个[column, operator, value]数组(例如[ "age", ">", "30" ])传递。我可以验证该数组的前两个元素分别与有效的列名和运算符名完全匹配,将最后一个元素强制为一个数字,然后将它们附加到 PHP 脚本中包含 WHERE 子句的字符串中。但是像这样的标准["fullname","like","M_rty M%cFly"]呢?现在我又开始清理用户创建的字符串了,不是吗?

4

1 回答 1

2

但是像这样的标准["fullname","like","M_rty M%cFly"]呢?

对于列名和运算符(包括LIKE),使用白名单来验证它们。如果用户输入与已知的有效选择不匹配,请不要使用该输入。

对于任何文字字符串值,例如“M_rty M%cFly”,使用查询参数。数字或日期文字相同。查询参数最适合在 SQL 表达式中应被视为文字值的任何动态内容。

对值使用查询参数,对其他情况使用白名单。

于 2012-12-13T23:25:09.800 回答