2017-12-28 54 views
2

は、私はSQLインジェクション攻撃から保護するために、サーバー上では、このPostgreSQLの関数にSQLをラップすることでSQLインジェクション攻撃から保護できますか?

CREATE FUNCTION create_user(_firstName text) 
RETURNS void AS $$ 
    INSERT INTO user_account (first_name) VALUES (_firstName); 
$$ LANGUAGE sql; 

のような機能を利用できますか?その後、私はちょうど

client.query(`SELECT create_user(${someUserInput})...` 

または私はまだparameterized queries with placeholders,

client.query(`SELECT create_user($1)`, [someUserInput]) 
+0

[dba.se]への移行の場合は、このフラグを設定してください。 –

+0

@EvanCarroll - なぜそれをDBAに移動するのですか?これは、実際にはDB管理、アーキテクチャ、またはクエリの最適化に関する質問ではありません。あまりいい気分だよね? –

+0

いいえ、特定のプログラミング言語やデータベースとの関係、* SQLインジェクション*のようなものを使用する補助的なトピックとは何も関係がないためです。私はこれを言うつもりですが、私はそれもここでも話題になっていると思います。そして、あなたはいつもあなたが欲しいものをすることを歓迎します。 –

答えて

3

問題(エクスプロイト)

client.query(`select create_user(${someUserInput})` 

とどうなるかがある問題を使用する必要があります、クライアント上でこれを実行することができます

let someUserInput = `'foo'); DROP DATABASE bar;`; 

それはあなたの電話に、

client.query("select create_user('foo'); DROP DATABASE bar;")` 

のように送信されます。はい、create_userへの引数は注入から保護されていますが、それへの呼び出しは保護されていません。

ソリューション

  1. 使用プレースホルダ(当然の選択:ほとんどのフェイルセーフと安全なソリューション)
  2. ようなもので、それを引用するクライアント・ライブラリを使用しsomeUserInputが正しく

    1. を引用していることを確認PQescapeLiteral
    2. サーバーに2回目の実行を使用して、quote_literalで引用します(プレースホルダーが必要です)。 dersとにかく)。 SELECT quote_literal($1);

私は引用機構を自分で作成しようとしないでしょう。

関連する問題