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