C# SQLParameterCollection AddWithValue和Add不转义通配符

C# SQLParameterCollection AddWithValue和Add不转义通配符,c#,sql-server,C#,Sql Server,我目前正在构建一个API,允许用户使用名称搜索数据库对象。存储过程按如下方式运行此查询: ALTER PROCEDURE [GetMyDatabaseObjectByName] @name varchar(255) as begin select mdo.Name, mdo.ID from MyDatabaseObject mdo where mdo.Name like '%' + @name + '%' end select mdo.Name

我目前正在构建一个API,允许用户使用名称搜索数据库对象。存储过程按如下方式运行此查询:

ALTER PROCEDURE [GetMyDatabaseObjectByName] 
    @name varchar(255)
as
begin
select mdo.Name,
       mdo.ID
      from MyDatabaseObject mdo
      where mdo.Name like '%' + @name + '%'
end
 select mdo.Name,
        mdo.ID
      from MyDatabaseObject mdo
      where mdo.Name like '%' + '%' + '%'
我从我的C#应用程序中调用此查询,如下所示:

dbCommand.Parameters.AddWithValue("@name", name); 
这非常好,但是如果用户像我的QA工程师那样优雅地传递'%符号,存储过程将返回数据库中的每个元素,因为它将其解释为:

ALTER PROCEDURE [GetMyDatabaseObjectByName] 
    @name varchar(255)
as
begin
select mdo.Name,
       mdo.ID
      from MyDatabaseObject mdo
      where mdo.Name like '%' + @name + '%'
end
 select mdo.Name,
        mdo.ID
      from MyDatabaseObject mdo
      where mdo.Name like '%' + '%' + '%'
我试过使用

dbCommand.Parameters.Add("@name", SqlDbType.NVarChar).Value = name; 
但我得到了同样的结果。根据文档,我认为AddAddWithValue会自动转义字符串以避免这种情况

问题:

System.Data.SqlClient中是否有任何内置解决方案将转义传入的任何符号


这里的首选方法是什么,在客户端级别使用正则表达式以避免它传递任何时髦的字符?

添加添加不会自动转义任何符号,为了清除或转义用户可能传入的符号,您需要实现类似的功能

name = EscapeForLike(name)
dbCommand.Parameters.AddWithValue("@name", name); 

public static string EscapeForLike(string input)
{
    return input
        .Replace("[", "\\[")
        .Replace("]", "\\]")
        .Replace("\\", "[\\]")
        .Replace("%", "[%]")
        .Replace("_", "[_]");
}

@Lostaunaum这是一个问题,因为您已经将通过字符串连接构建查询的糟糕做法从C#端转移到了存储过程端。这是完全相同的问题。不要这样做。那么不要允许从前端执行。然而,如果他们只传递字符串
e
,他们将只能从表中获取大部分行?(假设文本中的英文字母分布)。你在哪里阻止这种疯狂
e通常不被认为是特殊字符,但它有许多与允许
%
@DanielMann将其移动到过程中同样的缺点,这并不能解决问题。他们正在向用户输入添加前导和尾随通配符。并且它是正确参数化的。不需要传递%,空搜索字符串也可以这样做。服务器正按照您的指示进行操作。无法通过转义来解决,请首先定义目标,例如要求搜索字符串中的字符数最少。下划线也是
表达式中的通配符(即单字符通配符)。以及方括号中的字母组。至少这里的参数方法不是sql注入漏洞。如果您不希望使用用户提供的通配符,并且仍然要附加前导通配符和尾随通配符,则只需使用
CHARINDEX
即可