SQL注入
SQL注入指的是攻击者篡改程序中的SQL语句,在管理员不知情的情况下实现非法操作,以此来欺骗数据库服务执行非授权的任意查询语句,从而进一步得到响应的数据信息。
SQL注入最常出现在“会员登陆”功能中。
例如:
某用户在网站中执行登录操作时,程序将会执行如下SQL语句:
select * from 用户表 where username=’用户名’ and password=’密码’
当用户输入正确的用户名密码时,该语句就会查询到相应记录,则会表示会员登陆成功。
//正常情况下:
select * from user where username='张三' and password='123456';
//非法登录操作
select * from user where username='' or 1=1;#' and password='';
有漏洞的代码是致命的,为了防止SQL注入的发生,最简单的办法就是使用预处理语句。
PDO预处理
使用预处理语句可以确保不会发生SQL注入的问题。在PDO中,可以使用prerare(),方法来实现预处理语句,返回值是PDOStatement实例。
PDOStatement PDO::prepare( String sql )
<?php
header("content-type:text/html;charset=utf-8");
$userName = "张三";
$password = "123456";
//连接数据库
$url = "mysql:host=127.0.0.1;dbname=cai";
$user = "root";
$pwd = "123";
$conn = new PDO($url,$user,$pwd);
//预处理
$st = $conn->prepare("select * from user where username=? and password=?");
//问号?:SQL 语句中的问号,表示占位符,后面将会为其绑定具体的参数值。
$st->bindParam(1,$userName);
$st->bindParam(2,$password);
$st->execute();
//通过 execute() 方法,执行预处理语句。
//数字1:表示 SQL 语句中的第 1 个占位符,也就是 username 字段的值。
//$userName:将 $userName 变量值,绑定到 SQL 语句中的第 1 个占位符。
//获得结果集
$rs = $st->fetch();
echo "<pre>";
var_dump($rs);
echo "</pre>";