SQLインジェクション

SQLインジェクション

利用者からの入力情報を元に、SQL文を構築している場合、SQL本文に問題があると 悪意を持った第三者に不正に利用される可能性があります。

発生する可能性のある驚異

  • データベースに格納されている情報の閲覧

  • データベースへの情報変更/消去

  • 不正ログイン

  • ストアドプロシージャなどを利用したOSコマンドの実行

実装例

以下Perlの実装例になります。

        $query = "SELECT * FROM usr WHERE uid = '$uid' AND pass = '$passh'";
        $sth = $dbh -> prepare($query);
        $sth -> execute();

上記データの呼び出しでは、$uidに対するエスケープ処理が欠落しているために、 不正な文字列が入力された際には、SQLの一文と解釈され、情報の不正な引き出し等が、 行われる可能性があります。

例えば「'akiko'--」という文字列がユーザーにより入力されたと仮定します。 入力されたハイフンの繰り返しはそれ以降の内容(SQLの要求)をコメントとし、 無視します。 そのため、実際に入力されるSQL文は

    SELECT * FROM usr WHERE uid = 'akiko'--

となります。

もし、ユーザーIDakikoが存在している場合、パスワードの入力をせず、ログインが 可能となってしまいます。

対策

プリペアードステートメントでプレースホルダを使う。

(DBIモジュールのprepare()メソッドに、SQL文を指定する際、プレースホルダを利用し、 変数に該当する箇所を?にする)

エスケープ関数を利用する。