2013-01-05 255 views
3

使用LIKE语句停止SQL注入的最佳方法是什么?因此,这里是代码的一个例子:SQL注入和LIKE语句

string search = Server.HTMLDecode(userEnteredSearchText); 
SqlCommand comm = new SqlCommand("SELECT Result WHERE (Keyword LIKE '%" + @search + "%') " 
comm.Parameters.Add(new SqlParameter("search", search)); 

这是我一直在做其他的SQL语句,它看起来像特殊字符,例如'%不能打破这些陈述,但我猜带一个LIKE声明你需要做一个退出键或什么?

+0

[避免与使用参数,如操作SQL查询的SQL注入?]的可能重复(http://stackoverflow.com/questions/228476/avoiding-sql-injection-in-sql-query-with- like-operator-using-parameters) – oleksii

回答

2

对不起,报价失效。你这样做就像你对其他事情做的一样,除了之内的SQL你需要连接%'s。另外,HTMLDecode在这里可能不会对你有任何好处,对吧?如果他们想在分贝搜索包含"&"

Search = userEnteredSearchText); 

SqlCommand comm = new SqlCommand("SELECT Result WHERE Keyword LIKE '%' + @search + '%'"); 
comm.Parameters.Add(new SqlParameter("search", search)); 
在你的榜样

这样的事情,你关闭SQL文本摆在@search,这是一个无效的关键字或变量 - 你只需要离开在SQL语句中。其他DB的,你需要把CONCAT这个东西放在一起。但绑定变量将正确地转移到驱动程序的东西。

+0

非常感谢!你的HTMLDecode评论是什么意思?所以我一直认为,当你从浏览器到服务器的文本,你应该HTMLDecode和当你从服务器的文本传输到浏览器,你应该HTMLEncode? – Kevin

+1

当您使用标准方法从请求中获取数据时,它已经为您解码了HTTP(而非HTML)。 HTML Decode是用于删除HTML编码 - 所以像'&'这样的东西会被转换回'&'。但是,在正常情况下,用户的数据不会被HTML编码。是的 - 您应该在发送动态数据时进行HTML编码,但是当您接收数据时,它不是HTML编码。 – Colselaw

-1

在向数据库发送sql查询时,避免在参数中出现单引号。 删除c#代码中参数中的任何特殊字符。 我建议避免尽可能多的特殊字符。

+0

Downvote是因为使用参数的一个目的是消除特殊字符的问题。 –

4

以下看起来更清洁一点。

string search = Server.HTMLDecode(userEnteredSearchText); 
SqlCommand comm = new SqlCommand("SELECT Result WHERE (Keyword LIKE @search) " 
comm.Parameters.Add(new SqlParameter("search", String.Format("%{0}%", search))); 
+0

不错的建议! – Kevin