2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

bindValueでSQLインジェクション対策

Last updated at Posted at 2024-02-22

目次

  1. SQLインジェクションについて
  2. SQLインジェクション対策
  3. bindValue()関数

SQLインジェクションについて

SQLインジェクションとは、第三者がSQLコマンドを悪用してデータベースの情報へ不正アクセスし、情報を搾取や改ざん削除する攻撃手法である。


SQLインジェクション対策

  1. 入力値を制限する
  2. 入力値をいったん変数に格納する
  3. エスケープ処理、サニタイジングを行う
  4. 常に最新の環境を保つ
  5. セキュリティソフトWAFを導入する

上記5つの対策があるが、「2. 入力値をいったん変数に格納する」対策方法についてピックアップする。


入力値をいったん変数に格納する

入力された文字列をそのままSQL文として利用せず、いったん変数に格納する対策方法です。あらかじめプリペアドステートメントと呼ばれるSQL文を用意しておき、その一部をプレースホルダと呼ばれる予約場所に設定しておきます。その後、プレースホルダに入力データを割り当てる(バインドする)ことによりスクリプトの実行を防ぐことができます。

今回は、PHPのPDOを用いた方法を使ってみることにする。


bindValue()関数

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 (株式会社ウィズツーワン)
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?