避免参数内传入查询中的 SQL 注入

问题描述 投票:0回答:1

`嗨, 我有一个程序将在参数中接收查询,我正在程序内运行传入查询,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 函数但没有解决`

oracle plsql sql-injection checkmarx
1个回答
0
投票

SQL 注入是你正在做的事情。您可以接受它或重新构建您的代码,但不要假装它没有发生。

拥抱 SQL 注入(小心)

如果您正在编写通用 SQL 执行工具,例如 Oracle SQL Developer 仿制品或 dbfiddle.uk 等网站,那么您需要承认自己正在执行 SQL 注入。如果是这种情况,那么您的问题无法通过简单的

DBMS_ASSERT
或“清理数据库输入”来解决,就像著名的 XKCD 漫画所暗示的那样。

您需要通过仔细的权限审查、DDOS 保护(例如使用资源管理器来避免正则表达式攻击)以及可能其他我无法想到的事情来彻底隔离和保护数据库用户。在代码中添加一些“危险”注释,以便未来的开发人员了解风险并留意安全错误。让代码经过多次同行评审。

在走这条路之前,不要尝试像“只允许以 SELECT 开头的语句”这样简单的事情。有许多偷偷摸摸的方法可以更改 SELECT 语句并更改数据库。即使读错了也可能很危险,所以无论如何你都需要考虑特权。

或者,至少,如果您发誓您可以信任所有有权访问仅供内部使用的应用程序的人,请仔细记录所有内容并张贴大型警告标志,以确保没有人将您的用户界面暴露在外部。

最后,您可以更改 CheckMarx 以排除这种不可避免的不合规代码。几乎每个安全规则都有例外。

重新架构(最有可能的解决方案)

正如 Bill Karwin 所建议的,几乎所有程序都使用预先批准的 SQL 语句,其中未知值作为绑定变量插入。在不太可能但并非极其罕见的情况下,您需要使表名称动态化,那么您可以使用

DBMS_SQL

 来检查一个简单的输入。或者,正如 Paul W 所建议的,您根本不需要存储过程吗? (但不要只是将 SQL 注入推入前端。)您的存储过程添加了哪些类型的处理和通用逻辑?它可以通过数据库功能(例如视图或虚拟专用数据库)来处理吗?

© www.soinside.com 2019 - 2024. All rights reserved.