目次
SQLインジェクションについて
SQLインジェクションとは、第三者がSQLコマンドを悪用してデータベースの情報へ不正アクセスし、情報を搾取や改ざん削除する攻撃手法である。
SQLインジェクション対策
- 入力値を制限する
- 入力値をいったん変数に格納する
- エスケープ処理、サニタイジングを行う
- 常に最新の環境を保つ
- セキュリティソフトWAFを導入する
上記5つの対策があるが、「2. 入力値をいったん変数に格納する」対策方法についてピックアップする。
入力値をいったん変数に格納する
入力された文字列をそのままSQL文として利用せず、いったん変数に格納する対策方法です。あらかじめプリペアドステートメントと呼ばれるSQL文を用意しておき、その一部をプレースホルダと呼ばれる予約場所に設定しておきます。その後、プレースホルダに入力データを割り当てる(バインドする)ことによりスクリプトの実行を防ぐことができます。
今回は、PHPのPDOを用いた方法を使ってみることにする。
bindValue()関数
PDOステートメントのbindValueは、値をパラメータにバインドします。
bindValue(`param`:name, `value`$name, `type`PDO::PARAM_STR);
param
名前つきプレースホルダを使用するプリペアドステートメントの場合は、 :name 形式のパラメータ名となる。
value
パラメータにバインドする値。入力値。
type
パラメータに対してPDO::PARAM_ 定数 を使った明示的なデータ型を指定する。
名前付けされたプレースホルダを用いてプリペアドステートメントを実行する。
$stmt = $dbh->prepare("SELECT name, id, password FROM user WHERE id = :id AND password = :password");
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
$stmt->bindValue(':password', $password, PDO::PARAM_STR);
$stmt->execute();
$id
はint型である。
$password
はcharacters,char型である。
疑問符プレースホルダを用いてプリペアドステートメントを実行する方法もあるので、詳細はPHP公式リファレンスを見て頂けたら幸いです。
参考
著者: E.R (株式会社ウィズツーワン)