当前位置: 首页 > 知识库问答 >
问题:

OracleSQL注射块DBMS_ASSERT

拓拔烨赫
2023-03-14

代码正在触发错误

  query_string := 'SELECT '||dbms_assert.sql_object_name(trim(both ' ' from return_field))|| 
                   ' FROM '||dbms_assert.schema_name(trim(both ' ' from from_schema))||
                        '.'||dbms_assert.sql_object_name(trim(both ' ' from from_table))||  
                  ' WHERE '||dbms_assert.sql_object_name(key_field) || ' = '||key_value;



 EXECUTE IMMEDIATE query_string into return_result;

无效的sql对象。

从文档中我觉得表中的任何对象都是sql对象<这里怎么了?

在Oracle 10G中考虑以下函数

在10G上下文中考虑以下函数

    CREATE OR REPLACE FUNCTION scott.tab_lookup (key_field CHAR,
                                       key_value CHAR,
                                       from_schema CHAR,
                                       from_table CHAR,
                                       return_field CHAR,
                                       return_type CHAR)
    RETURN VARCHAR2 IS
    result_a varchar2(1000);
    query_string VARCHAR2(4000);

    /*version 0.5*/
    BEGIN

    query_string := 'SELECT '||dbms_assert.qualified_sql_name(trim(from_table||'.'||return_field))|| 
                       ' FROM '||dbms_assert.schema_name(trim(from_schema))||
                            '.'||dbms_assert.sql_object_name(trim(from_table))||  
                      ' WHERE '||dbms_assert.qualified_sql_name(from_table||'.'||key_field) || ' = '||key_value;

      IF(return_type = 'SQL') THEN
         result_a := query_string;
      ELSE
         EXECUTE IMMEDIATE query_string 
         --USING key_value  
         into result_a;
      END IF;

      RETURN (result_a);
    EXCEPTION 
    WHEN 
        NO_DATA_FOUND THEN 
           RETURN(NULL);
    WHEN
        TOO_MANY_ROWS THEN 
           RETURN('**ERR_DUPLICATE**');
    WHEN OTHERS
    THEN 
    /*
    ORA-44001   INVALID_SCHEMA_NAME 
    ORA-44002   INVALID_OBJECT_NAME
    ORA-44003   INVALID_SQL_NAME
    ORA-44004   INVALID_QUALIFIED_SQL_NAME
    */
        IF    SQLCODE = -44001 THEN 
              RETURN('*ERR_INVALID_SCHEMA*');
        ELSIF SQLCODE = -44002 THEN 
              RETURN('*ERR_INVALID_OBJECT*');
        ELSIF SQLCODE = -44003 THEN 
              RETURN('*ERR_INVALID_SQL_NAME*');
        ELSIF SQLCODE = -44004 THEN 
              RETURN('*ERR_INVALID_QALIFIED_SQLNAME*');
        end if;         
        return ('*ERR_'||sqlcode);
    END;
    /

我得到了一个错误的无效对象

--to get the Genrated SQL as Value  

    Select scott.tab_lookup('ID',1,'TEST','TEST_TABLE','TEST_DESC','SQL') from dual;

-- -or-

-- to get the value returned from database field

    Select scott.tab_lookup('ID',1,'TEST','TEST_TABLE','TEST_DESC','') from dual;

我的桌子就像


    TEST_TABLE  
    ====================
    ID   , TEST_DESC
    ====================
    '11' , 'TEST 1'
    '12' , 'TEST 5000'
    '13' , 'TEST INPUT VALUE'
    '14' , 'JUNK VALUE'
    '50' , 'TEST VALUE 50'

此表位于“测试”模式中,我与SCOTT有联系,SCOTT有“测试时授予选择权”。测试表到scott's

我还是会出错

ERR_INVALID_OBJECT

共有1个答案

郗缪文
2023-03-14
query_string := 'SELECT '||dbms_assert.qualified_sql_name(trim(from_schema||'.'||from_table||'.'||return_field))|| 
                   ' FROM '||dbms_assert.schema_name(trim(from_schema))||
                        '.'||dbms_assert.sql_object_name(trim(from_table))||  
                  ' WHERE '||dbms_assert.qualified_sql_name(from_schema||'.'||from_table||'.'||key_field) || ' = '||key_value;



 EXECUTE IMMEDIATE query_string into return_result;

从文档...

  • ENQUOTE_LITERAL-在字符串中加引号
  • ENQUOTE_NAME-用双q-uotes括起一个名称
  • NOOP-返回值而不进行任何检查
  • 限定的SQL名称-验证输入字符串是否为限定的SQL名称
  • SCHEMA_NAME-函数验证输入字符串是否为现有架构名称
  • SIMPLE_SQL_NAME-验证输入字符串是否为简单SQL名称
  • SQL\u对象\u名称-验证输入参数字符串是否是现有SQL对象的限定SQL标识符
 类似资料:
  • 只想确认Oracle SQL中需要转义哪些字符才能避免SQL注入?到目前为止,我只发现这篇文章似乎回答了我的问题:https://ss64.com/ora/syntax-escape.html.然而,正如我所听说的,amphora“@”字符也需要转义,因此,我认为上面的文章中有不完整的需要转义的字符列表。如果有人能告诉我Oracle SQL中需要转义的字符的完整列表,我将不胜感激。

  • 主要内容:1.概述,2. Reflector,3. ReflectorFactory,4. Invoker,5. ObjectFactory,6. Property 工具类,7. MetaClass,8.ParamNameResolver1.概述 Java 中的反射虽然功能强大,但对大多数开发人员来说,写出高质量的反射代码还是 有一定难度的。MyBatis 中专门提供了反射模块,该模块对 Java 原生的反射进行了良好的封装,提了更加简洁易用的 API,方便上层使调用,并且对反射操作进行了一系列

  • 本文向大家介绍racket 块注释,包括了racket 块注释的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 问题内容: 什么时候在方法开始时使用块注释,什么时候使用Javadoc风格的注释? 在Java样式指南的“注释”部分中,我发现了这一点: Java程序可以有两种注释:实现注释和文档注释。实现注释是在C ++中发现的,由,和// 分隔。文档注释(称为“文档注释”)仅适用于Java,并以分隔。可以使用javadoc工具将Doc注释提取到HTML文件中。 实现注释用于注释掉代码或有关特定实现的注释。Do

  • 问题内容: 我在与dropwizard的合作中是相当新的。目前,我正在尝试实施HK2依赖项注入。在资源内部可以很好地工作,但是在资源外部不能工作。这是我在做什么: 我创建要注入的类的实例并绑定它们。 在我的资源中,注入工作: 所有这些变量都填充有正确类的实例。 问题是:ContentModuleManager还应该通过注入来获取其中一些类: 但是这些都是空的。有人可以解释为什么这个问题会发生,我该

  • 我是Guice的新手,所以我试图理解AssistedInject。我有一个非常简单的项目: 我要注入的类: 带辅助注射的类别: 工厂 主类: 但它仍然不起作用,我不明白,我错在哪里?