PHPのPDOでSQLインジェクション対策を行う方法について確認しました。
※目次をクリックすると目次の下部にコンテンツが表示されます。
PDOでquoteメソッドを使ってエスケープ
●危険なコードの例
<?php require("dbinfo.php"); $id = $_GET['id']; $name = $_GET['name']; $dsn = 'mysql:host=localhost;dbname='.$database.';charset=utf8'; try { $dbh = new PDO($dsn, $username, $password,array(PDO::ATTR_EMULATE_PREPARES =>false,PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET `utf8`")); } catch (PDOException $e) { exit('データベース接続失敗。'.$e->getMessage()); } $sql = sprintf("SELECT id,name FROM s_table WHERE id = '%s' AND name = '%s'",$id,$name); $st = $dbh->query($sql); echo json_encode($st->fetchAll(PDO::FETCH_ASSOC)); ?>
それぞれのパラメータに下記のような値が入力されるとすべての情報が取得されてしまいます。
id = 12345
name = “‘ OR ‘A’ = ‘A”
●エスケープ処理で対処
下記のように入力パラメータをquoteメソッドでエスケープ処理します。
$sql = sprintf(“SELECT id,name FROM s_table WHERE id = %s AND name = %s”,$dbh->quote($id),$dbh->quote($name));
プリペアドステートメントを使ってSQL実行
require("dbinfo.php"); $id = $_GET['id']; $age = $_GET['age']; $dsn = 'mysql:host=localhost;dbname='.$database.';charset=utf8'; try { $dbh = new PDO($dsn, $username, $password, array( PDO::ATTR_EMULATE_PREPARES =>false, PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET `utf8`" ) ); } catch (PDOException $e) { exit('データベース接続失敗。'.$e->getMessage()); } $st = $dbh->prepare('SELECT id,age FROM s_table WHERE id = :id AND age = :age'); $st->bindValue(':id', $id , PDO::PARAM_STR); $st->bindValue(':age', $age, PDO::PARAM_INT); $st->execute(); echo json_encode($st->fetchAll(PDO::FETCH_ASSOC)); ?>
●コードの説明
①PDO::prepare
・PDOStatement::execute()メソッドによって、実行されるSQLステートメントを準備
・SQLステートメントは、文が実行されるときに実際の値に置き換えられる0個もしくはそれ以上の名前(:name)もしくは疑問符(?)パラメータマークを含むことができる
②PDOStatement::bindValue
・プリペアドステートメントで使用するSQL文の中で、対応する名前あるいは疑問符のプレースホルダに値をバインドします。
③PDOStatement::execute
・プリペアドステートメントを実行
-
インストール、設定
- PHPの設定、更新時の参考情報メモ
- PHPのインストール
- CentOS6でPHP5.3からPHP7.1へアップデート
- CentOS6.10でPHP7.1からPHP7.2へアップデート
- CentOS Stream9でPHP7.4をインストールする手順
- CentOSでPHPのマルチバイト文字列(MBstring)関数を使えるようにする
- PHPでタイムスタンプをログファイルに記録
- PHPのバージョンが表示されないようにする
- セキュリティを考慮した/etc/php.iniの設定
- CentOS6でAPC(Alternative PHP Cache)をインストール、チューニング
- PHPスクリプトで出力データを圧縮する方法
- PHPの変数、スコープ
- PHPの型の概要、種類
- PHPのクラス操作の概要
- PHPの配列操作の概要
- PHPで文字列のマッチング
- require,require_once,include,include_onceの違い
- CentOS環境のPHPでPDOを使ってMySQLからJSONでデータ取得
- PHPでHTMLテーブルをJSONに変換
- PHPでディレクトリ内のファイル一覧をJSONで出力
- PDOを使ってテーブルに保存
- PDOでSQLインジェクション対策
- phpとpChartを使ってWebサイトにグラフ表示
性能
プログラミングの基本
PDO、データベース、JSON
その他