2012-02-14 7 views
3

でドル引用符で囲まれた文字列に$$入れ:は、私はPostgresの中の関数を持っているPostgreSQLの

CREATE OR REPLACE FUNCTION upsert(sql_insert text, sql_update text) 
RETURNS integer AS 
$BODY$ 
BEGIN 
EXECUTE sql_insert; 
RETURN 1; 
EXCEPTION WHEN unique_violation THEN 
EXECUTE sql_update; 
RETURN 2; 
END; 
$BODY$ 
LANGUAGE 'plpgsql' VOLATILE 
COST 100; 
ALTER FUNCTION upsert(text, text) OWNER TO dce; 

私は通常、その機能を呼び出すために、このクエリを使用します。

select upsert(
    $$INSERT INTO zz(a, b) VALUES (66, 'hahahaha')$$, 
    $$UPDATE zz SET a=66, b='hahahaha' WHERE a=66$$ 
) 

それは動作します。残念ながら、私のクエリ文字列が$$を含めることはできません、次のように:

select upsert(
    $$INSERT INTO zz(a, b) VALUES (66, 'ha$$hahaha')$$, 
    $$UPDATE zz SET a=66, b='hahahaha' WHERE a=66$$ 
) 

私はthis Postgresのドキュメントを読みましたが、まだそれを行う方法援助を必要とします。

+0

[あなたはあなたの答えを持っていますか?](http://meta.stackexchange.com/a/5235/169168) –

答えて

6

ので、代わりに別のdollar-quoteを使用します。

 
select upsert(
    $weird_string$INSERT INTO zz(a, b) VALUES (66, 'ha$$hahaha')$weird_string$, 
    $weird_string$UPDATE zz SET a=66, b='hahahaha' WHERE a=66$weird_string$ 
    ) 

これはまだドル引用符は、文字列内の一致するかもしれないという理論的な可能性を残します。

クエリを手動で作成する場合は、文字列に$が含まれているかどうかを確認してください。 変数からクエリを作成する場合は、代わりにquote_literal(querystring)を使用できます。

Postgres 9.1以降、便利なformat()機能もあります。

私はこの形式の動的SQLがSQLインジェクションに対して非常に脆弱であることを認識していると思いますか?この種のものは、非常にプライベートなもの、または非常に安全なものだけを使用してください。

+0

ありがとう、アーウィン。 – ilyasfals

+0

それは動作します!私は前にそのタグを知らなかった。 – ilyasfals

+0

私はvariables.Soでクエリを構築する、私はquote_literal()を使用すると思います。それは非常に便利です。 – ilyasfals

関連する問題