SQL注入--基础防御

一、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);
常见过滤关键词:

selectinsertupdatedeleteunionsleepbenchmark

缺点:
  • 容易被大小写绕过:SeLeCt

  • 可用注释符分割绕过:un/**/ion

建议:
  • 不建议单独使用

  • 可作为 多层防御的一环


文件路径防注入

相关操作(写 shell / 读 config)会依赖文件路径:
  • 路径必须用单引号括起

  • 禁止使用 0x 编码路径(如 INTO OUTFILE 不支持)

  • Windows:用 \\/

  • Linux:用 /(推荐)

实例错误:
'id=d:/d.txt' // 被魔术引号变成 'd:/d.txt' 导致失败
✅ 正确处理方法:
  • 关闭 magic_quotes

  • 使用单引号括路径,严控输入格式


WAF 等商业安全软件(最终补充防御)

软件名称功能说明
宝塔防火墙拦截 Web 攻击请求
安全狗提供 SQL 注入等多种防护机制
云锁Web服务器加固

不能代替开发层面安全,属于 事后防御

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值