如何理解SQL注入
SQL注入是一种将SQL代码添加到输入参数中,传递到SQL服务器解析并执行的一种攻击手法。
输入参数未经过滤,直接拼接到SQL语句中直接执行,达到预想之外的效果
learn.ma/sql/index.php?id=1
select * from article where id =1;
learn.ma/sql/index.php?id=-1 OR 1=1
select * from article where id =-1 or 1=1;//(查到所有)
sql注入是如何产生的
- web开发人员无法保证所有的输入都已经过滤
- 攻击者利用发送SQL服务器的输入数据构造可执行的SQL代码
- 数据库未做相应的安全配置
如何寻找SQL注入漏洞
借助逻辑推理
- 识别web应用中所有输入点(get 、post 、请求头、 session、cookie)
- 了解各种请求异常(特殊字符构造异常)
- 检测服务器中的相应异常。(根据程序反馈的信息/500)
如何进行SQL注入攻击
- 数字注入 where条件 id=1 变化为 id=-1 or 1=1(
id必须为不存在的
) - 字符串注入 用户登录 用户名和密码
sql语句中注释字符'#
知道name,不知道密码 name 传 James’# (绕过了密码)
SQL语句中注释符 James'-- (--加空格 也是注释)
select * from user where user_name = ‘. u s e r n a m e . ′ a n d p a s s w o r d = ′ . username.' and password ='. username.′andpassword=′.password.’;
如何预防SQL注入
- 严格检查输入格式的类型和格式(数据强校验 id)
- 2.过滤或者转义特殊字符(登录的用户名
addslashes
函数,mysqli_real_escape_string($db,$username)
) - mysql预编译机制(?占位符)
$sql = " select * from user where user_name = ? and password = ?";
$stmt = mysqli_prepare($db,$sql);
mysqli_stmt_bind_param($stmt, 'ss',$username, $password);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt,$id,$username);
mysqli_stmt_fetch($stmt);