【发布时间】:2015-08-25 18:40:37
【问题描述】:
我意识到这个话题已经被大量讨论...我已经阅读了很多关于 SQL 注入等的帖子。如果我问类似的问题,我很抱歉,但我无法找到我的情况的答案.
我在搜索页面上有一个字段,允许用户根据标题进行搜索。我的项目构建了一个 SQL 查询字符串来检索数据,但该字符串绝不是 URL 的一部分。如果有人搜索包含撇号的标题,则查询失败。我想知道如何解决这个问题,以及在允许用户根据标题进行搜索的同时,我还需要哪些其他安全措施来确保安全。请注意,最终将有大约 20,000 个标题可供选择。
在我的控制器的 POST 中:(以及大约 50 个其他参数)
if (results.Title != null)
wherestatements.Add("title like '%" + results.Title + "%'");
//Collect all other values of the search//
//BUILD SQL statement//
SQLstatement = string.Format("select * from Cards where {0} and {1} and (({2}) or ({3}))
and CardID In (Select CardID from CardAbilities where {4});",
final, //This is my where the title is included
finalexcludefrommulti, finalsplit, finalmulti, finalability);
//EXECUTE Query & Return View//
var CardList = db.Cards.SqlQuery(SQLstatement).ToList();
return View(CardList.ToPagedList(pageNumber, pageSize));
【问题讨论】:
-
你肯定想要摆脱那个 SQL 注入漏洞。这就是你的问题的根本原因,并且可能成为更严重的问题的根本原因。从发布的 SQL 查询中并不清楚它的实际结构是什么,因为它是由我们看不到的变量构建的。但本质上你想使用查询参数而不是直接将用户输入作为代码执行。向
WHERE子句动态添加检查可能会有点棘手,但并非不可能。 -
永远不要根据用户输入构建完整的 sql 语句。如果您已经进行了适当的研究,那么您应该完全意识到传递用户输入的唯一安全方法是通过参数。
-
我完全赞成摆脱这个漏洞。我只是不知道如何使用查询参数,也不确定如何让它与 where 语句一起使用。使用参数如何仍然允许某人搜索包含撇号的标题而不让 SQL 注入撇号通过?
标签: sql asp.net-mvc security