我希望用户能够输入查询限制。作为 mysql 语法的一部分,LIMIT
它不能有引号,并且可以有数字和逗号。这样做很容易:
preg_replace(/[^\d,]/, '', $request->post('limit'))
...但是,这是不安全的,因为卫生不是在 DB 级别完成的。
清理非参数查询的输入(例如列名、限制数量等)的正确方法是什么?
我希望用户能够输入查询限制。作为 mysql 语法的一部分,LIMIT
它不能有引号,并且可以有数字和逗号。这样做很容易:
preg_replace(/[^\d,]/, '', $request->post('limit'))
...但是,这是不安全的,因为卫生不是在 DB 级别完成的。
清理非参数查询的输入(例如列名、限制数量等)的正确方法是什么?
只有一种 100% 安全的方法来处理进入查询但不是参数的用户提供的输入:将您想要接受的输入列入白名单。
对于LIMIT
和类似的数字量,您可以简单地将参数转换为int
. 对于列名,唯一明智的做法是检查该名称是否完全等于数据库中的列名之一。
如您所见,整个问题的表述都不正确,因为没有单一的方法可以“清理”所有不同的查询部分。这才是重点。大多数人(包括 PHP 扩展的作者)不理解不同的查询部分需要不同的格式。格式化是另一个关键词
。因为没有“清理”——实际上没有什么需要清理的,而是SQL 语法所需的非常简单的规则。尽管所有注入都是必需的,但只是作为语法规则。然而,只要您的所有查询部分格式正确,您也可以安全地防止注入,就像副作用一样
很少有人得出结论,标准占位符应该扩展到几种不同的类型。
因此,在我的班级中,我目前有 5 个:3 个用于文字(字符串、整数、标识符),2 个用于进入 IN 和 SET 运算符的复杂数据集。