正确的方法来消毒非参数输入

时间:2013-01-26 16:30:05

标签: php mysql prepared-statement

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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

对于LIMIT和类似的数字量,您只需将参数转换为int即可。对于列名,唯一明智的做法是检查名称是否与数据库中的一个列名完全相同。

答案 1 :(得分:0)

  1. LIMIT金额完全可参数化。如果您的PDO失败了 - 只需关闭仿真
  2. 对于标识符 - 唉! - PDO没有解决方案。通过将反引号括起来并将这些反引号加倍
  3. ,手动格式化它们
  4. 对于关键字,白名单是唯一的解决方案。
  5. 正如您所看到的,整个问题的描述不正确,因为没有单一的方法来“清理”所有不同的查询部分。这才是重点。大多数人(包括PHP扩展的作者)不理解不同的查询部分需要不同的格式 格式化是另一个关键词。因为没有“消毒” - 实际上没有什么可以消毒,而是 SQL语法所需的非常简单的规则。尽管进行了所有注射,但仍然需要作为语法规则。然而,只要你的所有查询部分都经过适当格式化,你就可以安全地防止注射,就像副作用一样

    很少有人得出结论,标准占位符应该扩展到几种不同的类型 所以,在我的课上我现在有5个:文字(字符串,整数,标识符)3个,复杂数据集2个进入IN和SET操作符。