PDOとプリペアド・ステートメントと静的プレースホルダ(安全なSQLの呼び出し方の補足)

安全なSQLの呼び出し方」の補足。
今夜こそわかる安全なSQLの呼び出し方 ~ 高木浩光氏に聞いてみた - @ITを読んで、モヤっとしてたことがわかった。

SQLインジェクションについて以下の記事で勉強してたけど、まだまだ未熟。
SQLインジェクション(安全なウェブサイトの作り方)
リテラルとSQLインジェクション(安全なSQLの呼び出し方)
SQLの呼び出し方(安全なSQLの呼び出し方)
データ ベースと連動したSQL文生成(安全なSQLの呼び出し方)

安全なSQLの呼び出し方」で静的プレースホルダが最もセキュアだと結論に達し、PHPの静的プレースホルダって何だろーと調べた。
そしたら、PHPにはDBへの接続方法が3種類あり、その中でPDOが最も良さそうだと思った。

ただ、PDOの説明にプリペアド・ステートメントなる用語が多々あり、「?」になったのである。
プレースホルダとの関係はいったい!?

1.プリペアド・ステートメントと静的プレースホルダ

プリペアド・ステートメントとは何?
今夜こそわかる安全なSQLの呼び出し方 ~ 高木浩光氏に聞いてみた - @ITより引用。

SQLの実行は、SQL文を構文解析する作業と、それを解釈する作業に分かれる。プリペアド・ステートメントというのは、この構文解析をDBMS側で先に済ませておき、そこにパラメータを当てはめて繰り返し使うことで、処理効率を高めるために活用されるものだ。

ん?
この説明、静的プレースホルダに似てるな・・・?
と思っていたら以下の文。

「安全なSQLの呼び出し方」では、プリペアド・ステートメントのことを「静的プレースホルダ」と呼んでいる。「プレースホルダ」に関連する機能は呼び名がさまざまで、「バインド機構」と呼ばれることもある。

・・・つまり、「プリペアド・ステートメント = 静的プレースホルダ 」ということ。
統一しておいてー。

SQLインジェクション対策として考える場合、バインドすることが本質ではなく、バインドする場所「プレースホルダ」を用意することが本質であることから、「プレースホルダ」の用語で統一することにした。真のプリペアド・ステートメントのことを「静的プレースホルダ」と呼び、なんちゃってプリペアド・ステートメントのことを「動的プレースホルダ」と呼んで整理している

「安全なSQLの呼び出し方」に書いてほしかった・・・
ようやっと「静的プレースホルダ」と「動的プレースホルダ」の違いがわかった気がする。

ちなみに、プリペアドは「用意された」、ステートメントは「一つの指令を与えるための文」といった意味がある。
用語から役割は推測できるね。

2.PDOについて

PDO(PHP Data Objects)とは、同じ命令で様々なDBへ接続できる、DB接続クラスのこと。
プリペアド・ステートメントが使える。

PHPはMySQLやPostgreSQLなどのDBへ接続できるが、その接続を同じ命令でできるようにするのがPDO。
こういうのをデータアクセス抽象化レイヤと呼ぶ。

つまり、PDOとは、データアクセス抽象化レイヤとして機能し、プリペアド・ステートメントを用いてセキュアで高速にDBアクセスができる。
静的プレースホルダか動的プレースホルダかは指定することができる

この辺を今後やっていきたい。
てか PDOで記事1つ書けそうだな、むしろ1つでは収まらない・・・?

参考

今夜こそわかる安全なSQLの呼び出し方 ~ 高木浩光氏に聞いてみた - @IT

PHPでデータベースに接続するときのまとめ

PDOで接続、SELECT、プリペアドステートメントとは(PHPでMySQLに接続) – Qiita

コメント

タイトルとURLをコピーしました