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文を指定する際、プレースホルダを利用し、 変数に該当する箇所を?にする)
エスケープ関数を利用する。