动态查询作为存储过程和 SQL 注入中的参数

Dynamic query as a parameter in stored procedure and SQL Injection

提问人:Sébastien 提问时间:6/15/2017 更新时间:6/15/2017 访问量:232

问:

我有以下存储过程(针对这篇文章进行了修改):

ALTER PROCEDURE [dbo].[SEL_ARTICLE](
@FILTER VARCHAR(8000) = ''
) AS
BEGIN

DECLARE @SQLQuery varchar(8000);

SET @SQLQuery = 'SELECT DISTINCT ArticleNo, desc, ...
FROM Article INNER JOIN
...
{0}
ORDER BY ArticleNo, ...';

SET @SQLQuery = REPLACE(@SQLQuery, '{0}', @FILTER);

EXEC(@SQLQuery);
END

我在我的 prog 中这样称呼这个 proc:

Public Function get_Article(ByVal strFilter As String) As DataTable
    Dim tblData As New DataTable
    Dim par As SqlParameter = New SqlParameter("@FILTER", SqlDbType.VarChar)        
    par.Value = strFilter
    Load_Data("SEL_ARTICLE", tblData, par) 'SqlCommand used
    Return tblData
End Function

参数的值是动态的(字段、值),具体取决于我们搜索的内容。下面是一个示例:strFilter

" AND ((Article = [input from User]) OR (Description LIKE '%[input from User]%'))"

用户必须能够输入字符(法语单词),这就是为什么我像这样在服务器端替换它的原因:'

strFilter &= String.Format(" AND ((Article = {0}) OR (description LIKE '%{1}%'))", strArticleNo, strArticleName.Replace("'", "''"))

我阻止用户输入以下字符:,,,,<>{};

现在我的问题: 此代码对SQL注入攻击安全吗?

谢谢!

asp.net sql-server 存储过程 sql-injection

评论

0赞 Igor 6/15/2017
不,您没有检查和转义您显示的代码中的字符。为什么不传递实际实例,每个值 1 个?'SqlParameter
0赞 Mikhail Lobanov 6/15/2017
这是一篇好文章:sommarskog.se/dyn-search.html
0赞 Sébastien 6/15/2017
@MikhailLobanov:这是一篇非常有趣和中肯的文章。谢谢你的链接!

答: 暂无答案