怎样防御利用注释符--或#进行的SQL注入_配置数据库解析器忽略异常注释

浅磊姑娘_7423

浅磊姑娘_7423

2026-05-19

1010人浏览

原创

数据库不提供禁用--或#注释的配置,因它们是sql标准语法;防御关键在应用层拼接前使用参数化查询,白名单校验动态字段,并过滤%23、%09等绕过编码。

怎样防御利用注释符--或#进行的sql注入_配置数据库解析器忽略异常注释

数据库解析器本身不会“忽略异常注释”——它严格按SQL标准解析,而--和#是合法注释语法。所谓“防御注释符注入”,本质是阻止用户输入被拼进SQL语句后形成有效注释,从而截断原有逻辑。

为什么不能靠数据库配置禁用--或#

MySQL、PostgreSQL等主流数据库不提供“关闭注释支持”的开关。--和#是SQL标准的一部分,禁用它们会导致大量合法SQL(如开发注释、运维脚本)执行失败。WAF或应用层过滤也难彻底拦截:URL中#会被浏览器截断,需用%23编码;--后面必须跟空格才生效,但攻击者可插%09(制表符)绕过空格检测。

真正有效的拦截点在应用层拼接前

注释符只有在用户输入被直接拼进SQL字符串时才有危害。防御必须卡在拼接动作发生之前:

Text Mark
Text Mark

一款面向文本内容处理的AI助手,可辅助用户整理、改写和分析文字信息,适用于日常写作和文本编辑等任务。

下载
  • 强制使用参数化查询:SELECT * FROM users WHERE name = ?,把--当普通字符串处理,不会触发注释行为
  • 若必须动态拼接(如ORDER BY字段),先白名单校验字段名,再拼接,绝不允许用户控制注释位置
  • 对LIKE等无法参数化的场景,用ESCAPE转义用户输入中的%、_,同时过滤--、#、%23、%09等编码变体

常见误判:以为过滤掉--就能防住

实际中,仅过滤--会漏掉多种绕过方式:

  • 用/**/替代空格+注释:UNION/**/SELECT → 数据库仍识别为UNION SELECT
  • 用%0a(换行符)代替空格:--%0aAND 1=1 → MySQL接受换行作为注释分隔符
  • 闭合引号后不依赖注释:' OR '1'='1' AND username='admin → 原语句末尾的AND password='xxx'因引号已闭合而失效,根本不用注释

Prisma、MyBatis等ORM的陷阱

这些框架默认安全,但留了危险出口:

  • Prisma的$queryRawUnsafe:传入的SQL字符串完全不校验,--和#照常生效
  • MyBatis的${}语法:直接字符串替换,WHERE name = '${name}'遇到admin' --就崩
  • Spring JDBC的update(String sql, Object... args):若sql含拼接变量,而非预编译占位符,同样失效

最易被忽略的是:**注释符不是攻击目标,而是攻击手段的副产品。真正的防线永远在SQL语句生成那一刻——你有没有让用户的输入变成代码,而不是数据。**

相关文章

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

4183

8

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

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

2023.10.27

891

4

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

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

2024.02.23

1089

5

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

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

2024.03.06

6081

10

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

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

2024.03.06

2943

4

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

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

2024.04.07

6040

11

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

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

2024.04.29

8121

6

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

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

2024.04.29

1110

5

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

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

2024.04.29

972

5

热门下载

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

精品课程

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

共10课时 | 2.3万人学习