vol.1 ‐ 『DBとセキュリティ今昔』

お初にお目にかかるかたもいらっしゃるかと思いますので、簡単に自己紹介などさせていただければ。
このたび、こちらでしばらくの間コラムを書かせていただくことになりました、古庄ともうします。よろしくお願いいたします。
「上級試験対策連載コラム」とのことなので、コラムでは「試験対策」と「実務」とを良い感じで混ぜつつ、時々違う要素などをスパイス的にあしらって行ければ、と思います。

今回のお題はDBで、その中でも「セキュリティ」の話に傾けたあたりを展開することにいたしましょう。

なんと言っても「SQL-Injection」

DB関連の脆弱性といえば、なんと言っても「SQL-Injection」が最大級のインパクトになります。
SQL-Injectionの脆弱性ががっつりと存在すれば、DBの中身を「読んでよし」「書いてよし」「消してよし」の3連続コンボが完成するので、脆弱性の診断などでもこれがあると大抵「緊急警報」レベルで連絡がいくようなごっつい脆弱性です。
実際問題、IPAさんでも、「安全なウェブサイトの作り方」というPDFを出してますが、SQLについてはわざわざ、これとは別に「安全なSQLの呼び出し方」というPDFを出しているあたりからも、その温度感がうかがわれようというものです。
「その割には今でも時々この脆弱性に起因しているっぽい悲鳴がニュースに持ち上がるよねぇ」という物騒な話は置いておきまして、対策についても色々と検討され練られているのが昨今の一般的な状況かと思われます。

古くは「エスケープ処理を用いてSQL文を安全に組み立てる」という方法が提議され、今でも「他の手段がとれない場合におけるやむを得ない緊急手段」として生存は確認されておりますが、どちらかというと「可能な限り博物館行きにしたい」対応であります。
実際問題、上級試験用の本テキスト「プログラミングPHP 第2版」においても、エスケープ処理は「最適」とは呼称されておりません。

試験の話からは少しそれますが、実務的には大切なので少しだけ書いておきますと。
エスケープはそもそもまず「漏れる可能性」が危険ですし、文字コードによって微妙に不安があります。いつもながら「なんでShift jisは中に0x5cとかってキャラクタコードを持つかね」と煩悶する瞬間です。
いずれにしても面倒なので、ぶっちゃけた所「エスケープしか手段がとれない」状況を打破したほうが現実的であります。
インフラを司るあたりと、交渉その他を繰り広げるのが得策でしょう。

一応念のために書いておきますと、PHPでは「DB毎に、エスケープ用の関数」があります。
実務で使う可能性は低いのですが(低いはずです)、試験対策としては、ほんのりと記憶に入れておくとよいでしょう。

本命は「プリペアドステートメント」

さて。SQL-Injectionにおいて、では何が本命であり最適か、と問われればそれは「プリペアドステートメント」です。(静的|動的)プレースホルダ、バインド機構なんて呼称もありますが。
厳密には「準備された文(プリペアドステートメント)」でSQLを準備し、この準備したSQLに対して値を「バインドする」流れですね。

PDOを使う場合、prepareメソッドで「準備された文」を用意します。戻り値には「準備された文を含む、PDOStatementクラスのインスタンス」が返ってきます。
PDOStatementインスタンスのbindParamメソッド(またはbindValueメソッド)で値をバインドしてから、PDOStatementインスタンスのexecuteメソッドでSQLを実行する、というのが基本的な流れです。

静的/動的は、多分試験にはでないのですが、実務としては「結構高いレベルで」重要なので、違いについては把握をしておいてください。
動的プレースホルダは「プレースホルダ相当の機能を擬似的にエミュレートしている」だけなので、可能な限り避けた方がよいでしょう。
一方で静的プレースホルダは「原理的に安全」なので、とても安心して使えます。

ちなみにPDOの場合は、PDOのインスタンスに対して

$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

とやって、明示的に「静的プレースホルダ」を指定する必要があります。
これも試験では出ないと思いますが、実務上は極めて重要ですので、覚えておくとよいでしょう。

次回は、プレースホルダをもう少し細かく分解していければ、と思います。

Rails初級者に朗報!全額補助で中級にステップアップ!

古庄道明氏

古庄 道明 氏

1970年浅草生まれ 1995年に富士通系のソフトハウスに就職しプログラマに転身。1999年個人事業主として独立し現在に至る。「寺子屋」「格子組」といったエンジニア支援活動を独自に展開し、占い師時代の「ガルーダ」という占い師名にちなんだ「がる先生」の愛称で親しまれている。
コンサルティングからシステム設計、ネットワークにセキュリティと、守備範囲は比較的多岐に渡る。「技術の基本は、その技術がない時の"困ってる"が根っこ」をモットーに、古い話から現代へ歴史をたどるように教えるのが持ち味。

※本サイトに掲載されているテクニカル・コラムは、掲載時点で公開されている情報をもとに執筆者の視点で書かれたものです。弊社及び執筆者は本テクニカル・コラムの内容について一切保証をいたしません。また、技術的な問い合わせについても対応いたしかねますので予めご了承ください。

お仕事のご紹介には、まずヒューマンリソシアへの登録が必要です。
ヒューマンリソシア人材派遣サイトの便利な機能 ・お気に入りの派遣求人のブックマーク ・登録会への予約 ・有給休暇の管理 ・WEB給与明細の確認 ・お気に入りの情報をメール受信
登録会の入力手続きをあらかじめおこなえます。

ヒューマンリソシア派遣サービスに 登録する 無料

ページトップへ戻る