怎样在Oracle数据库中利用DBMS_ASSERT防止SQL注入?

落伟大大_5154

落伟大大_5154

2026-09-07

308人浏览

原创

dbms_assert不能防止sql注入,仅辅助校验元数据输入合法性;simple_sql_name校验简单标识符,qualified_sql_name校验schema.table格式,enquote_name和noop无防护作用,业务值必须用绑定变量。

怎样在oracle数据库中利用dbms_assert防止sql注入?

DBMS_ASSERT 不能防止 SQL 注入,它只能辅助校验元数据类输入是否合法;用错函数、放错位置或混用于业务值,反而会制造虚假安全感。

DBMS_ASSERT.SIMPLE_SQL_NAME 只适合校验列名、别名

这个函数检查字符串是否为合法的简单 SQL 标识符:只含字母、数字、_、$、#,长度 ≤ 30,且不是 Oracle 保留字。它不接受空格、点号、ASC/DESC 等任何修饰。

  • ✅ 正确用法:safe_col := DBMS_ASSERT.SIMPLE_SQL_NAME('user_name');
  • ❌ 错误用法:DBMS_ASSERT.SIMPLE_SQL_NAME('user_name ASC') —— 空格和排序方向会直接触发 ORA-44003: invalid SQL name
  • ⚠️ 注意:它返回原值,不转义、不加引号;拼接前仍需手动加双引号(如需)或确保上下文安全

DBMS_ASSERT.QUALIFIED_SQL_NAME 用于 schema.table 形式校验

适用于需要动态指定 schema 和表名的场景,但每个段落仍要满足 SIMPLE_SQL_NAME 规则,且中间只能用单个点号分隔。

Crypto Sniper Oracle
Crypto Sniper Oracle

机构级量化市场预言机,提供订单簿失衡(OBI)、VWAP分析、自动化报告及Telegram预警。

下载
  • ✅ 正确:DBMS_ASSERT.QUALIFIED_SQL_NAME('hr.employees')
  • ❌ 错误:DBMS_ASSERT.QUALIFIED_SQL_NAME('hr."emp loyees"') —— 含空格和双引号,非法
  • ❌ 错误:DBMS_ASSERT.QUALIFIED_SQL_NAME('hr.employees; DROP TABLE logs --') —— 分号和注释符虽被拦在语法层,但若输入绕过校验(如通过 Unicode 零宽字符),QUALIFIED_SQL_NAME 不做内容语义判断

千万别用 DBMS_ASSERT.ENQUOTE_NAME 或 NOOP 做防护

ENQUOTE_NAME 只是给字符串加双引号并转义内部双引号,**完全不校验合法性**;NOOP 则是“什么都不做”,纯属调试陷阱。

  • ❌ 危险写法:EXECUTE IMMEDIATE 'SELECT * FROM ' || DBMS_ASSERT.ENQUOTE_NAME(p_table) —— 输入 "employees"; TRUNCATE TABLE audit_log 会被原样拼进语句并执行
  • ❌ 生产中不该出现:DBMS_ASSERT.NOOP(p_input) —— 它等于没校验,还让人误以为加了防护
  • ⚠️ 关键区别:ENQUOTE_NAME 返回带双引号的字符串,而 SIMPLE_SQL_NAME 返回无引号的干净标识符,后者更适合后续拼接控制

DBMS_ASSERT 对 WHERE 条件值完全无效

用户提交的搜索关键词、密码、邮箱、ID 等业务字段值,**一律不能走 DBMS_ASSERT**。它不处理单引号、Unicode 绕过、宽字节截断,也无法替代类型隔离。

  • ❌ 典型误用:DBMS_ASSERT.SIMPLE_SQL_NAME(p_password) —— 密码含特殊字符必然报错,且即使通过也毫无防护意义
  • ✅ 唯一正确路径:这些值必须进绑定变量,例如 EXECUTE IMMEDIATE 'SELECT * FROM users WHERE email = :e' USING p_email;
  • ⚠️ 容易被忽略的点:哪怕你对 p_email 做了正则过滤或 REPLACE(p_email, '''', ''''''),Oracle 仍会在运行时把拼出的字符串当完整 SQL 解析——攻击者用 U+FF07(全角单引号)就能绕过

相关专题

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

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

2023.10.12

3943

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

5801

10

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

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

2024.03.06

2723

4

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

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

2024.04.07

5780

11

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

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

2024.04.29

7641

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

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程