ADO.NET是否使用字符串SqlParameters清理通配符?

时间:2011-03-02 16:20:14

标签: .net sql ado.net parameters

ADO.NET是否在字符串类型的SqlParameters中清理通配符(即“%”或“_”)?此外,它需要吗?我已经尝试了谷歌搜索,但很难找到我想知道的确切内容。

例如,假设我有一个参数化查询:

string sql = "SELECT * FROM Users WHERE UserName LIKE @prefix";

SqlCommand command = new SqlCommand(sql, connection);
command.Parameters.AddWithValue("prefix", User.UserName);
//etc...

但是用户以某种方式设法获得了像%这样的用户名。他的想法是,他会看到所有用户,而不仅仅是他应该看到的用户。这是有效的,或者%是否会在参数化值时转义,或者b)由SQL服务器评估为文字%

请注意,我意识到上述将是一个非常糟糕的设计。这只是一个简单的例子。


编辑:我已通过测试确认该选项b)未发生。

declare @prefix as varchar(10);
set @prefix = '%';
select * from MyTable where MyField like @prefix;
--returns everything

2 个答案:

答案 0 :(得分:2)

没有!没有什么可以消毒的,它是有效的值。你把它放到LIKE语句中是你的问题。 ADO.net会阻止'和其他可能导致注入的字符。

答案 1 :(得分:1)

你需要自己逃避它,这样做:

string sql = "SELECT * FROM Users WHERE UserName LIKE (@prefix + '%') ESCAPE '~'";
SqlCommand command = new SqlCommand(sql, connection);
command.Parameters.AddWithValue("prefix", User.UserName.Replace("~", "~~").Replace("%", "~%"));