c# - SQLParameterCollection AddWithValue 和 Add 不转义通配符
问题描述
我目前正在构建一个 API,允许用户使用名称搜索数据库对象。存储过程按如下方式运行此查询:
ALTER PROCEDURE [GetMyDatabaseObjectByName]
@name varchar(255)
as
begin
select mdo.Name,
mdo.ID
from MyDatabaseObject mdo
where mdo.Name like '%' + @name + '%'
end
我从我的 C# 应用程序调用此查询,如下所示:
dbCommand.Parameters.AddWithValue("@name", name);
这一切都很棒而且很花哨,但是如果用户像我的 QA 工程师那样优雅地传递了一个'%'符号,存储过程将返回数据库中的每个元素,因为它将其解释如下:
select mdo.Name,
mdo.ID
from MyDatabaseObject mdo
where mdo.Name like '%' + '%' + '%'
我试过使用
dbCommand.Parameters.Add("@name", SqlDbType.NVarChar).Value = name;
但我得到了同样的结果。根据文档,我认为Add或AddWithValue会自动转义字符串以避免这种情况。
问题:
System.Data.SqlClient中是否有任何内置解决方案可以转义传入的任何符号?
这里的首选方法是什么,在客户端级别使用正则表达式来避免它传递任何时髦的字符?
解决方案
Add和AddWithValue不会自动转义任何符号,为了清除或转义用户可能传入的符号,您需要实现类似这样的东西
name = EscapeForLike(name)
dbCommand.Parameters.AddWithValue("@name", name);
public static string EscapeForLike(string input)
{
return input
.Replace("[", "\\[")
.Replace("]", "\\]")
.Replace("\\", "[\\]")
.Replace("%", "[%]")
.Replace("_", "[_]");
}