这是防止动态sql alter user query中sql注入的好方法:
BEGIN
z_ident := DBMS_ASSERT.ENQUOTE_NAME(ident);
z_pass := DBMS_ASSERT.ENQUOTE_NAME(password);
z_sql := 'alter user ' || z_ident || ' identified by ' || z_pass;
EXECUTE IMMEDIATE z_sql;
END;
因为,有时您可以使用“字符”生成随机密码,当您执行以下操作时:
SELECT DBMS_ASSERT.ENQUOTE_NAME('"asd') FROM DUAL;
你得到一个ORA-06512 / ORA-06502例外 .
1 回答
您不应该尝试仅在数据库级别上阻止SQL注入 . 一旦他们到达那里,他们大多已经找到了你 . 您应该使用参数,屏蔽输入并删除上面图层中已有的不良字符 . 像Entity Framework这样的工具(框架?)会自动删除危险的字符 .
使用
DBMS_ASSERT.ENQUOTE_NAME
在这里做得很好,但我建议在上面的层中也这样做 .一般规则(您在此处遵循): Use security mechanisms that are established and proven, don't reinvent them!
而且,一个声明就好
绝对合法,没有危险 .
你如何调用数据库中的函数/过程?那里你也很难受,不是吗?