如果我传递一个where子句作为参数将阻止SQL注入?

我创建了一个Oracle proc,我根据提供给proc的参数创建了一个动态sql语句.

我做了一些测试,似乎我无法执行sql注入.

还有什么我应该安全防范的吗?

SELECT 'UPDATE ' || p_table || ' SET MY_FIELD =  ''' || p_Value || ''' ' || p_Where
            INTO query_string
            FROM DUAL; 

编辑:

Scenarios that I've tried.
1. WHERE SOME_VAL IN ('AAA','BBB') - This works
2. WHERE SOME_VAL IN ('AAA','BBB') OR SOME_VAL2 = '123' - This works.
3. WHERE SOME_VAL IN ('AAA','BBB'); DROP TABLE TEST_TABLE; - This errors out.
4. WHERE SOME_VAL IN ('AAA','BBB') OR (DELETE FROM TEST_TABLE) - This errors out.

最佳答案 这取决于您的过程的调用方式和方式.通常,您需要担心SQL注入对于生产中对大量用户开放的内容.对于任何数据库过程都不应该这样.如果大量用户可以访问您的数据库过程,那么您可能会被某人恶意使用.

在您的情况下,您可以通过创建参数映射来隐藏实际架构对象名称和一些验证来降低此风险.

例如,将参数p_table更改为table_name作为输入参数.然后使用case语句映射到实际的表名.我在这里给你一个表名的例子,因为你应该真正限制谁可以从db访问哪个表.

CREATE OR REPLACE PROCEDURE test_proc(table_name IN VARCHAR)
  IS
  p_table varchar2(100);
BEGIN

  CASE table_name 
     WHEN 'A' THEN p_table:='db_table_a';
     WHEN 'B' THEN p_table:='db_table_b';
     ELSE RAISE 'Invalid table name parameter';
  END CASE;
  SELECT 'UPDATE ' || p_table || ' SET MY_FIELD =  ''' || p_Value || ''' ' 
         || p_Where
        INTO query_string
        FROM DUAL; 
END;

您也应该对其他参数进行类似的映射和验证.

点赞