分123SQLインジェクションは古くから知られている代表的なWebアプリケーションの脆弱性です。JavaScript関連の脆弱性に比べると対処が非常に簡単であるにも関わらず,まだまだ多くのアプリケーションがSQLインジェクションに脆弱です。SQLインジェクションに脆弱なアプリケーションはPHPアプリケーションに限った問題ではありません。Java,Perlなど,ほかの言語で作成されたWebアプリケーションにもまだまだ多くのSQLインジェクション脆弱性が残っていると考えられます。重要なのは「正しく行えばSQLインジェクション対策は簡単」であることです。SQLインジェクションの動作原理SQLインジェクションの動作原理は単純で,解説するまでもないと思いますが,簡単に説明します。SQLインジェクションは,動的にSQL文を生成する際のパラメータに,プログラマが意図していない文字列を与えることにより,データを改ざんしたり盗むSQLクエリを実行させることです。以下のコードはSQLインジェクションに脆弱な典型的な例です。product⁠”が送信されると,適切な権限があれば,productテーブルのすべてのデータが削除されます。UNIONクエリを利用するとデータベース内のすべてのデータを自由に取得可能となる場合もあります。間違ったSQLインジェクション対策SQLインジェクションがなくならない原因の一つに,間違ったSQLインジェクション対策で完全にSQLインジェクションを防ぐことが可能である,といった誤解があります。エラーメッセージを表示しなければSQLインジェクションはできないORMを利用しているのでSQLインジェクションの心配はない入力時にバリデーションしているのでSQLインジェクションの心配はないすべての文字列はエスケープしているので心配はない信用できるデータはエスケープなしでクエリに利用できる(信用できないデータだけエスケープすればよい)これらすべては間違ったSQLインジェクション対策です。エラーメッセージ抑制による対策エラーメッセージを表示しなくても,SQLインジェクションによる攻撃は可能です。通常テーブル名,フィールド名は予測しやすい名前が付いています。テーブル名やフィールド名を予測しづらい名前にすることも可能ですが,簡単に防げるSQLインジェクションのために,著しくメンテナンス性を低下させるこのような手法を利用するのは間違ったSQLインジェクション対策といえます。エラーメッセージの抑制はSQLインジェクション対策として無意味でないですが,不十分極まりない対策です。備考:いずれにせよエラーメッセージにテーブル名,フィールド名,変数名,スクリプトのパスなどシステムの内部構造が分かるようなメッセージを表示してはなりません。これはSQLインジェクション対策以前のセキュリティ上の問題です。ORMに頼った対策ORMを利用していても,SQL機能を使用せず,ORMの機能だけで効率的なアプリケーションが作れる訳ではありません。筆者も時々みかけるのですが,ORMだけ利用しているために酷く効率が悪いアプリケーションがあります。このようなアプリケーションはSQLインジェクションに脆弱でなくてもDoSに非常に脆弱です。実行効率の問題もあるので一般的なORMライブラリはSQL文やSQL文の一部を指定してクエリを実行できるようになっています。ORMを利用していてもSQLの基礎知識は必要です。仮にHTMLフォームなどからの入力時に完全なバリデーションを試みていても,入力時のバリデーションに不具合があるケースは多くあります。動的にSQL文を作成するコードと入力をバリデーションするコードは別ファイルであることが多く,変数をSQL文の入力値として安全に利用できるか確認するには実行パスをたどって確認しなければなりません。このようなコードでは安全性の維持は容易ではありません。すべての文字列をエスケープする対策すべての文字列をエスケープしていてもSQLインジェクションが可能になってしまう場合がいくつかあります。これは不完全な入力バリデーションと組み合わされた場合に発生します。以下のバリデーションには明らかな間違いがあります。整数を期待している箇所に文字列を許しています。'.$id);ユーザ入力値をSQL文に利用するかしないかに関わらず,すべてのユーザ入力値は検証しなければなりません。上記の例は不完全なバリデーションによりSQLインジェクションが可能になる例ですが,後に解説する正しいSQLインジェクション対策を行っていればSQLインジェクション攻撃は行えません。別の特殊なケースでは,数値型のコラムによりSQLインジェクションが可能となる場合もあります。データベースのアクセス抽象化ライブラリを利用すると複数のデータベースを同じように利用可能になりますが,データベースエンジンによっては通常のRDBMSでは思いもよらない動作をする場合があります。PHP5からデフォルトでバンドルされ利用可能になったデータベースエンジンのSQLiteのテーブルコラムには,整数,浮動小数点,文字列などのデータ型を指定できます。実際にはすべて文字列型として保存しています。SQLiteでは数値型のフィールドにセカンドオーダSQLインジェクション攻撃用のSQL文字列を保存させることができます。通常のRDBMSに経験を持つ方には数値型フィールドに文字列が保存されていることは予想できないかもしれません。信用できないデータだけエスケープする対策ここまでに紹介した不完全な対策から推測できるように,信用できないデータだけエスケープする対策ではSQLインジェクションを許してしまう可能性があることが分かります。動的にSQL文を生成する場合,すべてのデータは信用できないデータとして処理するべきです。同校にてコンピュータサイエンスとビジネスを学ぶ。株式会社シーエーシーを経て,エレクトロニック・サービス・イニシアチブ有限会社を設立。オープンソース製品は比較的古くから利用し,Linuxは0.9xのころから利用している。オープンソースシステム開発への参加はエレクトロニック・サービス・イニシアチブ設立後から。PHPプロジェクトでは,PostgreSQLモジュールのメンテナンスを担当している。URL:http://blog.ohgaki.net/著書Webアプリセキュリティ対策入門〜あなたのサイトは大丈夫?Amazon楽天ブックスhontoヨドバシ.com[改訂版]PHPポケットリファレンスAmazon楽天ブックスhontoヨドバシ.comこの記事に関連する書籍Webアプリセキュリティ対策入門〜あなたのサイトは大丈夫?本書は,Webサイトのセキュリティ確保のために必要な基礎知識と,安全なコードを書くために必要な基礎知識を解説しています。Webアプリケーションは比較的簡単に作成で...はじめてのPHP言語プログラミング入門Webアプリケーション構築ツールとしてPHPを取り上げた書籍は数多くありますが,言語の解説・入門書としての書籍はあまりありません。2019」を開催しました。DAY1・DAY2の様子を注目セッションとともにお伝えします。LINEのエンジニア3名がイベントに先駆けて見どころを紹介します。コードの安全性・安定性を高める開発サイクル~テスト管理の効率を上げ,脆弱性診断を自動で行う~本連載では,連載「業務を改善する情報共有の仕掛け」を受けつつ,安全性・安定性を加えた開発サイクルについて考えていきます。若者世代から圧倒的な人気を誇るライブ配信&動画投稿コミュニティアプリ「MixChannel」(ミクチャ)の裏側(レコメンドシステムやサーバサイド開発など)について解説していきます。その他の連載CSS3アニメーションでつくるインターフェイス表現CSS3によるアニメーション表現を紹介していきます。その中でも,幅広い読者に応用してもらえるだろうインターフェイスを主なお題とします。MySQL道普請便り本連載では,MySQLを使ったアプリ開発・運用に関するノウハウをご紹介していきます。RecipeUbuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。JavaScriptセキュリティの基礎知識JavaScriptに関するセキュリティ上の問題はどこで発生し,どうすれば防ぐことができるのか?について解説していきます。〜システムをきちんと運用するための基礎知識システムは「作って終わり」ではなく,運用の中でさまざまな問題が発生します。問題の発生に備えて事前にどのような対応をしておくべきなのか,問題発生時に何をしなければならないのか,ポイントを解説していきます。きたみりゅうじの聞かせて珍プレーソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。Linuxのメンテナンスの傍ら,Linuxやオープンソースソフトと日々を過ごす著者が,その魅力とつきあい方を,エッセイ風味でお届けします。PRESS特別編集部員,さわやか笑顔のスーパーハカーはまちちゃんとネット大好き14歳わかばちゃんが,毎号,読者の皆さんから寄せられたおたよりを紹介します。皆さんの日頃の悩みにも答えちゃいますよ。]メールでのお知らせメールで次の案内をお送りしております。メールの配信を希望する方は,利用したい項目をチェックしてメールアドレスを入力し,[登録]ボタンをクリックしてください。UPDATES[ほぼ週間に1回]新刊メールマガジン[ほぼ週間に1回]電脳会議の各号案内[ほぼ1ヵ月半に1回]※変更する場合や停止する場合は,登録情報変更ページをご覧ください。※登録いただいたメールアドレスには,そのお知らせ以外,配信いたしません。Ltd.ページ内容の全部あるいは一部を無断で利用することを禁止します。個別にライセンスが設定されている記事等はそのライセンスに従います。