4

PostgresSQL でそのようなものを使用する場合、SQL インジェクションに対して安全かどうかを知りたいです。

CREATE or REPLACE FUNCTION sp_list_name( VARCHAR )
RETURNS SETOF v_player AS '
   DECLARE
      v_start_name ALIAS FOR $1;
      r_player  v_player%ROWTYPE;
      v_temp VARCHAR;
   BEGIN
      v_temp := v_start_name || ''%'';
      FOR r_player IN
         SELECT first_name, last_name FROM v_player WHERE last_name like v_temp
      LOOP
         RETURN NEXT r_player;
      END LOOP;
      RETURN;
   END;
' LANGUAGE 'plpgsql' VOLATILE;

この関数を使用して、文字で始まるプレーヤーの名前を一覧表示したいと考えています。

select * from sp_list_name( 'A' );

名字が A で始まるプレイヤーを教えてくれます。

SQLを注入しようとしました

select * from sp_list_name( 'A; delete from t_player;--' );
select * from sp_list_name( '''; delete from t_player;--' );

私は安全ですか?

どのような場合に注射できますか?

よろしく

4

7 に答える 7

7

SPの変数はコードに展開されないため、手順に関しては安全に見えますが、アプリケーションコードSELECT * FROM sp_list_name(?);で " "などのパラメーター化されたクエリを使用しない場合でも、自分自身を公開できます。" " のようなものは、" " の開始名を渡すユーザーによって覆される可能性があります。そのため、パラメーター化されたクエリを使用するか、プログラムの入力を健全性チェックしてください。SELECT * FROM sp_list_name('$start_name');');delete from t_player where last_name NOT IN ('

注意:ストアド プロシージャ内の変数は、' または ; が含まれていてもコードに展開されないこと に注意してください(手動でロールされた関数ではなく、を使用するEXECUTEに渡すことを除く)。or ' は完全に不要であり (ストアド プロシージャでは、それを使用するアプリケーションはもちろん別の話です)、常に " " または " " チームを見つけることができなくなります。quote_literalreplacetl;drO'Grady

Leo Moore、Karl、 LFSR Consulting : v_temp_nameストアド プロシージャはSP のコードに展開されず ( EXECUTEなし)、SP ではなくアプリケーションでチェックを行う必要があります (または、OP はパラメーター化されたクエリを使用するだけです代わりにアプリコードで)。他の人が示唆していることは、心配することに似ています

my $bar = "foo; unlink('/etc/password');"; 
my $baz = $bar;

evalがない場合に実際にリンク解除を実行します。

于 2009-03-09T21:43:14.883 に答える
6

SQL インジェクションを防ぐためのルール #1: 誰か/信頼できない/制御できないものからのすべての入力をサニタイズします。

問題自体はデータベース コード内にあるのではなく、それらのステートメントを実行しているアプリケーションにあります。

于 2009-03-09T20:40:57.983 に答える
4

SQL インジェクションから保護する適切な方法は、ホワイト リスト* を使用することです。長い文字と短い文字は、受け入れて除外する文字に設定されます。

間違った方法はブラックリストです- 受け入れられない文字をブラックリストに登録すると、攻撃者に追いつくことができないため、問題が発生します。ASCII テーブル、エスケープ文字などを介してブラック リストを回避する方法があります。

また、あなたのサイトで試してみると良いチート シートがあります。いくつかのテストを実行し、失敗するようにしてください。

*アプリケーションでは、DB ではありません (Thanks James)

于 2009-03-09T22:19:47.060 に答える
1

参考文献 ホワイトリスト。これは、他の特定の条件が守られていれば問題ありません。すべての入力を最も単純な形式に分解することが絶対に必要なので、SQL クエリ名、一重引用符などをチェックするだけではいけません。それらは他の文字セットを使用して表現またはエンコードすることができ、ホワイト リストの一部を形成するのはこれだけではありません。 SQL キーワード自体。

私は、保護されたリソースへのユーザー名/パスワードを許可する特定のクライアントのために働いていました (最終的には、空港の安全な部分へのアクセス パスを取得できます!)。' を入力し、そこから SQL クエリを作成してユーザー アカウントとパスワードを取得することで、ログオン フィールドを回避できます。

問題は、クライアントが、これまで Web 開発を行ったことのないベンダーにサイトを構築するために、すでに 20 万ポンドを費やしていたことです。修正はさらに 60,000 ポンドでした。これは、union、select、having et al キーワードのみをチェックする validate func() でした。カニコライゼーション/エンコーディングのために何をしたかについて尋ねられたとき(私はそれを説明しなければなりませんでした)、それはタンブルウィードの時間でした.

Dev house と (高価な) Project は缶詰になりました。

于 2009-03-11T13:05:16.967 に答える
1

自分で SQL を生成しているわけではないので、これは安全に見えます (私には)。

ストアド プロシージャを呼び出しているデータがどこから来ているのかわかりません。そのため、バッファ オーバーフローなどを防ぐ必要があります。

于 2009-03-09T20:39:46.800 に答える
-1

あなたはの内容を検証することを検討することができます

v_start_name
。文字列でセミコロン、コメント文字、等号などを確認します。文字と16進値の両方を確認することを忘れないでください。ハイフンでつながれた名前を許可することを忘れないでください。たとえば、「Smith-Brown」は受け入れられる可能性があります。「Smith--Brown」は潜在的に注入です。

SQLインジェクションの16進数に精通していない場合は、以下を簡単に紹介します。

http://www.arejae.com/blog/sql-injection-attack-using-t-sql-and-hexadecimal.html

http://www.securityfocus.com/infocus/1768

宣言する
      v_start_name ALIAS FOR $ 1;
      r_player v_player%ROWTYPE;
      v_temp VARCHAR;
   始める
      -ここに新しい擬似コード
      v_start_nameに不正な文字がある場合はエラーメッセージで終了します
      -ここで擬似コードを終了します
      v_temp:= v_start_name || ''%'';
      r_playerINの場合
         SELECT first_name、last_name FROM v_player WHERE last_name like v_temp
      ループ
         次を返すr_player;
      ループを終了します。
      戻る;
   終わり;

よろしくカール

于 2009-03-09T21:57:56.283 に答える
-2

「;」を削除するには、v_start_nameを置き換えてください。など。

v_clean_name VARCHAR;
Select v_clean_name = Replace(v_start_name,';','');

これは;を置き換えます。SQLインジェクション攻撃を阻止するブランク付き

詳細については、PostgresSQLの文字列関数を参照してください。

LFSRコンサルティングもコメントしています。BlackListよりもWhiteList(つまり、「;」などの無効な文字を含む入力を処理しない)を使用することをお勧めします(つまり、ユーザーが置換に対してSQLインジェクション攻撃を行う可能性があるため、データをクリーンアップしようとします)。

詳細については、SQLインジェクション攻撃をご覧ください。

于 2009-03-09T22:01:50.080 に答える