「安全な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つでは収まらない・・・?
コメント