PHP中怎么实现mysql防注入功能
创始人
2024-12-19 12:01:31
0次

1、什么是注入攻击

前端有个提交表格:

   姓名:    密码:      

后台的处理如下:

query($sql);  //rowCount()方法返回结果条数或者受影响的行数  if($stmt->rowCount()>0){ echo "登陆成功!"};

正常情况下,如果你输入姓名为小王,密码xiaowang,会登陆成功,sql语句如下:select * from login WHERE username='小王' AND password='xiaowang' 登陆成功!

但是如果你输入姓名为 ' or 1=1 #,密码随便输一个,也会登陆成功,sql语句为:select * from login WHERE username='' or 1=1 #' AND password='xiaowang' 登陆成功!

可以看到username='' or 1=1,#注释调了之后的password语句,由于 1=1恒成立,因此这条语句会返回大于1的结果集,从而使验证通过。

2、使用quote过滤特殊字符,防止注入

在sql语句前加上一行,将username变量中的‘等特殊字符过滤,可以起到防止注入的效果

//通过quote方法,返回带引号的字符串,过滤调特殊字符$username=$pdo->quote($username);$sql="select * from login WHERE username={$username} AND password='{$password}' ";echo $sql;$stmt=$pdo->query($sql);//rowCount()方法返回结果条数或者受影响的行数if($stmt->rowCount()>0){  echo "登陆成功!";};

sql语句为:select * from login WHERE username='\' or 1=1 #' AND password='xiaowang'

可以看到“'”被转义\',并且自动为变量$username加上了引号

3、通过预处理语句传递参数,防注入

//通过占位符:username,:password传递值,防止注入$sql="select * from login WHERE username=:username AND password=:password";$stmt=$pdo->prepare($sql);//通过statement对象执行查询语句,并以数组的形式赋值给查询语句中的占位符$stmt->execute(array(':username'=>$username,':password'=>$password));echo $stmt->rowCount();

其中的占位符也可以为?

//占位符为?$sql="select * from login WHERE username=? AND password=?";$stmt=$pdo->prepare($sql);//数组中参数的顺序与查询语句中问号的顺序必须相同$stmt->execute(array($username,$password));echo $stmt->rowCount();

4、通过bind绑定参数

bindParam()方法绑定一个变量到查询语句中的参数:

$sql="insert login(username,password,upic,mail) values(:username,:password,:age,:mail)";$stmt=$pdo->prepare($sql);//第三个参数可以指定参数的类型PDO::PARAM_STR为字符串,PDO::PARAM_INT为整型数$stmt->bindParam(":username",$username,PDO::PARAM_STR);$stmt->bindParam(":password",$password,PDO::PARAM_STR);$stmt->bindParam(":age",$age,PDO::PARAM_INT);//使用bindValue()方法绑定一个定值$stmt->bindValue(":mail",'default@qq.com');$stmt->execute();echo $stmt->rowCount();

使用问号做占位符:

$sql="insert login(username,password,mail) values(?,?,?)";//注意不是中文状态下的问号?$stmt=$pdo->prepare($sql); //按照?的顺序绑定参数值$stmt->bindParam(1,$username);$stmt->bindParam(2,$password);$stmt->bindValue(3,'default@qq.com');$stmt->execute();echo $stmt->rowCount();

使用其中bindValue()方法给第三个占位符绑定一个常量'default@qq.com',它不随变量的变化而变化。

bindColumn()方法绑定返回结果集的一列到变量:

$sql='SELECT * FROM user';$stmt=$pdo->prepare($sql);$stmt->execute();$stmt->bindColumn(2,$username);$stmt->bindColumn(4,$email);while($stmt->fetch(PDO::FETCH_BOUND)){  echo '用户名:'.$username.",邮箱:".$email.'


';}

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...