2015-11-26 65 views
-1

我正在公开一个Web服务,它构造SQL SELECT语句并接受来自控制器的参数。通用功能如下:在ASP.NET中筛选有害的SQL选择语句

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声明(可以使用类似只读?)

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

+0

可能的重复[如何防止SQL注入在PHP?](http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php) –

+0

@BrandonMoretz主席先生,您可能不会考虑,该用户正在询问有关PHP框架。所以提供的解决方案也建议使用PHP插件 –

+1

一种方法是确保连接到数据库的帐户是只读的。那么你只限于DOS类型的攻击。而且您还必须确保该帐户保持只读状态。但最后这是一个坏主意。 –

回答

0

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

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

+0

这个数据读取器意味着我不能执行其他命令吗?是否有可能使用Reader来更新记录?我阅读文档,但没有提供我关心的具体细节 –

1

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

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

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

+0

是的,实际上我做了什么,之后我会发布我的解决方案(如果我不忙)。不管怎么说,还是要谢谢你。 –