PHP开发中,POST方法接收的表单数据,需要经过哪些验证来避免SQL注入攻击

我谨从渗透测试的角度给出回答,而不是php开发者的角度——最好的方式是参数化查询,且一定不能返回错误结果,网上已经有现成的代码,或许可以直接拿来使用。屏蔽某些字符、检查到关键词后删除、限制长度都不是好方法,只要让攻击者发现了注入点,盲注、工具都会招呼上来猜解你的过滤规则
■网友
注入主要有两个方式,一个是通过包括单引号和饭斜杠在内的字符变更原SQL语义,另外一个则是在数值类型下不需要以上两个特殊字符就可以通过or或and等行为改变SQL语义,甚至是通过逗号中断原SQL并随后附带INSERT/UPDATE/DELETE等操作。后者又称为盲注(Blind Injection)。前者常见的解决方案是addslashes或mysql_escape_string,后者则需要对纯数值类型进行intval等操作或有效性判断等。彻底一点的解决办法是使用Prepared Stament,Mysqli和PDO均提供了这方面的支持,由于参数是由类负责格式化后传入的,也就不再存在这些漏洞了。原则上来说,不要信赖用户提交的数据,包括$_GET、$_POST、$_COOKIE等。
■网友
最简单的方式 mysql_real_escape_string参考 http://php.net/manual/en/function.mysql-real-escape-string.php里面评论部分有提到一些很好的方法例如最经典的id=数字这种注入点,评论有人提出把查询的变量md5之后再做查询这样参数里面那些额外的东西hash过之后都没有威力了我经常会test学校里面一些小站的注入点不过是asp居多,asp+access,现在已经养成一种习惯看见asp,看见数字id,就会在后面手贱的加个单引号试试
■网友
用prepare / bind方式提交参数就基本上可以解决问题,mysqli和pdo都支持这种特性
■网友
SQL注入跟输入有关么? 输入做好输入检查即可. 跟数据库打交道的话, mysql_escape_string()足矣.
■网友
1,输入字符集判断 如:UTF-8 preg_match(\u0026#39;/^./us\u0026#39;, $text) == 12,输入类型长度判断+类型转换 如:gettype,settype等3,输入过滤, 如:preg_replace(\u0026#39;//u\u0026#39;, \u0026#39;\u0026#39;, (string) $s)4,加双引号,如:mysql_escape_string()


    推荐阅读