我创建了一个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;
您也应该对其他参数进行类似的映射和验证.