如何防范SQL注入绕过_设置深度安全策略拦截特殊符号

夜晨姑娘_7808

夜晨姑娘_7808

2026-04-14

361人浏览

原创

典型绕过手法包括空格替代(%09、/**/)、单引号绕过(char(39)、0x27)、关键词混淆(大小写、内联注释)、大小写差异利用及编码变形;单纯过滤特殊符号无效,因数据库支持多样的字符串构造与解析逻辑;唯一可靠防御是preparedstatement预编译。

如何防范sql注入绕过_设置深度安全策略拦截特殊符号

SQL注入绕过 WHERE 条件的典型手法有哪些

攻击者常利用空格、注释符、编码变形绕过基础过滤,比如把 1 OR 1=1 改成 1%0aOR%0a1%3D1(换行+URL编码),或用 /**/ 替代空格,使正则匹配失效。更隐蔽的是用内联注释 /*!50000SELECT*/ 触发MySQL特定版本解析,绕过只检测 SELECT 字面量的规则。

  • 空格被过滤时,用 %09(Tab)、%0a(LF)、/**/、+ 替代
  • 单引号被拦截,尝试用 CHAR(39)、0x27 或双引号(若后端未统一转义)
  • 关键词如 UNION 被关键词黑名单拦截,可用大小写混写 UnIoN、内联注释 /*!UNION*/、或嵌套括号 (UNION)
  • 某些WAF对 information_schema 敏感,但放行 INFORMATION_SCHEMA(大小写差异)或别名 schema

为什么单纯过滤特殊符号根本防不住SQL注入

靠正则删掉 '、--、/* 这类“危险字符”是无效的——现代数据库支持多种字符串拼接、编码、函数调用方式,不依赖单引号也能构造有效payload。例如 PostgreSQL 中 CHR(39)||'admin'||CHR(39) 可动态生成带引号的字符串;MySQL 的 CONCAT(0x27,'admin',0x27) 同理。过滤层在应用层,而SQL解析在数据库层,二者语义不一致,必然存在gap。

  • 过滤发生在请求解析后,但数据库会先做编码解码、变量展开、预处理语句绑定,顺序错位
  • 不同数据库对空白符、注释、大小写的处理逻辑不同,一套正则无法覆盖 MySQL/PostgreSQL/SQL Server 全部行为
  • 前端JS校验、Nginx mod_security 规则、甚至WAF都可能被绕过,因为它们看不到参数实际进入SQL时的上下文

PreparedStatement 是唯一可靠的防御手段

所有语言的标准数据库驱动都提供预编译接口,它把SQL结构和数据彻底分离:查询模板由数据库服务端预解析并缓存执行计划,参数值以二进制协议传入,绝不会参与SQL语法分析。这意味着哪怕你传入 admin' OR '1'='1,数据库也只把它当一个字符串字面量,不可能改变原有WHERE逻辑。

悠船
悠船

悠船是一款AI图像与设计工具,Midjourney 官方推出的中文版 AI 图像生成工具。

下载
  • Java 必须用 Connection.prepareStatement() + setString(),禁用 Statement.execute() 拼接
  • Python 的 sqlite3、psycopg2、pymysql 都要求使用 %s 占位符(不是字符串格式化!),如 cursor.execute("SELECT * FROM user WHERE name = %s", [name])
  • PHP 的 PDO::prepare() 和 mysqli_prepare() 同理,严禁用 mysql_real_escape_string()(已废弃且不安全)
  • Node.js 的 pg、mysql2 库默认启用预处理,但需确认配置项 prepare: true 已开启(尤其连接池场景)

深度策略该拦什么、不该拦什么

如果必须加WAF或网关层规则(比如遗留系统无法改代码),重点应放在**异常流量模式识别**,而非字符黑名单。例如连续5次响应体含 mysql_fetch 错误、同一IP在1秒内发起10+含 UNION SELECT 的请求、或URL参数长度突增到2KB以上且含大量嵌套括号——这些比拦 ; 有用得多。

  • 允许 SELECT、WHERE 等关键词出现,但对连续出现多个SQL子句(如 UNION SELECT ... FROM ... WHERE)做频率限速
  • 记录并告警非常规编码组合:如参数中同时含 %25(%编码)和 0x 十六进制字面量
  • 禁止 information_schema.tables 这类元数据表名出现在非管理员接口,但不要拦 schema 字样(可能是业务字段名)
  • 对 ORDER BY 后的参数必须强制类型转换为整数,防止注入 1, (SELECT password FROM user)

真正难处理的是那些需要动态拼接SQL的场景,比如多条件搜索、权限字段白名单控制。这时候没有银弹——要么引入表达式AST解析器做安全重写,要么把拼接逻辑收归DBA审核的存储过程中,而不是丢给应用层自由发挥。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

sql注入

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

3963

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

851

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1029

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

5821

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2743

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

5800

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

7701

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1050

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

912

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP开发基础之数据库篇(PDO)
PHP开发基础之数据库篇(PDO)

共10课时 | 2.3万人学习