2008-09-30 44 views
3

我们正在尝试更新我们的经典asp搜索引擎,以防止SQL注入。我们有一个VB 6函数,它通过基于各种搜索参数连接查询来动态构建查询。我们已经将这个转换为一个存储过程,对于除关键字以外的所有参数都使用动态sql。动态SQL - 搜索查询 - 变量关键字数

关键字的问题在于,用户提供了可变数字词,我们希望为每个关键字搜索多个列。由于我们无法为每个关键字创建单独的参数,因此我们如何才能构建安全的查询?

例子:

@CustomerId AS INT 
@Keywords AS NVARCHAR(MAX) 

@sql = 'SELECT event_name FROM calendar WHERE customer_id = @CustomerId ' 

--(loop through each keyword passed in and concatenate) 

@sql = @sql + 'AND (event_name LIKE ''%' + @Keywords + '%'' OR event_details LIKE ''%' + @Keywords + '%'')' 

EXEC sp_executesql @sql N'@CustomerId INT, @CustomerId = @CustomerId 

什么是从SQL注入对此进行处理并维持保护的最佳方式?

回答

3

您可能不喜欢听到这个消息,但在发布数据库之前,回到代码中动态构建SQL查询可能会更好。如果在SQL字符串中使用参数占位符,则可以抵御SQL注入攻击。

例子:

string sql = "SELECT Name, Title FROM Staff WHERE [email protected]"; 
using (SqlCommand cmd = new SqlCommand(sql)) 
{ 
    cmd.Parameters.Add("@UserId", SqlType.VarChar).Value = "smithj"; 

你可以建立根据设定需要查询,然后一旦串完成添加参数值的列的SQL字符串。这有点痛苦,但我认为这比真正复杂的TSQL容易得多,因为它可能会导致很多可能的输入变量。

+0

+1这种做法将避免逃避问题完全 – 2008-09-30 22:36:10

1

您有3个选项。

  1. 使用function that converts lists tables并加入到它中。所以你会有这样的事情。

    SELECT * 
    FROM calendar c 
        JOIN dbo.fnListToTable(@Keywords) k 
         ON c.keyword = k.keyword 
    
  2. 有一个固定的则params的,只允许被搜索的

    CREATE PROC spTest 
    @Keyword1 varchar(100), 
    @Keyword2 varchar(100), 
    .... 
    
  3. 的最多N个关键词写在TSQL的转义字符串函数和逃避你的关键字。

0
  • 除非你需要它,你可以简单地去掉,这不是在[A-ZA-Z]任意字符 - 大多数的这些事情不会在搜索和你不应该能够注入这种方式,也不必担心关键字或类似的东西。但是,如果你允许引号,你需要更加小心。

  • 到sambo99的#1类似,您可以插入关键字到一个临时表或表变量和没有注射的危险,加入到它(即使使用通配符):

这是不是真的动态:

SELECT DISTINCT event_name 
FROM calendar 
INNER JOIN #keywords 
    ON event_name LIKE '%' + #keywords.keyword + '%' 
    OR event_description LIKE '%' + #keywords.keyword + '%' 
  • 实际上,你可以生成大量的参数的SP,而不是通过手工编码它的(设置默认为“” NULL或根据你的喜好编码你的搜索)。如果你发现你需要更多的参数,增加它生成的参数的数量会很简单。

  • 您可以将搜索移动到数据库之外的全文索引(如Lucene),然后使用Lucene结果来拉取匹配的数据库行。

0

你可以试试这个:

SELECT * FROM [tablename] WHERE LIKE % +keyword%