【问题标题】:LIKE in dynamic queriesLIKE 在动态查询中
【发布时间】:2010-11-09 00:38:11
【问题描述】:

我想在动态参数化查询中使用like 关键字。我想保护我的查询免受 SQL 注入,所以我不想传递值,而是想在执行查询时传递我的条件,

有什么办法可以做到吗?

SELECT 
  ComposeMail.ID,
  ComposeMail.DateTime, 
  ComposeMail.Subject, 
  ComposeMail.CreatedBy, 
  ComposeMail.ReceiverStatus,
  Users.Name,
  ROW_NUMBER() OVER(ORDER BY '+ @p_SortExpression +') AS Indexing
FROM 
  ComposeMail 
INNER JOIN
  Users
ON
  ComposeMail.CreatedBy = Users.ID
WHERE 
  (ToReceipientID=@p)
  AND (
    ReceiverStatus=3 
    OR ReceiverStatus=4
  )
  AND (
    (Subject Like ''%' + @p3 + '%'') 
    OR (Body Like ''%' + @p3 + '%'') 
    OR (Name Like ''%' + @p3 + '%'')
  )

这是我的动态查询字符串。我不想在这里传递值。

【问题讨论】:

    标签: sql dynamic sql-injection


    【解决方案1】:

    为了防止动态查询中的注入,您总是希望执行这样的操作(而不是在您的示例中执行 ' + @var + ')

    DECLARE @query nvarchar(2000),
            @paramList nvarchar(2000)
    
    SET @query = 'SELECT * FROM dbo.Orders WHERE custLastName LIKE ''%'' + @custLastName + ''%'''
    SET @paramList = '@custLastName varchar(30)'
    
    EXEC SP_EXECUTESQL @query, @paramList, @custLastName
    

    编辑:示例更新为使用 LIKE

    【讨论】:

    • 这对于 LIKE 子句来说很好,但不幸的是,您不能使用这种技术来参数化问题中的 ORDER BY 表达式。
    【解决方案2】:
     WHERE        (LastName LIKE N'%' + @Family + N'%') OR
                             (RegNo LIKE N'%' + @Codemeli + N'%')
    

    类似于动态 sql 查询

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      • 2023-03-21
      相关资源
      最近更新 更多