PHP セキュリティ データベース

PHPのPDOにて静的プレースホルダを使用してデータベースにアクセスする方法。MariaDB。プリペアドステートメント。

コトの発端

PHPのPDO経由でデータベースにアクセスするときに、特に指定しないとPHP側にてプリペアドステートメントがエミュレートされてクエリの作成が行われる。(動的プレースホルダ)

クエリの準備はDB側で行われた方(静的プレースホルダ)が仕組み上安全な気がするので、PHP側にてエミュレートされないようにしたい。

エミュレートをオフにする方法をいつも忘れてググってるので記録しておく。

解決編

PDOのインスタンス作成時に「PDO::ATTR_EMULATE_PREPARES => false」を下記の通り指定しよう。

$dbh = new PDO($dsn, $user,$password,
        array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false));

本当にプリペアドステートメントがDBで実行されているかどうかについては、詳細ログを有効にしてPrepareされてからExecuteされているかを確認するとよい。

ワイのMariaDB環境で詳細ログを確認したところ、正常にPrepareからのExecuteされている様子であった。

参考

【PHP】PDOの静的プレースホルダと動的プレースホルダの違いを確認する

https://qiita.com/7968/items/7ddd59b94eb5a4fb6eaf

MySQLのログについて確認する

https://qiita.com/toshihirock/items/a97d174be68f485fbbf2

いつもの

記事の正確性については無保証です。

  • この記事を書いた人
あっきー

あっきー

とある企業の研究者。研究分野以外に手を出しすぎて毎日が慌ただしい。 研究者の肩書きが正しいかどうかは万年の謎。 得意ジャンルはデータベースとセキュリティーですが、AIやIoT、アプリ開発など、手広く活動しています。

-PHP, セキュリティ, データベース
-, ,

Translate »