SQL注入详解
2024-08-25 19:51:51
SQL是一种将SQL代码添加到输入参数中,传递到SQL服务器解析并执行的一种攻击手段
产生的原因
- web开发人员无法保证所有输入都已经安全过滤
- 攻击者利用发送给SQL服务器的输入数据,构造可执行的SQL代码
- 数据库未做相应的安全配置
从哪里寻找SQL注入的漏洞?
- 识别web应用中的所有输入点:GET,POST,Header信息
- 了解哪些类型的请求会触发异常:特殊字符
- 检查服务器响应中的异常:通过响应状态码判断,例如404可能是因为GET不到资源,500可能是SQL语句出错
如何进行SQL攻击
- 数字注入
例如where语句后面加 id=-1 OR 1=1 ,这使得查询条件永远为真
- 字符串注入
例如符号 # 和 -- 都会起到注释作用,SELECT * FROM user WHERE name = 'james '#' AND password = '123123...'这个语句在#符号后面的都被注释了,其实就只查询了name='james'而已,--符号同理
预防SQL注入
- 严格检查输入变量的类型和格式
根据id查询文章,一般要判断非空和非数字
if(empty($id) || is_int($id)){
die('查询错误');
}
正则过滤
if(empty($name) || !preg_match("/^[a-zA-Z0-9]{6,}$",$name)){
die('用户名格式错误');
}
- 过滤和转义特殊字符 addslashes() mysqli_real_escape_string()
- 利用mysql的预编译机制(参考手册)
$db = mysqli_connect('localhost',$username,$pwd,$database);
$sql = "SELECT id,name FROM user WHERE name = ? AND password = ?"; $stmt = mysqli_prepare($db,$sql);
mysqli_stmt_bind_param($stmt,'ss',$name,$password);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt,$id,$name);
mysqli_stmt_fetch($stmt);
最新文章
- 一个.NET通用JSON解析/构建类的实现(c#)转
- The Linux Storage Stack Diagram
- JS中setInterval、setTimeout不能传递带参数的函数的解决方案
- JSON 之 SuperObject(9): TSuperType
- 如何覆盖aar的资源
- lscpu lsblk lsscsi lspci
- [转] stat命令输出结果中, Access,Modify,Change的含义
- EF查询
- C#小性能知识
- 记NOIP分数出来前
- javascript 学习总结(四)Date对象
- PHP版本MS17-010检测小脚本
- Python3.6.3中,functools似乎不能用
- 1、初始Java应用程序
- 项目打成jar包
- Java的封装性、继承性和多态性
- 类加载器 ClassLoder详解
- Leetcode中字符串总结
- mysql函数的使用create function myfunction(...
- 深入理解HDFS的架构和原理