PHP简单的反sql注入机制


PHP simple anti-sql-injection mechanisms?

可能重复:
停止PHP 中SQL注入的最佳方法

当通过PHP使用MySQL数据库时,我想要一种简单的方法来验证SQL注入的可能性(即确保$_POST中用户提供的名称不包含SQL子查询(。

我所寻找的不一定是工业实力或牢不可破的(尽管无可否认这会很好(——这或多或少是一个个人项目来教会自己一些东西。

那么,在PHP中有没有一种标准的、有点简单的方法可以做到这一点呢?(我想肯定有(。我知道我可以运行一堆手工制作的正则表达式来检查PHP提供的字符串中的SQL,但我不敢相信这是最好的方法!

将准备好的查询与PDO一起使用。阅读关于它们的php.net文档。

http://php.net/manual/en/book.pdo.php

http://www.php.net/manual/en/pdo.prepared-statements.php

几种测试规则:

  1. 如果需要数字,请检查is_numeric()(或is_string()is_array()is_object()等(
  2. 在输入和文本区域使用mysql_real_escape_string()
  3. 此外,请使用Sanitize过滤器

尝试mysql_real_escape_string()

确保$_POST中用户提供的名称不包含sql子查询

这是绝对错误的做法。

  1. 它没有任何帮助,因为注入不受子查询的限制
  2. 它可能会对真实的数据发出错误的警报
  3. 这是无用的,因为还有其他机制,常规机制,使注射不可能
  4. 更不用说第二层注射了

验证的整个想法毫无意义。

用于保存任何数据的数据库,没有任何限制。为什么要限制自己?

那么,在PHP中有没有一种标准的、有点简单的方法可以做到这一点呢?

当然

但仅在创建查询方面,而不是在验证输入方面
下面是一组非常简单的规则

只要所有可变部分都通过进行查询

  • 一些占位符-一个代理,一个表示实际数据的变量(并假设占位符处理得当(
  • 或者从一些白名单中选择,代码中的一组可能值硬编码-

可以肯定的是,不可能进行注射。