添加撇号到姓氏搜索

时间:2009-11-05 16:29:51

标签: sql-server tsql escaping apostrophe

我创建了一个proc,它将按姓氏返回申请人列表。我在搜索具有撇号的姓氏的申请人时遇到问题(示例O'Connor)。能否帮助找到这些申请人:

以下是我的搜索代码:

if Rtrim(@FirstName) <> ''
begin 
  If(Len(@FirstName) < 30) and (CharIndex('%', @FirstName) = 0) and @FirstName != ''
         Set @FirstName = char(39) + @FirstName + '%' + char(39)
end 

if Rtrim(@LastName) <> ''
begin 
   If(Len(@LastName) < 60) and (CharIndex('%', @LastName) = 0) and @LastName != ''
     Set @LastName = Char(39) + @LastName + '%' + char(39)
end 

#At the end  - --Now build dinamically the filter base on input parameters
if Rtrim(@FirstName) <> ''
    select @Where = @Where + ' and a.FirstName like '+ Rtrim(@FirstName) 

if Rtrim(@LastName) <> ''
  select @Where = @Where + ' and a.LastName like '+ Rtrim(@LastName)

3 个答案:

答案 0 :(得分:2)

使用双撇号在T-SQL字符串中转义撇号,例如

SELECT * FROM sometable where LastName LIKE '%''%'

请注意,由于SQL injection attacks的风险,组合来自可能包含撇号的字符串的动态SQL语句的组合非常很危险。普通用户可能有像O'Connor这样的名字,但精明的攻击者可能会选择像"O'; TRUNCATE TABLE Customers; --"这样可能会删除数据的“名称”。

至少,如果你是从字符串动态组装SQL语句,你应该在将该字符串注入SQL之前用双撇号(例如REPLACE (@LastName, '''', ''''''))替换撇号。

但是,如果这些字符串来自用户,您应该考虑使用参数化查询,而不是通过字符串连接与SQL和参数字符串手动组装SQL查询。参数化意味着SQL客户端API和/或服务器负责将参数转换为“安全”字符串。这是针对SQL注入攻击的最佳防御。有关详细信息,请查看此Jeff Atwood blog post

答案 1 :(得分:2)

您的代码看起来像是尝试构建动态SQL WHERE子句。把它停在那里扔掉它,你的方法是危险的,容易出错。

您可能希望按照以下方式执行某些操作:

/* declare a few test variables */
DECLARE @FirstName varchar(30)
DECLARE @LastName  varchar(60)
SET @FirstName = 'First''Name'
SET @LastName = 'Last''Name'

/* these variables are for dynamic SQL execution */
DECLARE @IntVariable int
DECLARE @SQLString nvarchar(500)
DECLARE @ParmDefinition nvarchar(500)

/* define a paramertized SQL query */
SET @SQLString =
 N'SELECT 
     UserId 
   FROM 
     UserTable
   WHERE 
     LastName LIKE ''%'' + @ln + ''%'' 
     AND FirstName LIKE ''%'' + @fn + ''%''
  '

/* define the used parameters and their types */    
SET @ParmDefinition = N'@ln varchar(30), @fn varchar(60)'

/* execute dynamic SQL, syntax- and code-injection safely */
EXECUTE sp_executesql @SQLString, @ParmDefinition,
                      @ln = @LastName, @fn = @FirstName

请务必阅读MSDN on sp_executesql以获取更多解释&amp;样品

答案 2 :(得分:0)

类似的东西:

...
select @Where = @Where + ' and a.LastName like ' + Replace(Rtrim(@LastName), '''', '''''')
...

(是的,我知道,这些都是很多引号,但它有效。)

并且中需要更多引号,例如'x'语法:

select @Where = @Where + ' and a.LastName like ''' + Replace(Rtrim(@LastName), '''', '''''') + '''' 

(是的,越来越多的报价)

这将生成正确的:

and a.LastName 'like o''conor'