可能重复:
停止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
几种测试规则:
- 如果需要数字,请检查
is_numeric()
(或is_string()
、is_array()
、is_object()
等( - 在输入和文本区域使用
mysql_real_escape_string()
- 此外,请使用Sanitize过滤器
尝试mysql_real_escape_string()
。
确保$_POST中用户提供的名称不包含sql子查询
这是绝对错误的做法。
- 它没有任何帮助,因为注入不受子查询的限制
- 它可能会对真实的数据发出错误的警报
- 这是无用的,因为还有其他机制,常规机制,使注射不可能
- 更不用说第二层注射了
验证的整个想法毫无意义。
用于保存任何数据的数据库,没有任何限制。为什么要限制自己?
那么,在PHP中有没有一种标准的、有点简单的方法可以做到这一点呢?
当然
但仅在创建查询方面,而不是在验证输入方面
下面是一组非常简单的规则
只要所有可变部分都通过进行查询
- 一些占位符-一个代理,一个表示实际数据的变量(并假设占位符处理得当(
- 或者从一些白名单中选择,代码中的一组可能值硬编码-
可以肯定的是,不可能进行注射。