0

を使用して SQL インジェクションを防止するEXECUTE AS

SQL インジェクションを防ぐ方法の 1 つは、ログインせずにデータベース ユーザーを作成することだと言われました。

CREATE USER User1 WITHOUT LOGIN
Go

GRANT DELETE ON T1 to User1
Go

create proc [dbo].[t1]  (@ID  INT)
with execute as 'user1'
as 
begin

    declare @sql as varchar(500)
    SET @sql = 'delete from T WHERE ID = @ID'
    exec (@sql)

end

私の質問は、User1 にはログインする権限がないため、上記の手順をどのように使用できるでしょうか?

4

1 に答える 1

1

確かにそのような技術があります。
ログインせずにユーザーを作成し、慎重に選択した権限をそのユーザーに割り当ててから、そのユーザーのコンテキストをストアドプロシージャまたは個々のexecuteステートメントに適用します。

ユーザーにはログインがないため、このユーザーの下でサーバーに直接接続することはできません。また、権限がないため、そのユーザーに直接なりすますことはできません。このシナリオでは、そのユーザーに「なる」唯一の方法はexecute as、ストアドプロシージャの作成者(逆に、ログインのないユーザーになりすます権限を持っている)によって句が追加されたストアドプロシージャまたはコマンドを実行することです。

この手法は特定の状況でまさに必要なものですが、質問で示している形式でのSQLインジェクションを防ぐために使用することはありません。この手法は、部分的に信頼できるユーザーが、オブジェクト名やSQLキーワードの代わりに使用される入力を提供できるようにする必要がある場合(つまり、ユーザーが作業するテーブルの名前を提供する場合、またはユーザーが独自のwhere条件を作成して、分析せずに実行することができます)。ただし、質問で示している種類のものについては、クライアント側でパラメーター化されたステートメントを使用し、サーバー側でパラメーターを使用します。

create proc [dbo].[t1]
  @ID  INT
as 
begin
  delete from T where ID = @ID;
end

(悪い例ですが、パラメーターはですintので、連結してもSQLインジェクションはできません。)

于 2012-05-08T15:35:37.953 に答える