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

Sql 是否从MVC中的参数查询中删除撇号?,sql,asp.net-mvc,security,Sql,Asp.net Mvc,Security,我意识到这个话题已经被大量讨论过了。。。我已经读了很多关于SQL注入等的帖子。如果我问了类似的问题,我很抱歉,但是我还没有找到我的情况的答案 我在搜索页面上有一个字段,允许用户根据标题进行搜索。我的项目构建了一个SQL查询字符串来检索数据,但该字符串从来都不是URL的一部分。如果有人搜索包含撇号的标题,查询将失败。我想知道如何解决这个问题,以及在允许用户基于标题进行搜索的同时,我还需要哪些其他安全防护。请注意,最终将有大约20000个标题可供选择 在我的控制器的帖子中:以及大约50个其他参数

我意识到这个话题已经被大量讨论过了。。。我已经读了很多关于SQL注入等的帖子。如果我问了类似的问题,我很抱歉,但是我还没有找到我的情况的答案

我在搜索页面上有一个字段,允许用户根据标题进行搜索。我的项目构建了一个SQL查询字符串来检索数据,但该字符串从来都不是URL的一部分。如果有人搜索包含撇号的标题,查询将失败。我想知道如何解决这个问题,以及在允许用户基于标题进行搜索的同时,我还需要哪些其他安全防护。请注意,最终将有大约20000个标题可供选择

在我的控制器的帖子中:以及大约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中注入值,但由于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);

在此期间,我这样做是为了只有字母可以被接受为输入,除了撇号,然后在传递到查询之前替换掉。我仍然想知道如何使用参数执行此操作。

更好的方法是使用ORM并根据需要查询列表/过滤它。
我同意其他人的观点,永远不要用sql注入暴露你的网站

您肯定会想摆脱SQL注入漏洞。这是你问题的根本原因,也可能成为更糟糕问题的根本原因。从发布的SQL查询中不太清楚它的实际结构是什么,因为它是由我们看不到的变量构建的。但实际上,您希望使用查询参数,而不是直接将用户输入作为代码执行。在WHERE子句中动态添加检查可能会有点棘手,但并非不可能。永远不要从用户输入构建完整的sql语句。如果您已经做了适当的研究,那么您应该完全了解传递用户输入的唯一安全方法是通过参数。我完全支持消除该漏洞。我只是不知道如何使用查询参数,也不知道如何让它使用where语句。如何使用参数仍然允许某人搜索包含撇号的标题而不让SQL注入撇号通过?这如何防止{0}被删除-表用户SQL注入?@ErikPhilips这取决于注入的值是如何生成的。如果是用户输入,则仍然存在漏洞。但是,如果它是由代码生成的,正如问题所提示的那样,title类似于@title,那么SQL注入是不可能的。由于角色限制,我必须将其分解为多个注释:从能量>3和韧性为0或红色绿色魔法成本>0或红色蓝色魔法成本>0或红色黑色魔法成本>0或红色黑色魔法成本>0或白色绿色魔法成本>0或红色白色白色魔法成本>0或白色黑色魔法成本>0的牌中选择*whiteorlifecost>0或redmanacost>0或whitemanacost>0并在从CardCapabilities中选择CardID,其中abilityid=2和CardSetID插入从Cardsets中选择不同的CardSetID。ReleaseDate=从Cardsets中选择MaxReleaseDate;如何从用户输入安全地创建该查询?
//EXECUTE Query & Return View//
var CardList = db.Cards.SqlQuery(SQLstatement, parameters).ToList();
                                               ^-- pass parameters here