一、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();