【问题标题】:Restrict SQL Query to SELECT operation ASP.net C#将 SQL 查询限制为 SELECT 操作 ASP.net C#
【发布时间】:2018-05-03 05:24:56
【问题描述】:

我们正在为用户创建一个用户界面
1) 在数据库上运行 Select 语句(查询可以包括 Join 或子查询)
2) 同屏查看结果

现在我们正在检查输入字符串是否具有以下任何关键字 INSERT/UPDATE/DELETE/TRUNCATE/CREATE/ALTER/DROP/GRANT/REVOKE 语句,并在只有 SELECT 权限的 SQL 用户下执行查询数据库。

在只读用户下执行查询之前,是否有任何其他方法可以添加额外的保护层来验证查询?

谢谢

【问题讨论】:

  • 基本上,不要让用户运行任何想写的查询!你会后悔的......
  • 由于业务需要,我们无法避免这种情况。因此,我试图找到避免任何潜在安全相关问题的最佳方法。此工具将仅部署在 pre-prod 环境中,因此风险级别相对较低。
  • 您可以通过使用事务来做到这一点。如果您得到任何受影响的行,则回滚事务。我检查了触发器(即如果对表的任何操作应用了任何触发器),触发器的效果也会回滚。
  • 感谢您的建议,将尝试。

标签: c# asp.net sql-server-2016


【解决方案1】:
  1. 确保参数用于为选择提供输入 语句(避免 SQL 注入)。虽然只有 SELECT 的用户 权限无论如何都无法执行,但这也将 确保输入是合理的。
  2. 确保所有与数据库相关的 错误不会直接输出到屏幕上

【讨论】:

  • 用户将在同一个 UI 中输入整个查询,包括 WHERE 子句中的参数。所以我们将无法分解成参数来查询。
  • 当然,我会确保所有错误都记录在表格中,并且不会在 UI 中显示确切的错误消息。
【解决方案2】:

我假设并非所有应用程序用户也是有效的数据库用户。

您需要创建 2 个数据库登录。一个人应该只拥有db_datareader 应该用于运行查询的权限。在您的代码中处理 SqlException 以查看最终用户是否尝试执行除选择之外的另一条语句。

应该有另一个数据库登录,应用程序代码应该使用它来执行任何其他 DML 操作。

【讨论】:

  • 谢谢,我们现在也在使用 2 登录方式。第二个用户帐户将用于将查询存储在表中并稍后检索。
【解决方案3】:

与其让人们编写他们想要的任何命令作为命令,并且只检查命令中您认为可能有害的某些单词,不如创建一个只能具有一个操作(选择)的“查询生成器”,来自t 个表(其中 t 是可用表的数量),以及所需的列。您可以添加一些带有可用操作(根据您的情况选择)、可用表和可用列的下拉列表。这样您就可以使用给定的输入自己生成查询,而无需让用户直接将命令写入您的服务器。

【讨论】:

  • 感谢您的推荐。这种方法被拒绝了,因为它变得复杂,因为查询可能包含多个连接和子查询。此外,用户更愿意自己编写查询,而不是基于设计器的方法。所以我们最终提供了一个复制/粘贴查询的选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
相关资源
最近更新 更多