我们正在尝试更新我们的经典asp搜索引擎,以保护它免受SQL注入。我们有一个VB6函数,它通过基于各种搜索参数将查询连接在一起来动态构建查询。对于除关键字之外的所有参数,我们都使用动态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注入的保护的最佳方法是什么?
发布于 2008-09-30 22:12:21
您可能不喜欢听到这样的说法,但在针对数据库发出查询之前,您最好回到代码中动态构造SQL查询。如果在SQL字符串中使用参数占位符,则可以防止SQL注入攻击。
示例:
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字符串,然后在字符串完成后添加参数值。
发布于 2008-09-30 22:22:59
这里有3个选项。
SELECT * FROM calendar c JOIN dbo.fnListToTable(@ keywords ) k ON c.keyword = k.keyword
CREATE PROC spTest @Keyword1 varchar(100),@Keyword2 varchar(100),....
发布于 2008-10-01 05:13:49
这并不是真正的动态:
SELECT DISTINCT event_name
FROM calendar
INNER JOIN #keywords
ON event_name LIKE '%' + #keywords.keyword + '%'
OR event_description LIKE '%' + #keywords.keyword + '%'https://stackoverflow.com/questions/155220
复制相似问题