热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

如何在PL/SQL中动态调用包方法列表

如何解决《如何在PL/SQL中动态调用包方法列表》经验,为你挑选了1个好方法。

我有一种情况,我想从具有不同参数的游标执行动态获取的方法。Get_Parameter_Value___(head_rec_.objkey,parameter_);如下面的示例所示,这些参数值在循环中被替换(使用)为值。

PROCEDURE Dynamic_exe(
    keyvalue_ IN VARCHAR2)
IS 
param_str_        VARCHAR2(2000);
temp_param_str_   VARCHAR2(2000);
method_stmt_      VARCHAR2(100);

CURSOR get_method IS
  SELECT exe_method
  FROM method_tab

BEGIN

param_str_        := Substr(rec_.exe_method,Instr(rec_.exe_method,'(')+1,(Instr(rec_.exe_method,')')-1)-Instr(rec_.exe_method,'('));
temp_param_str_   := param_str_;
method_stmt_      := rec_.exe_method;

WHILE temp_param_str_ IS NOT NULL LOOP
   IF (Instr(temp_param_str_,',') > 0 )THEN                
       parameter_          := trim(Substr(temp_param_str_,1,Instr(temp_param_str_,',')-1));
       temp_param_str_     := Substr(temp_param_str_,Instr(temp_param_str_,',')+1);
   ELSE
      parameter_          := trim(temp_param_str_);
      temp_param_str_     := NULL;
   END IF;
   parameter_value_  := Get_Parameter_Value___(head_rec_.objkey,parameter_);            
   method_stmt_      := REPLACE(method_stmt_,parameter_,''''||parameter_value_||'''');
END LOOP; 

FOR rec_ IN get_method LOOP
   EXECUTE IMMEDIATE 'BEGIN '||method_stmt_||'; END;';
END LOOP;

END Dynamic_exe;

这是不安全的,可以为此执行SQL注入,我需要一个与绑定变量关联的解决方案,有人对此有解决方案吗?



1> Jon Heller..:

您可以通过使用DBMS_ASSERT.SQL_OBJECT_NAME保护方法名称以及使用DBMS_SQL和绑定变量保护参数来消除SQL注入的可能性。

DBMS_ASSERT.SQL_OBJECT_NAME如果该值与现有对象不同,则抛出错误。(尽管对于程序包,它仅检查程序包名称是否存在,而不检查过程名称。但是,过程名称必须仍然是实际名称。)

例如,如果包名称存在,该函数将简单地返回名称:

SQL> select dbms_assert.SQL_OBJECT_NAME('test_package.test_procedure') name from dual;

NAME
--------------------------------------------------------------------------------
test_package.test_procedure

但是任何SQL注入恶作剧都会引发异常(您可以在必要时捕获并处理):

SQL> select dbms_assert.sql_object_name('; delete from employees;') from dual;
select dbms_assert.sql_object_name('; delete from employees;') from dual
       *
ERROR at line 1:
ORA-44002: invalid object name
ORA-06512: at "SYS.DBMS_ASSERT", line 401

而不是将整个语句构建为字符串,而是添加:bind_variable_nDBMS_SQL运行它。

因此,最终的字符串将如下所示(在循环中添加绑定变量编号):

method_stmt_ := 'begin '||method_name||'(:1, :2); end;';

执行动态数量的绑定变量require DBMS_SQL.BIND_VARIABLE。从本地动态SQL切换DBMS_SQL到恼人的过程,但这将使您传递绑定变量而无需担心注入。


推荐阅读
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 使用C#开发SQL Server存储过程的指南
    本文介绍如何利用C#在SQL Server中创建存储过程,涵盖背景、步骤和应用场景,旨在帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • 网易严选Java开发面试:MySQL索引深度解析
    本文详细记录了网易严选Java开发岗位的面试经验,特别针对MySQL索引相关的技术问题进行了深入探讨。通过本文,读者可以了解面试官常问的索引问题及其背后的原理。 ... [详细]
  • 探索电路与系统的起源与发展
    本文回顾了电路与系统的发展历程,从电的早期发现到现代电子器件的应用。文章不仅涵盖了基础理论和关键发明,还探讨了这一学科对计算机、人工智能及物联网等领域的深远影响。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 尽管某些细分市场如WAN优化表现不佳,但全球运营商路由器和交换机市场持续增长。根据最新研究,该市场预计在2023年达到202亿美元的规模。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • 题库来源:安全生产模拟考试一点通公众号小程序G3锅炉水处理报名考试是安全生产模拟考试一点通生成的,G3锅炉水处理证模拟考试题库是根据G3锅炉水处理最新 ... [详细]
  • 为了深入了解辽源市市民对智能城市建设的感受和建议,国家统计局辽源调查队近期开展了一项针对200位市民的问卷调查。结果显示,大部分市民对智能城市的认知度较高,并对其带来的便利表示肯定。 ... [详细]
author-avatar
860800156_64d713
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有