过滤ASP.NET中的有害SQL选择语句

时间:2015-11-26 03:28:17

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

我正在公开一个构建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表并且只允许{{1语句(可以使用READ oNLY之类的东西吗?)

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

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