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
答案 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("%", "~%"));