PHP 之 pdo防止Sql注入

sql 注入 

直接 SQL 命令注入就是攻击者常用的一种创建或修改已有 SQL 语句的技术,从而达到取得隐藏数据,或覆盖关键的值,甚至执行数据库主机操作系统命令的目的。这是通过应用程序取得用户输入并与静态参数组合成 SQL 查询来实现的。

  比如:在用户名输入框中输入:’or 1=1#,密码随便输入,这时候的合成后的SQL查询语句为:

      select * from `表名` where username='' or 1=1#' and password=md5('')

  语义分析:“#”在mysql中是注释符,这样井号后面的内容将被mysql视为注释内容,这样就不会去执行!

 sql语句等价:   

        select * from 表名 where username='' or 1=1#' and password=md5('')
  等价于    select * from users where username='' or 1=1
  因为1=1永远都是成立的,即where子句总是为真,将该sql进一步简化之后,等价如下select语句:
      select * from `表名`;

  该sql语句的作用是检索表中的所有字段;

下面重点介绍下  pdo中 防止MySQL的注入

$dbh = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');  
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);  

setAttribute()这一行是强制性的,它会告诉 PDO 禁用模拟预处理语句,并使用 real parepared statements 。这可以确保SQL语句和相应的值在传递到mysql服务器之前是不会被PHP解析的(禁止了所有可能的恶意SQL注入攻击)。虽然你可以配置文件中设置字符集的属性(charset=utf8),但是需要格外注意的是,老版本的 PHP( < 5.3.6)在DSN中是忽略字符参数的。

$dbh = new PDO("mysql:host=localhost; dbname=demo", "user", "pass");
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); //禁用prepared statements的仿真效果
$dbh->exec("set names 'utf8'");
$sql="select * from test where name = ? and password = ?";
$stmt = $dbh->prepare($sql);
$exeres = $stmt->execute(array($testname, $pass));
if ($exeres) {
 while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
     print_r($row);
 }
}
$dbh = null;
    
上面这段代码就可以防范sql注入。为什么呢?

当调用 prepare() 时,查询语句已经发送给了数据库服务器,此时只有占位符 ? 发送过去,没有用户提交的数据;
当调用到 execute()时,用户提交过来的值才会传送给数据库,他们是分开传送的,两者独立的,SQL攻击者没有一点机会。

但是我们需要注意的是以下几种情况,PDO并不能帮助你防范SQL注入

1、你不能让占位符 ? 代替一组值,如:
复制代码 代码如下:

SELECT * FROM blog WHERE userid IN ( ? );

2、你不能让占位符代替数据表名或列名,如:
复制代码 代码如下:

SELECT * FROM blog ORDER BY ?;

3、你不能让占位符 ? 代替任何其他SQL语法,如:
复制代码 代码如下:

SELECT EXTRACT( ? FROM datetime_column) AS variable_datetime_element FROM blog;


注意: 还有其他的方式:  这里只介绍着一种;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值