php 使用PDO,防止sql注入 简单说明

举报
1_bit 发表于 2021/05/26 16:47:51 2021/05/26
2.9k+ 0 0
【摘要】 PDO:php5 假如以下是一个简单的登录处理: 使用PDO连接mysql首先: 新建数据库 new PDO("mysql:host=localhost;dbname=test","root","root");1 host:服务器 dbname:数据库名 后面两个分别是帐号和密码 默认不是长连接 如果想使用长连接需要在后面加入参数: new PDO(...

PDO:php5

假如以下是一个简单的登录处理:

使用PDO连接mysql首先:

新建数据库

new PDO("mysql:host=localhost;dbname=test","root","root");
  
 

host:服务器
dbname:数据库名
后面两个分别是帐号和密码
默认不是长连接

如果想使用长连接需要在后面加入参数:

new PDO("mysql:host=host;dbname=name","user","pw","array(PDO::ATTR_PERSISTENT => true) "); 
  
 

看如下简单示例,在这里是单独说明,所以我没有加其他的东西:

<?php //接收前端传过来的变量 $name=$_POST['username']; $pwd=$_POST['password']; //这里新建PDO连接,在这里我是本地测试的所以host我使用了localhost 数据库名为test,帐号为root密码也是root $stmt = new PDO("mysql:host=localhost;dbname=test","root","root"); //使用prepare进行预处理,其中:name和:pwd是我们等下要传入的变量值,这些都是占位符 $stmt = $stmt->prepare('SELECT * FROM user1 WHERE user1 = :name and pw1 = :pwd'); //以上的准备都做好了之后,我们使用execute()方法负责执行准备好的查询 //该方法需要有每次迭代执行中替换的输入参数,在这里就是:name和:pwd 作为数组将值传递给方法 //从而值替换掉其中占位符 //当然也可以使用bindParam,但是我还是喜欢这种简单的方式,毕竟人懒 $stmt->execute(array('name' => $name,'pwd'=>$pwd)); while ($row = $stmt->fetch()) { print_r($row); }

  
 

注释已经说明了要说的内容,最后面使用while输出查询到的值,这样就可以防止sql注入,如果不行,那么请自行测试,输入如:’ or 1=1#
我们看我们的’ or 1=1#,如果我们的name输入的是’ or 1=1#,注意 ’ or 1=1# 前面有一个单引号,那么如果我们的sql语句本是如下:

SELECT * FROM user1 WHERE user1='123' AND pw1='234'
  
 

把user1的值改为了 ’ or 1=1# 后。
变成了

SELECT * FROM user1 WHERE user1='' OR 1=1# and pw1='234'
  
 

其中由于sql中#代表:到此结束,那么说明后面的:and pw1=’234’都将无效,那么我们的sql语句就等于变成了如下语句:

SELECT * FROM user1 WHERE user1='' OR 1=1
  
 

由于1=1是肯定成立的,那么此句sql语句中的where条件将会永远正确,此时,语句变成或者说就等于了如下语句:

SELECT * FROM user1 WHERE TRUE
  
 

或者说:

SELECT * FROM user1
  
 

那么就会登录成功,绕过了此次登录。

文章来源: i1bit.blog.csdn.net,作者:A757291228,版权归原作者所有,如需转载,请联系作者。

原文链接:i1bit.blog.csdn.net/article/details/60476228

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。