0

我希望用户能够输入查询限制。作为 mysql 语法的一部分,LIMIT它不能有引号,并且可以有数字和逗号。这样做很容易:

preg_replace(/[^\d,]/, '', $request->post('limit'))

...但是,这是不安全的,因为卫生不是在 DB 级别完成的。

清理非参数查询的输入(例如列名、限制数量等)的正确方法是什么?

4

2 回答 2

0

只有一种 100% 安全的方法来处理进入查询但不是参数的用户提供的输入:将您想要接受的输入列入白名单。

对于LIMIT和类似的数字量,您可以简单地将参数转换为int. 对于列名,唯一明智的做法是检查该名称是否完全等于数据库中的列名之一。

于 2013-01-26T16:33:40.387 回答
0
  1. LIMIT 数量是完全可参数化的。如果您的 PDO 在它们上失败 - 只需关闭仿真
  2. 对于标识符 - 唉!- PDO 没有解决方案。手动格式化它们,用反引号括起来并将这些反引号加倍
  3. 对于关键字白名单是唯一的解决方案。

如您所见,整个问题的表述都不正确,因为没有单一的方法可以“清理”所有不同的查询部分。这才是重点。大多数人(包括 PHP 扩展的作者)不理解不同的查询部分需要不同的格式。格式化是另一个关键词
。因为没有“清理”——实际上没有什么需要清理的,而是SQL 语法所需的非常简单的规则。尽管所有注入都是必需的,但只是作为语法规则。然而,只要您的所有查询部分格式正确,您也可以安全地防止注入,就像副作用一样

很少有人得出结论,标准占位符应该扩展到几种不同的类型。
因此,在我的班级中,我目前有 5 个:3 个用于文字(字符串、整数、标识符),2 个用于进入 IN 和 SET 运算符的复杂数据集。

于 2013-01-26T17:10:45.920 回答