【问题标题】:Filtering Harmful SQL Select Statements in ASP.NET在 ASP.NET 中过滤有害的 SQL Select 语句
【发布时间】:2015-11-26 03:28:16
【问题描述】:

我公开了一个构建 SQL SELECT 语句并接受来自控制器的参数的 Web 服务。泛型函数如下所示:

DataTable SqlSelect (string select, string from,  string Where, string orderby = "", string groupBy = "")
 {
     string sql = "SELECT " + select + " FROM " + from + " WHERE " + where
     (orderby =="") ? "" : "ORDER BY " + orderby ...
     //do other stuff
 }

现在让我担心的是,基于上面给定的功能,用户现在可能会注入有害命令,例如:

SqlSelect("DROP TABLE 'TABLENAME'", "INFORMATION_SCHEMA.TABLES", "TABLE_NAME like %%'");

我想阻止。

现在我的问题是:我能做的最好的事情是防止用户使用 UPDATEMODIFYDELETETRUNCATE 表,并且只允许 SELECT 语句(可以使用类似 READ oNLY ?)

注意:这类似于this question,但用户正在使用 PHP,而我在 ASP.NET MVC 中,我想要在这里实现的只是允许 SELECT 或 'GET' 语句。

【问题讨论】:

  • @BrandonMoretz 先生,您可能不会考虑,用户在询问 PHP 框架。所以那里提供的解决方案也建议使用 PHP 插件
  • 一种方法是保证连接数据库的账号是只读的。那么你只限于 DOS 类型的攻击。而且您还必须确保该帐户保持只读状态。但最终这是一个坏主意。
  • 谢谢,我已经找到了解决方案。是的,我的第一个概念确实是个坏主意
  • @dr.Crow,考虑发布您的解决方案,以便其他看到此帖子的人受到启发。

标签: sql sql-server asp.net-mvc security


【解决方案1】:

不要这样做。您需要参数化查询,这意味着您不能接受 SQL 文本作为输入。我发现开发人员多次尝试检测 SQL 注入攻击,而且我几乎总能找到绕过他们逻辑的方法。

如果您需要能够基于数据库中的任何表动态构建任何 SELECT 查询,那么您可以轻松创建一个指示表的类,选择列和 where 谓词列作为枚举,以及 where 谓词的值.基于此类连接 SQL 文本并使用 SqlParameters 包含谓词值。

这只是一个例子,但你肯定不想接受 SQL 文本。

【讨论】:

  • 是的,这实际上是我所做的,我会在之后发布我的解决方案(如果我不忙的话)。无论如何谢谢。
【解决方案2】:

使用数据阅读器https://msdn.microsoft.com/en-us/library/haa3afyz(v=vs.110).aspx。您可以在调用 ExecuteReader() 时捕获任何异常。

但是,我建议不要将这种通用功能暴露给客户端代码。您应该只使用诸如存储库模式之类的东西,通过适当的数据层提供对数据的受控访问。

【讨论】:

  • 这个数据读取器是否意味着我无法执行其他命令?是否可以使用 Reader 更新记录?我阅读了文档,但它没有提供我关注的确切细节
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
  • 2023-02-03
  • 1970-01-01
  • 1970-01-01
  • 2014-12-05
  • 2013-10-10
相关资源
最近更新 更多