首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态SQL -搜索查询-可变数量的关键字

动态SQL -搜索查询-可变数量的关键字
EN

Stack Overflow用户
提问于 2008-09-30 21:42:41
回答 4查看 8K关注 0票数 4

我们正在尝试更新我们的经典asp搜索引擎,以保护它免受SQL注入。我们有一个VB6函数,它通过基于各种搜索参数将查询连接在一起来动态构建查询。对于除关键字之外的所有参数,我们都使用动态sql将其转换为存储过程。

关键字的问题是,用户提供了可变数量的单词,我们希望为每个关键字搜索多个列。由于我们不能为每个关键字创建单独的参数,那么如何构建安全的查询呢?

示例:

代码语言:javascript
复制
@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注入的保护的最佳方法是什么?

EN

回答 4

Stack Overflow用户

发布于 2008-09-30 22:12:21

您可能不喜欢听到这样的说法,但在针对数据库发出查询之前,您最好回到代码中动态构造SQL查询。如果在SQL字符串中使用参数占位符,则可以防止SQL注入攻击。

示例:

代码语言:javascript
复制
string sql  = "SELECT Name, Title FROM Staff WHERE UserName=@UserId";
using (SqlCommand cmd = new SqlCommand(sql))
{
  cmd.Parameters.Add("@UserId", SqlType.VarChar).Value = "smithj";

您可以根据需要查询的列集构建SQL字符串,然后在字符串完成后添加参数值。

票数 3
EN

Stack Overflow用户

发布于 2008-09-30 22:22:59

这里有3个选项。

  1. 使用function that converts lists tables并加入其中。所以你会得到类似这样的东西。

SELECT * FROM calendar c JOIN dbo.fnListToTable(@ keywords ) k ON c.keyword = k.keyword

  • 有一组固定的参数,并且只允许搜索最多N个关键字

CREATE PROC spTest @Keyword1 varchar(100),@Keyword2 varchar(100),....

  • 在TSQL中编写转义字符串函数并转义关键字。
票数 1
EN

Stack Overflow用户

发布于 2008-10-01 05:13:49

这并不是真正的动态:

代码语言:javascript
复制
SELECT DISTINCT event_name
FROM calendar
INNER JOIN #keywords
    ON event_name LIKE '%' + #keywords.keyword + '%'
    OR event_description LIKE '%' + #keywords.keyword + '%'

  • 您实际上可以生成具有大量参数的SP,而不是手动编码(根据您在编码搜索时的偏好,将默认值设置为'‘或NULL )。如果你发现你需要更多的参数,可以简单地增加参数的数量,它generated.
  • You可以将搜索移动到数据库外部的全文索引,然后使用Lucene结果来提取匹配的数据库行。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/155220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档