`嗨, 我有一个程序将在参数中接收查询,我正在程序内运行传入查询,Checkmarx 工具检测 my_cursor 中的 SQL 注入。如何解决这个问题,我尝试引入dbms_assert.noop函数但没有用
`create procedure test(common_query in varchar2)
as
sql_qry varchar2(2000);
Type cursor_type is ref cursor;
my_cursor cursor_type;
begin
sql_qry:= common_query;
open my_cursor for sql_qry;
fetch my_cursor into :name;
close my_cursor ;
end;`
我尝试引入 dbms_assert.noop 函数但没有解决`
SQL 注入是你正在做的事情。您可以接受它或重新构建您的代码,但不要假装它没有发生。
如果您正在编写通用 SQL 执行工具,例如 Oracle SQL Developer 仿制品或 dbfiddle.uk 等网站,那么您需要承认自己正在执行 SQL 注入。如果是这种情况,那么您的问题无法通过简单的
DBMS_ASSERT
或“清理数据库输入”来解决,就像著名的 XKCD 漫画所暗示的那样。
您需要通过仔细的权限审查、DDOS 保护(例如使用资源管理器来避免正则表达式攻击)以及可能其他我无法想到的事情来彻底隔离和保护数据库用户。在代码中添加一些“危险”注释,以便未来的开发人员了解风险并留意安全错误。让代码经过多次同行评审。
在走这条路之前,不要尝试像“只允许以 SELECT 开头的语句”这样简单的事情。有许多偷偷摸摸的方法可以更改 SELECT 语句并更改数据库。即使读错了也可能很危险,所以无论如何你都需要考虑特权。
或者,至少,如果您发誓您可以信任所有有权访问仅供内部使用的应用程序的人,请仔细记录所有内容并张贴大型警告标志,以确保没有人将您的用户界面暴露在外部。最后,您可以更改 CheckMarx 以排除这种不可避免的不合规代码。几乎每个安全规则都有例外。
重新架构(最有可能的解决方案)
DBMS_SQL
来检查一个简单的输入。或者,正如 Paul W 所建议的,您根本不需要存储过程吗? (但不要只是将 SQL 注入推入前端。)您的存储过程添加了哪些类型的处理和通用逻辑?它可以通过数据库功能(例如视图或虚拟专用数据库)来处理吗?