讲师中心 微信公众号
AI工具推荐 视频效率加速

如何防止SQL注入_绑定变量在动态PL/SQL中的安全实践

雨墨同学_9660

雨墨同学_9660

发布时间:2026-04-17 08:51:17

|

375人浏览过

|

来源于php中文网

原创

动态SQL中必须用绑定变量而非字符串拼接来防止SQL注入,所有外部输入需校验;EXECUTE IMMEDIATE要求绑定变量位置、数量、类型严格匹配;DBMS_SQL更灵活但易出错,95%场景用EXECUTE IMMEDIATE即可;权限需按调用者或定义者明确配置,避免隐式越权。

动态SQL里用 EXECUTE IMMEDIATE 时,为什么不能拼字符串

因为拼接用户输入的字符串(比如 'select * from users where name = ''' || user_input || '''')会让恶意输入直接进入执行计划,数据库不区分“代码”和“数据”。一旦 user_input 是 ' or 1=1 --,整条语句就变成 select * from users where name = '' or 1=1 --',条件失效,全表泄露。

常见错误现象:ORA-00900: invalid SQL statement 或查出不该查的数据,但更危险的是查不出错、却悄悄越权。

  • 所有来自外部(HTTP参数、表单、文件读取)的值,一律不参与字符串拼接
  • 哪怕只是拼表名或列名,也要走白名单校验或 DBMS_ASSERT,不能靠正则“大概过滤”
  • EXECUTE IMMEDIATE 后面的 SQL 字符串必须是静态字面量或由可信变量组成(如配置常量)

绑定变量在 EXECUTE IMMEDIATE 中怎么写才生效

绑定变量不是“加个冒号”就行——位置、数量、类型、顺序都得严丝合缝。Oracle 不会自动推导类型,:x 在语句里出现几次,就要传几个值;传了 3 个值但语句里只有 2 个 :x,直接报 ORA-01008: not all variables bound。

使用场景:增删改查任意 DML,包括带 RETURNING 的语句。

  • 用命名绑定(:name)比位置绑定(:1)更安全,避免顺序错位
  • 输入值类型要和目标列兼容,比如给 NUMBER 列传字符串,Oracle 可能隐式转换失败,建议显式 TO_NUMBER() 或用对应类型的变量接收
  • USING 子句只支持输入参数;输出要用 INTO 或 RETURNING INTO,且变量必须已声明

示例:

EXECUTE IMMEDIATE 'UPDATE emp SET salary = :sal WHERE id = :id' USING v_new_sal, v_emp_id;

DBMS_SQL 和 EXECUTE IMMEDIATE 绑定行为有啥实际差别

DBMS_SQL 更底层,适合极动态场景(比如列名、WHERE 条件数完全不确定),但它要手动开游标、定义列、绑定、执行、关游标,出错点更多;EXECUTE IMMEDIATE 简洁,但要求 SQL 结构相对固定。

性能影响:简单语句用 EXECUTE IMMEDIATE 快得多,因为硬解析少;DBMS_SQL 每次都走完整解析流程,还容易因未关闭游标导致 ORA-01000: maximum open cursors exceeded。

  • 95% 的动态需求用 EXECUTE IMMEDIATE + 绑定变量就够了,别为“看起来更灵活”选 DBMS_SQL
  • 如果真要用 DBMS_SQL,必须用 DBMS_SQL.CLOSE_CURSOR 显式关闭,不能依赖异常处理自动清理
  • DBMS_SQL.BIND_VARIABLE 对 CLOB / BLOB 支持有限,大文本优先走 EXECUTE IMMEDIATE + USING

存储过程中调用动态SQL,权限和定义者权限怎么不踩坑

动态 SQL 的执行权限在运行时检查,不是编译时。如果过程用 DEFINER'S RIGHTS(默认),它以拥有者身份执行,可能绕过调用者的对象权限;但若用 INVOKER'S RIGHTS,又可能因调用者没权限而失败——这不是绑定变量问题,但会掩盖注入漏洞。

常见错误现象:测试环境跑通,上线后报 ORA-00942: table or view does not exist,其实是权限模型没对齐。

  • 不要在动态 SQL 里硬编码用户名或 schema 名(如 'SELECT * FROM scott.emp'),用 USER 或参数传入 schema,并校验是否在白名单中
  • 如果过程必须访问其他用户的表,显式授予 SELECT 权限,而不是靠 DEFINER'S RIGHTS 隐式越权
  • 绑定变量本身不解决权限问题,但它让权限检查聚焦在“谁有权执行这条语句”,而不是“谁拼出了这条语句”

真正难的不是写对绑定语法,而是把“哪些值算外部输入”想全——比如从另一张配置表里查出来的字段名、从 UTL_HTTP 读的 JSON 字段、甚至系统时间格式化后的字符串,只要没经过可信源验证,就得当潜在注入点对待。

热门AI工具

更多
音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

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

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

4423

2023.10.12

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

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

931

2023.10.27

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

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

1169

2024.02.23

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

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

6361

2024.03.06

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

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

3163

2024.03.06

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

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

6320

2024.04.07

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

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

8621

2024.04.29

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

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

1170

2024.04.29

Playwright 测试失败怎么办
Playwright 测试失败怎么办

Playwright测试失败专题汇集超时、定位器匹配、浏览器提前关闭、依赖与插件配置、文件上传、SSL及Docker启动等故障文章,并介绍通过截图、报告和Trace定位错误。

20

2026.10.21

热门下载

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

精品课程

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

共10课时 | 2.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn