提问人:Jaihind 提问时间:3/14/2019 最后编辑:Tetsuya YamamotoJaihind 更新时间:3/15/2019 访问量:169
我们如何通过正则表达式或任何其他方式防止SQL注入 asp.net
How to we prevent SQL Injection by Regular Expression or any other way in asp.net
问:
在我问之前 - 我知道存储过程是防止 sql 注入的最佳方法。我们可以通过参数化的存储过程来实现。
但是在我的应用程序中,我也在存储过程中使用动态查询,其中可以进行 sql 注入。
请向我推荐一种方法来停止 sql 注入,就像任何正则表达式或其他方式一样。 例:
CREATE PROCEDURE [dbo].[USP_BusinessSearch]
@Product INT = NULL,
@BusinessName VARCHAR(100) = NULL
AS
DECLARE @AdditionalCriteria AS NVARCHAR(MAX)
DECLARE @BaseQuery AS NVARCHAR(MAX)
BEGIN
SET NOCOUNT ON
SET @BaseQuery = 'Select * FROM Business WHERE ProductID = ' + @Product
SET @AdditionalCriteria = ' AND BusinessName = '+@BusinessName+' '
SET @BaseQuery = @BaseQuery + @AdditionalCriteria
EXEC SP_EXECUTESQL @BaseQuery
END
提前致谢。
答:
3赞
Zohar Peled
3/14/2019
#1
我真的希望你发布的过程不是你在生产环境中使用的过程,因为它根本不安全。您使用参数的事实并不意味着您不会受到 SQL 注入的影响 - 而是您如何使用参数。此过程可以在没有动态 SQL 的情况下编写,这将使它免受 SQL 注入的影响,如下所示:
CREATE PROCEDURE [dbo].[USP_BusinessSearch]
@Product INT = NULL,
@BusinessName VARCHAR(100) = NULL
AS
SELECT *
FROM Business
WHERE ProductID = @Product
AND BusinessName = @BusinessName
请注意,这并不意味着任何动态 SQL 方法都容易受到 SQL 注入的影响 - 如果需要,很有可能使用动态 SQL 来阻止 SQL 注入:
CREATE PROCEDURE [dbo].[USP_BusinessSearch]
@Product INT = NULL,
@BusinessName VARCHAR(100) = NULL
AS
DECLARE @ParamDefinition AS NVARCHAR(MAX)
DECLARE @BaseQuery AS NVARCHAR(MAX)
SELECT @BaseQuery = N'Select * FROM Business WHERE ProductID = @Product AND BusinessName = @BusinessName',
@ParamDefinition = N'@Product INT, @BusinessName VARCHAR(100)'
EXEC SP_EXECUTESQL @BaseQuery, @ParamDefinition, @Product, @BusinessName
END
这种方法与问题中的过程之间的主要区别在于,问题中的查询只是将参数值连接到动态 SQL 中,从而使其容易受到 SQL 注入的影响,而答案中的过程则以预期使用的方式使用参数 - 作为参数。
评论
0赞
Zohar Peled
3/14/2019
@Damien_The_Unbeliever谢谢!
0赞
Jaihind
3/14/2019
@ZoharPeled感谢您的回复,这对我有帮助,但我想知道一些前端验证来停止 sql 注入,例如 jquery 验证或正则表达式。
0赞
Zohar Peled
3/14/2019
清理输入并不是防止 SQL 注入的完全证明的方法。参数是(好吧,至少在正确使用的情况下)。如果您发现需要查询未知的表或列(无法参数化),则可以将其列入白名单,如本答案所示。QUOTENAME
评论
Select * FROM Business WHERE ProductID = @Product AND BusinessName = @BusinessName