PL / pgSQLのSQLクエリは、プリペアドステートメントのように計画されています。 値のみを渡す限り あなたと同じように、SQLインジェクションは一般的に不可能です。 。詳細:
EXECUTE
で動的SQLを使用する SQLインジェクションを実際に示すための適切なパラメータ処理なし。
のように(これはない方法です それをするために!):
CREATE OR REPLACE FUNCTION login_v(em varchar, passwd varchar)
RETURNS SETOF users AS
$func$
BEGIN
RETURN QUERY EXECUTE
'SELECT *
FROM users
WHERE email = $1
AND encrypted_password = crypt(''' || passwd || ''', encrypted_password)'
USING em;
END
$func$ LANGUAGE plpgsql;
最初の変数em
USING
で適切に渡されます 値としての句 したがって、SQLインジェクションに悪用することはできません。
しかし、2番目の変数passwd
適切にエスケープせずに不適切に連結されます。したがって、ユーザー入力をSQLコードに変換できます。 SQLインジェクション。
これは絶対に使用しないでください! それをしない方法を示す場合を除いて。
クライアントでSQL文字列を不適切に連結すると、同様のいたずらが発生する可能性があります。