SQL注入

SQL注入指的是攻击者篡改程序中的SQL语句,在管理员不知情的情况下实现非法操作,以此来欺骗数据库服务执行非授权的任意查询语句,从而进一步得到响应的数据信息。

SQL注入最常出现在“会员登陆”功能中。

例如:
某用户在网站中执行登录操作时,程序将会执行如下SQL语句:
select * from 用户表 where username=’用户名’ and password=’密码’
当用户输入正确的用户名密码时,该语句就会查询到相应记录,则会表示会员登陆成功。

  1. //正常情况下:
  2. select * from user where username='张三' and password='123456';
  3. //非法登录操作
  4. select * from user where username='' or 1=1;#' and password='';

有漏洞的代码是致命的,为了防止SQL注入的发生,最简单的办法就是使用预处理语句。

PDO预处理

使用预处理语句可以确保不会发生SQL注入的问题。在PDO中,可以使用prerare(),方法来实现预处理语句,返回值是PDOStatement实例。

  1. PDOStatement PDO::prepare( String sql )
  1. <?php
  2. header("content-type:text/html;charset=utf-8");
  3. $userName = "张三";
  4. $password = "123456";
  5. //连接数据库
  6. $url = "mysql:host=127.0.0.1;dbname=cai";
  7. $user = "root";
  8. $pwd = "123";
  9. $conn = new PDO($url,$user,$pwd);
  10. //预处理
  11. $st = $conn->prepare("select * from user where username=? and password=?");
  12. //问号?:SQL 语句中的问号,表示占位符,后面将会为其绑定具体的参数值。
  13. $st->bindParam(1,$userName);
  14. $st->bindParam(2,$password);
  15. $st->execute();
  16. //通过 execute() 方法,执行预处理语句。
  17. //数字1:表示 SQL 语句中的第 1 个占位符,也就是 username 字段的值。
  18. //$userName:将 $userName 变量值,绑定到 SQL 语句中的第 1 个占位符。
  19. //获得结果集
  20. $rs = $st->fetch();
  21. echo "<pre>";
  22. var_dump($rs);
  23. echo "</pre>";