0

C# フォーム ベースの Web アプリケーションがあります。Acunetix Web スキャナーを使用してアプリケーションをスキャンすると、モジュールの追加セクションでブラインド SQL インジェクションが発生します。Acunteix によって生成されるレポートは次のとおりです。

POST (multipart) input ctl00$ContentPlaceHolder1$ddlRecommendoffer was set to -87
POST / 

この ddlRecommendoffer はドロップ ダウン リストであり、データベースから値を取得します。データベースにフォームを保存しているときに、このドロップ ダウンの値を次のように取得しています。

 ddlRecommendoffer.SelectedValue.ToString()

DDL 値は理想的には int(データベースからの行の ID) である必要があります

SQLインジェクションを停止する必要があるデータベースに挿入するためにパラメーターを含むストアプロシージャを使用していますが、なぜこのフィールドにBLIND SQL INJECTIONが表示されるのですか..

4

1 に答える 1

1

SQL インジェクションは、SQL ステートメントの結果がユーザーに返されない場合など、インジェクションの試行から直接的なフィードバックがない場合、ブラインドと呼ばれます。

パラメータを使用してクエリを動的に構築する場合、ストアド プロシージャを使用していても、アプリケーションは依然として脆弱である可能性があります。

Create Procedure sp_EmployeeSelect
  @EmployeeName NVarchar(100)
AS
  Declare @SQLQuery AS NVarchar(4000)
  SET @SQLQuery = 'SELECT * FROM tblEmployees 
    WHERE EmployeeName LIKE ''%' + @EmployeeName + '%'''
  EXECUTE sp_executesql @SQLQuery
GO

ここでは、適切にフォーマット/エスケープされていないため、EmployeeNameを介して SQL を挿入できます。

ただし、パラメータ化された形式を使用すると安全です。

Create Procedure sp_EmployeeSelect
  @EmployeeName NVarchar(100)
AS
  Declare @SQLQuery AS NVarchar(4000)
  Declare @ParamDefinition AS NVarchar(2000)
  SET @SQLQuery = 'SELECT * FROM tblEmployees 
    WHERE EmployeeName LIKE ''%'' + @EmployeeName + ''%'''
  SET @ParamDefinition = '@EmployeeName NVarchar(100)'
  EXECUTE sp_executesql @SQLQuery, @ParamDefinition,
    @EmployeeName
GO
于 2013-08-03T05:54:08.820 に答える