Как предотвратить SQL-инъекцию с помощью регулярных выражений или любым другим способом в asp.net - PullRequest
0 голосов
/ 14 марта 2019

Прежде чем спросить - я знаю, что хранимая процедура - лучший способ предотвратить инъекцию 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

Заранее спасибо.

1 Ответ

3 голосов
/ 14 марта 2019

Я искренне надеюсь, что опубликованная вами процедура не является той, которую вы используете в производственной среде, потому что она вообще не безопасна. Тот факт, что вы используете параметры, не означает, что вы защищены от 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-инъекций, тогда как процедуры в ответах используют параметры способ, которым они предназначены для использования - в качестве параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...