Oracle GRANT:阻止 SQL 注入

Oracle GRANT: prevent SQL injection

提问人:berliner 提问时间:9/12/2021 更新时间:9/12/2021 访问量:154

问:

我正在使用 C# 中的 Oracle(Oracle Data Provider for .NET (ODP.NET) Core 包)。我需要动态创建用户、分配角色、权限等。其中一项任务是能够授予角色和授权。

问题是 - 在这种情况下如何防止 SQL 注入?我可以在选择、更新、删除中使用参数,但不能在这里使用它们。

例如,当我创建用户时,我使用 sys 在 Oracle 中验证它的名称。DBMS_ASSERT.simple_sql_name。我可以在这里进行相同的验证吗?如果不是,会采取什么方法?

C# Oracle SQL 注入

评论

2赞 astentx 9/12/2021
我认为断言可能还不够。您要处理哪种类型的 SQL 注入?授予/撤销/创建用户已是特权操作。如果要防止除 grant/revoke/create user 以外的任何命令,则不要授予任何其他权限。如果要限制受影响的用户列表(例如,仅从您的应用程序创建的用户),则可以通过 filter by bind 变量检索它们,然后执行操作。select
2赞 pmdba 9/12/2021
此外,不要直接从 C# 执行 grant/revoke/create SQL,而是构建 PL/SQL 存储过程以使用带有绑定变量的动态 SQL 执行实际命令,然后从 C# 调用存储过程。这样一来,就不可能在混音中注入任何额外的内容,也不可能更改执行特权操作的代码。您可以完全控制用户的创建和配置方式。
0赞 berliner 9/13/2021
@pmdba我认为使用存储过程的方法会有所帮助。你介意发布一些例子作为答案吗?我们有一个 API 来获取 Oracle 角色,还有另一个 API 将角色作为参数并将其分配给用户。从理论上讲,可以发布任何东西。所以我的查询 GRANT <anything> TO <user>可以注入,对吧?

答: 暂无答案