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