一、SQL 注入是什么?
定义:
SQL注入是指攻击者通过向网站输入框中插入恶意SQL语句,从而绕过身份验证、获取敏感数据,甚至控制整个数据库的攻击方式。
三个必要条件(必须全满足才可能被注入):
| 条件 | 说明 |
|---|---|
| ✅ 网站使用数据库 | 比如 MySQL、PostgreSQL 等 |
| ✅ 用户输入被拼接到 SQL 中 | 即:没有使用参数化预处理 |
| ✅ 没有对输入进行安全过滤 | 比如:没有转义特殊字符 |
二、SQL 注入的基础防御手段
魔术引号(Magic Quotes)
作用:
自动为输入中的 '、"、\ 和 NULL 添加反斜线 \,起到初级转义防护作用。
配置方式:
-
修改
php.ini配置文件:magic_quotes_gpc = Off # 推荐关闭 -
参数说明:
参数名 作用 magic_quotes_gpc控制对 GET/POST/COOKIE 的自动转义 magic_quotes_runtime控制运行时数据的转义 magic_quotes_sybaseSybase 风格转义(将 '转换为'')
弊端与风险:
-
会误转义用户传入的合法路径(如
/var/www/html) -
已被 PHP 6 及以后版本移除
-
绕过方式多,不建议依赖
推荐做法:
-
关闭 magic_quotes
-
使用更严格的手动转义或参数化
类型判断函数(小白防御推荐)
基本思想:
限制用户输入只能是期望的数据类型,从源头上阻断注入。
常用函数:
| 函数名 | 作用 |
|---|---|
is_int() | 判断是否为整数(不适用于表单) |
is_numeric() | 判断字符串是否为数字(更实用) |
(int) | 强制类型转换 |
addslashes() | 添加转义字符 |
mysql_real_escape_string() | MySQL专用防注入函数 |
示例代码:
$id = $_GET['id'];
if (is_numeric($id))
{ $id = (int)$id; // 强制转为整数
$sql = "SELECT * FROM users WHERE id = $id"; }
else { die("非法输入!"); }
易错点:
-
表单数据默认都是字符串,不能直接用 is_int()
-
强制类型转换要搭配验证使用,避免绕过
关键词过滤函数(中等有效)
常用方法:
使用 str_replace() 函数过滤输入中的危险关键词。
示例:
$id = $_GET['id'];
$id = str_replace("select", "fuck", $id);
常见过滤关键词:
select、insert、update、delete、union、sleep、benchmark 等
缺点:
-
容易被大小写绕过:
SeLeCt -
可用注释符分割绕过:
un/**/ion
建议:
-
不建议单独使用
-
可作为 多层防御的一环
文件路径防注入
相关操作(写 shell / 读 config)会依赖文件路径:
-
路径必须用单引号括起
-
禁止使用
0x编码路径(如 INTO OUTFILE 不支持) -
Windows:用
\\或/ -
Linux:用
/(推荐)
实例错误:
'id=d:/d.txt' // 被魔术引号变成 'd:/d.txt' 导致失败
✅ 正确处理方法:
-
关闭 magic_quotes
-
使用单引号括路径,严控输入格式
WAF 等商业安全软件(最终补充防御)
| 软件名称 | 功能说明 |
|---|---|
| 宝塔防火墙 | 拦截 Web 攻击请求 |
| 安全狗 | 提供 SQL 注入等多种防护机制 |
| 云锁 | Web服务器加固 |
不能代替开发层面安全,属于 事后防御
2万+

被折叠的 条评论
为什么被折叠?



