!!!防止sql注入

一、SQL注入简介

    SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库。

二、SQL注入攻击的总体思路

1.寻找到SQL注入的位置

2.判断服务器类型和后台数据库类型

3.针对不通的服务器和数据库特点进行SQL注入攻击

三、PHP mysqli扩展之预处理

1.简单介绍

在mysqli操作中常常涉及三个类:mysqli类  MySQL_STMT类   MySQL_RESULT类(即mysql_query生成的对象)

预处理:预处理是一种重要的防止sql注入的手段 对提高网站安全有重要意义

               主要是利用 MySQL_STMT类 完成的        

2.详细了解预处理

a.预处理:创建sql语句模板并发送到数据库,预留的值使用参数“?”标记

例:

insert into MyGuests(firstname,lastname,emial)values(???);

b.数据库解析 编译 对数据库进行查询优化 并存储结果不输出 

c.执行:最后将应用绑定的值传递给参数("?"标记),数据库执行语句

d.获得MySQL_STMT对象 一定要记住传$sql 预处理是对sql语句的预处理

例:

$mysqli_stmt = $mysqli->prepare($sql);


$sql = "insert test values(??)"; 用?代替参数

四、解决办法

1.可以使用转义来防止  即数据处理

!!!重点须知

使用参数化的sql或者直接使用存储过程进行数据查询存取

永远不要使用管理员权限的数据连接 为每个应用使用单独的权限有效连接

应加密或者hash掉密码和敏感信息

最好使用自定义的错误信息对原始错误进行包装

$user = htmlspecialchars(addslashes(trim($user)));
$pwd  = htmlspecialchars(addslashes(trim($pwd)));
$yzm  = htmlspecialchars(addslashes(trim($yzm)));
$yzm  = md5(yzm);

2.使用参数化sql 用?代替变量 即预处理

例:

 $sql= "select * from `user` where user=? and pwd=?";
 if($stmt = $conn->prepare($sql)){
 	$stmt -> bind_param("ss",$user,$pwd);
 	$stmt-> execute();
 	$stmt->store_result();
 	if($stmt->num_rows==0){
 		show_error('输入的用户名或密码错误');
 	}
 	$stmt->close();
 }
 $conn->close(); 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值