sql >> データベース >  >> RDS >> PostgreSQL

PL/pgSQLでのSQLインジェクションのデモンストレーション

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




    1. 日、月、年を整数として指定してSQLServerで日付を作成する方法

    2. SQLServerデータベースをAzureSQLデータベースに移行する方法

    3. 従属列のALTERTABLE

    4. ブレークラインを「\n」に置き換えます