当前位置: 首页
数据库
遗留系统SQL注入高危漏洞修复方案

遗留系统SQL注入高危漏洞修复方案

热心网友 时间:2026-07-09
转载

针对遗留系统SQL注入漏洞,参数化查询是唯一可靠解法。数字型参数需强制类型转换,字符型需改用预处理语句。ORDERBY和LIMIT无法参数化,需依赖白名单和数值范围限制。WAF规则仅应急,不能替代代码修复,需重点排查隐式拼接点。修复后需用手工payload和日志验证效果。

SQL注入在遗留系统里怎么修?不是“能不能”,而是“怎么修才不崩”

说实话,SQL注入这个问题在遗留系统里,早就不是“能不能修”的层面了——真正头疼的是“怎么修才不崩业务、不漏死角”。参数化查询是唯一可靠的解法,其他手段要么是临时止血,要么就是掩耳盗铃。下面直接上干货。


最危险的:直接改 mysql_query()mysqli_query() 的拼接逻辑

很多老PHP系统还在用 mysql_query("SELECT * FROM user WHERE id = " . $_GET['id']) 这种写法。别想着加个 addslashes()mysql_real_escape_string() 就能高枕无忧——GBK宽字节、多层编码、反斜杠后跟特殊字节,随手就能绕过。更糟的是,mysql_* 函数早就被PHP弃用了,运行时警告都可能引发兼容性问题。

实操建议:

  • 逐个定位所有 mysql_query()mysqli_query()(未用预处理)、pg_query()(未用 pg_query_params())的调用点,优先从登录、搜索、详情页这些高频入口开始排查。
  • 数字型参数(比如 id=123),先强制转成 (int)filter_var($id, FILTER_VALIDATE_INT),再拼进SQL——这能挡住大部分基础注入,但仅限纯数字场景。
  • 字符型参数(比如 name=xxx),必须改写成 mysqli_prepare() + bind_param(),不能只换函数名,要拆出SQL模板和变量分离。

ORDER BYLIMIT 子句没法参数化,只能靠白名单

这是遗留系统里最常被忽略的盲区。举个例子:$sql = "SELECT * FROM news ORDER BY " . $_GET['sort'] . " DESC LIMIT " . $_GET['limit'] ——ORDER BY 后面不能用占位符,数据库会直接报错;LIMIT 的值也不能简单用 ? 绑定(MySQL允许,但PostgreSQL不行,部分旧驱动也不支持)。

实操建议:

  • sort 参数只允许从固定数组里取值:$allowed_sorts = ['title', 'created_at', 'view_count']; if (!in_array($_GET['sort'], $allowed_sorts)) die('invalid sort');
  • limit 参数用 min(max((int)$_GET['limit'], 10), 100) 限定范围,避免传入负数或极值导致全表扫描。
  • 不要用正则去“过滤 ;--#”,攻击者可以用内联注释 /**/ 或换行绕过,白名单才是最彻底的方案。

WAF规则只能应急,别指望它替代代码修复

上线一条 SecRule ARGS "@rx (union\s+select|sleep(|'or'\d+=')" 的ModSecurity规则,确实能挡住sqlmap扫出来的90%流量。但真实攻击者早就不走这些明面路径了:十六进制编码、JSON body里的payload、sort=IF(1=1,username,1) 这种布尔盲注,WAF根本不会匹配。

实操建议:

  • 把WAF日志里“被放行但含 %27%3B%20OR%20”的请求全部导出,按参数名分组——出现频次最高的参数,就是代码里最该优先修的拼接点。
  • 禁用WAF的“严格模式”,否则用户昵称 O'Connor、订单号 ORD-2024-AND-001 会被误杀,引发客诉。
  • 确认WAF开启了 SecRequestBodyAccess On 并配置了JSON解析器,否则 {"q":"admin' OR 1=1--"} 这类POST请求永远进不到检测逻辑里。

修复后必须验证是否真生效,不是看页面还能打开就完事

改完代码跑一遍单元测试,页面没报错 ≠ 漏洞已修复。攻击者不需要看到报错,只要能通过响应时间差(sleep(5))、布尔条件(id=1 AND 1=1 vs id=1 AND 1=2)或报错信息里的字段名,就能确认注入点是否存活。

实操建议:

  • 用手工payload验证:访问 /user?id=1 AND 1=1/user?id=1 AND 1=2,对比HTTP状态码、响应体长度、响应时间。
  • 检查数据库慢查询日志,确认是否还有带用户输入的原始字符串出现在 WHEREORDER BY 中。
  • 对每个修复点,额外测一次编码绕过:/user?id=1%2527%20OR%201%3D1(双重URL编码),确保过滤或绑定逻辑在解码后仍有效。

真正难的不是写对那几行 prepare()bind_param(),而是找出所有隐式拼接点——比如日志记录函数里悄悄把 $_SERVER['REQUEST_URI'] 写进了SQL,或者某个ORM封装层底层还是用字符串拼接生成SQL。这些地方,不翻源码、不抓包、不查日志,永远看不见。

来源:https://www.php.cn/faq/2784629.html

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
如何配置Oracle可恢复空间分配以防止任务中断

如何配置Oracle可恢复空间分配以防止任务中断

启用可恢复空间分配需将RESUMABLE_TIMEOUT设为非零值(如3600秒),RAC环境需逐节点单独设置。该机制仅对ORA-01536等空间类错误生效,挂起期间事务锁定状态不变,超时自动中止。会话级启用需显式指定timeout和name,否则可能无效。

时间:2026-07-09 07:09
Redis集群升级配置文件不兼容 对照新旧参数手册转换

Redis集群升级配置文件不兼容 对照新旧参数手册转换

升级至Redis7 0配置不兼容须知:主从复制命令由slaveof改为replicaof否则报错;集群全量覆盖参数默认开启需改为关闭;TCP连接积压参数需与系统内核一致;访问控制列表默认用户无管理权限需授权;节点配置文件禁止手动编辑,应通过命令管理。

时间:2026-07-09 07:09
Oracle 19c补丁冲突问题修复方法详细步骤使用opatch apply命令

Oracle 19c补丁冲突问题修复方法详细步骤使用opatch apply命令

Oracle19c补丁冲突因新旧补丁修复重叠或文件冲突所致。需先确认OPatch版本、inventory一致性及执行用户正确性,再通过opatchprereq定位具体冲突。真实冲突可回退旧补丁或改用完整RU流程,RAC环境需逐节点检查inventory。

时间:2026-07-09 07:08
MySQL修改权限后为何必须执行FLUSH PRIVILEGES?

MySQL修改权限后为何必须执行FLUSH PRIVILEGES?

MySQL修改权限后是否执行FLUSHPRIVILEGES取决于修改方式。通过GRANT或ALTERUSER标准命令自动同步,无需手动刷新;直接UPDATEmysql user表则必须执行以刷新内存缓存。已存在连接不重载,需注意host匹配、认证插件兼容性及RELOAD权限。

时间:2026-07-09 07:08
SQL嵌套查询在电商订单报表中的应用实践

SQL嵌套查询在电商订单报表中的应用实践

SQL嵌套查询在电商订单报表中适用于条件筛选,如快速圈定用户范围,但不适合替代关联分析。使用时需注意子查询空值导致IN失效、必须返回单列、MySQL5 7不支持LATERAL及CTE。聚合分析应依赖聚合加过滤,深层嵌套可用派生表或CTE分步处理。

时间:2026-07-09 07:08
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 热门数据榜