出自SW-X框架官方文档

1、什么是SQL注入

在通常情况下,作为一名专业的开发者,我们都应该假设所有用户经过浏览器提交到PHP的任何数据都是不安全的。
如果这些用户把SQL语句混插在POST或者GET请求中,提交给PHP处理,就能够达到欺骗服务器执行恶意的SQL命令、例如删除数据,非法查询他人数据等。
例如一个简单的登录表单:
image.png
当在表单中填写这样的语句进行提交登录时,就有可能会构成这样的SQL语句:

  1. select * from user where name='xxx' and password='xxx'' or '1'

这样就会查询出所有的用户信息,所以存在不安全的隐患

2、手把手教学之二,实现SQL注入过滤函数封装

在SQL注入的攻防战中,前辈们已经总结出了几套有效的方案,分别是:

  1. 1、过滤用户所提交数据中的SQL关键字
  2. 2、对一些预定义字符前面添加反斜杠
  3. 3、使用面向对象中的PDO数据库操作,进行参数预绑定

在上面的方案中,第3种是最安全无漏洞的,但这属于之后的课程才会接触到的知识点。
而在面向过程中,我们可以结合第1/2种方法,编写一个最基本的SQL过滤函数。

  1. <?php
  2. /**
  3. * SQL注入过滤
  4. * @param string $string : 需要过滤的字符串
  5. * @return string 返回过滤之后的字符串
  6. */
  7. function JunSql($string) {
  8. $source = 'or|and|xor|not|select|insert|update|delete|=>|<=|!=|=|%|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile';
  9. $badword = explode('|',$source);
  10. $badword1 = array_combine($badword,array_fill(0,count($badword),'/'));
  11. $string = strtr($string, $badword1);
  12. $string = addslashes($string);
  13. return $string;
  14. }

值得注意的是,我们以上的代码只是起到一个抛砖引玉的作用,这只是很基本的过滤关键词方法,正则过滤还能更进一步的优化,因为过滤完整的SQL语句关键词是远远不够的,SQL注入灵活性强,不但能GET注入、POST注入,还能COOKIE中转注入,除此之外,还能利用PHP的注释来打碎关键词重组,所以说关键词过滤的正则规则优化空间还很大。