2017-01-16 8 views
1

でSQLインジェクションを発揮select login_v('[email protected]'' OR 1=1;--','la la la');を、私は私の方法は、電子メール[email protected]をユーザに返すべきだと思います。私は間違って何をしていますか?私はplpgsqlがこの機能を持っているPL/pgSQLの

ここではエクササイズのコンセプトを示すためにSQLインジェクションが必要ですが、私はSQLインジェクションとplpgsqlブーブです。 :|

答えて

3

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文字列を不適切に連結すると、同様のいたずらが可能です。

関連する問題