我正在公开一个构建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 %%'");
我想阻止。
现在我的问题是:我可以做的最好的事情是阻止用户访问UPDATE
,MODIFY
,DELETE
,TRUNCATE
表并且只允许{{1语句(可以使用READ oNLY之类的东西吗?)
注意:这类似于this question,但是用户正在使用PHP,而我在ASP.NET MVC中,我想在这里实现的只是允许SELECT
或' GET'言。
答案 0 :(得分:1)
不要这样做。您需要参数化查询,这意味着您不能接受SQL文本作为输入。我发现很多开发人员尝试检测SQL注入攻击,我几乎总能找到一种超越逻辑的方法。
如果您需要能够基于数据库中的任何表动态构造任何SELECT查询,那么您可以轻松地创建一个表示表的类,选择列以及谓词列作为枚举的位置,以及where谓词的值。根据此类连接SQL文本,并使用SqlParameters包含谓词值。
这只是一个例子,但肯定你不想接受SQL文本。
答案 1 :(得分:0)
使用数据阅读器https://msdn.microsoft.com/en-us/library/haa3afyz(v=vs.110).aspx。调用ExecuteReader()时可以捕获任何异常。
但是我建议不要将这种通用功能暴露给客户端代码。您应该只使用类似于存储库模式的东西,通过适当的数据层提供对数据的受控访问。