【问题标题】:Does ADO.NET sanitize wildcards out of string SqlParameters?ADO.NET 是否从字符串 SqlParameters 中清除通配符?
【发布时间】:2011-03-02 16:20:13
【问题描述】:

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...

但用户不知何故设法让自己获得了一个像% 这样的用户名。他的想法是他将看到所有用户,而不仅仅是他应该看到的用户。这会起作用吗,或者% 会在参数化时获得 a) 转义,或者 b) 被 SQL 服务器评估为文字 %

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


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

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

【问题讨论】:

标签: .net sql ado.net parameters


【解决方案1】:

不!没有什么要清理的,它是 有效 值。将其放入LIKE 语句是您的问题。 ADO.net 阻止 ' 和其他可能导致注入的字符。

【讨论】:

  • 好吧,它不会阻止单引号或任何其他字符,但它确保所有字符都将被解释为参数值的一部分,而不是用于分隔值的元字符.如果您愿意,您可以将其视为用两次出现替换单引号,但实际上,如果您使用 SqlProviders,它将使用本机协议与 MSSQL 对话,而不仅仅是发送字符串以再次解析它们服务器!
  • @TheDag 我第一次听说它不发送字符串。关于那个的任何细节?
【解决方案2】:

你需要自己逃避它,这样就可以了:

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

【讨论】:

  • 我喜欢escape 子句。不知道你能做到这一点,所以我学到了一些新东西。不过,替换字符串不是必须是"~%" 吗?我认为在那之前你需要Replace("~", "~~"),对吧?
  • 考虑带单引号的数据,搜索也有single quote。这个解决方案有效吗?那么连续两个单引号的数据呢?
  • @Lijo 你用另一个单引号转义单引号
猜你喜欢
  • 1970-01-01
  • 2014-07-11
  • 1970-01-01
  • 2016-02-11
  • 2021-02-07
  • 1970-01-01
  • 2013-01-30
  • 2015-07-15
  • 1970-01-01
相关资源
最近更新 更多