从MVC中的参数查询中删除撇号?

时间:2015-08-25 18:40:38

标签: sql asp.net-mvc security

我意识到这个话题已经被大量讨论了......我已经阅读了很多关于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));

3 个答案:

答案 0 :(得分:0)

与此同时,我已经做到这一点,只有字母才能被接受作为输入,撇号除外,然后在传递给查询之前被替换。我仍然想知道如何用参数做到这一点。

答案 1 :(得分:0)

更好的方法是使用ORM并查询列表/根据需要过滤它。 我同意其他从未用sql注入公开你的网站。

答案 2 :(得分:-1)

好吧我会说更改使用参数而不是在SQL中注入值,但由于你的WHERE子句非常动态,所以并不简单。好像你需要:

1)生成WHERE子句的集合,每个子句包含对参数的引用 2)将参数值添加到值列表

如下所示:

List<object> parameters = new List<object>();

...


if (results.Title != null)
{
    wherestatements.Add("title like @title");
    parameters.Add("%" + 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, parameters).ToList();
                                               ^-- pass parameters here