如何?参数和LIKE语句SQL


80

我正在编写一个搜索功能,并考虑使用参数来防止或至少限制SQL注入攻击的查询。但是,当我通过程序运行它时,它不会返回任何内容:

SELECT * FROM compliance_corner WHERE (body LIKE '%@query%') OR (title LIKE '%@query%')

可以像这样使用参数吗?还是仅在以下情况下才有效:

SELECT * FROM compliance_corner WHERE body LIKE '%<string>%'<string>搜索对象在哪里)。

编辑:我正在用VB.NET构造此函数,这对你们贡献的语法有影响吗?

另外,我在SQL Server中运行了以下语句:SELECT * FROM compliance_corner WHERE (body LIKE '%max%') OR (title LIKE%max%')`,并返回结果。

Answers:


78

您的可视化基本代码如下所示:

Dim cmd as New SqlCommand("SELECT * FROM compliance_corner WHERE (body LIKE '%' + @query + '%') OR (title LIKE '%' + @query + '%')")

cmd.Parameters.Add("@query", searchString)

3
正如Adam在回答中指出的那样,这不能防止SQL注入。该查询应参数化。
DOK,

6
您能否提供一个不能防止SQL注入的示例?根据我的测试,效果很好
约翰,

27
它不开放SQL注射,仅开放LIKE注射。这意味着用户可以输入特殊字符,例如% ^_,它们LIKE将进行特殊解释。这意味着用户可能无法获得某些搜索所期望的结果。例如,搜索'less than 1% fat'可能会返回结果'less than 1% of doctors recommend this - it's full of fat!'
亚历克斯·汉弗莱

1
我同意,类似内容会受到“类似注入”的影响,而危害仅是用户没有得到他们期望的结果。即使参数化,也应始终执行查询卫生。仅仅依靠这种保护并不完全安全。
Anthony Mason

1
我还建议您这样做searchString.Replace("[","[[]").Replace("%","[%]").Replace("_","[_]"),这将使LIKE注入无效(只要您不使用escape子句)。
8DX

114

好吧,我会去:

 Dim cmd as New SqlCommand(
 "SELECT * FROM compliance_corner"_
  + " WHERE (body LIKE @query )"_ 
  + " OR (title LIKE @query)")

 cmd.Parameters.Add("@query", "%" +searchString +"%")

这是正确的,约翰提供的公认答案语法错误!
亚当

3
我不确定他的语法有何不正确,他的解决方案效果很好。我有一个函数,该函数构造并返回一个SQL语句以供数据表或其他使用。
安德斯

1
附加说明:使用MySQLDataAdapter = C =的语法= da = new MySQLDataAdapter(“ SELECT * FROM tableA WHERE fieldA = @fieldA”); da.SelectCommand.Parameters.AddWithValue(“ @ fieldA”,“%” + someValue +“%”);
约翰M,2010年

3
另一个答案(来自John)也可以,但是确实很容易受到注入的影响,根据您的领域目的,MIGHT可能会给出奇怪的结果。
史蒂文·莱门斯

1
不应该cmd.Parameters.Add成为cmdLoad.Parameters.AddWithValue问题或存在任何问题吗?我知道James的回答来自2008年:)
WTFZane


2

您可能需要将%符号与您的参数连接起来,例如:

像'%'|| @query || '%'

编辑:实际上,这可能根本没有任何意义。我想我可能误解了您的问题。


1

有时,%如果您从VB执行查询时与从MS SQL / Access执行查询时,用作占位符的符号不同。尝试将占位符从更改%*。那可能行得通。
但是,如果调试并想直接在MS SQL或Access中复制SQL字符串以对其进行测试,则可能必须将符号改回%MS SQL或Access中才能实际返回值。

希望这可以帮助


在2012年我不确定,但是%vs *是特定于ADO vs DAO引擎的。如果您使用的是DAO或Access中的Current(),通配符为*;如果使用任何代码(包括Access中的VBA)使用ADO,则通配符为%。
Marcelo Scofano

0

也可以这样尝试

Dim cmd as New SqlCommand("SELECT * FROM compliance_corner WHERE (body LIKE CONCAT('%',@query,'%')  OR  title LIKE CONCAT('%',@query,'%') )")
cmd.Parameters.Add("@query", searchString)
cmd.ExecuteNonQuery()

Concat代替+

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.