なぜPHPアプリにセキュリティホールが多いのか?
【スクリプトインジェクション対策14】HTML,CSS,JavaScriptの生成はホワイトリスト方式を利用する
ブラウザに任意スクリプトを実行させる方法は多岐にわたります。
- 文字エンコーディングを利用する方法
- ブラウザのバグや仕様を利用する方法
- Webアプリケーションのバグを利用する方法
ブラックリスト方式の対処が特に困難であるのはブラウザの仕様やバグです。Webサイト運営者は基本的にブラウザのバージョンや仕様/設定を制御することはできません。例えば,FirefoxはE4X(Ecma Script for XML)をサポートしています。この仕様を知らなければブラックリスト方式でスクリプトインジェクションを防ぐことはできません。
例:E4Xを利用したスクリプト実行
a = alert; e4x = {a(1)}
Firefoxの場合,アドレスバーに“javascrit:”と入力し,JavaScriptコンソールを起動し式を評価するとダイアログが表示され,コードが実行できることが分かります
上記のE4Xを利用した攻撃は,<a>タグを許可し,href属性をブラックリスト方式でチェックしているアプリケーション上でスクリプトインジェクションを許してしまう可能性があります。
さらに困ったことには,セキュリティや仕様上の決まりごとより,仕様に合わないおかしなページでもなんとか表示できるような仕組みが優先された仕様がブラウザに実装されています。例えば,Internet Explorer 6ではタブやヌル文字,改行文字が属性名の途中に入っていても,何もなかったように処理してしまうケースは少なくありません。
ユーザ入力から安全なHTMLドキュメントを出力するためには,一旦ドキュメントを分析し,利用してもよいタグと属性,さらに属性の中身までホワイトリスト化してチェックする以外に安全な方法はありません。
このようなチェックを行う場合,正規表現等を利用して独自のパーサを作ることは行わないほうがよいです。正規表現は非常に強力で便利ですが,少し間違えるだけで不正な入力を許可してしまいます。HTML等のドキュメントはSAXまたはDOMを利用して解析します。
対策のまとめ
- 不正な文字列を除去しようとしない(サニタイズしない)
- 不正な文字列を検出しようとしない
- 正しい文字列だけを許可する(バリデーションする)
- 出来る限り厳しいバリデーション条件を利用する
- JavaScriptは動的に生成しないようにする
補講
- 【スクリプトインジェクション対策19】ユーザを教育する
- 【スクリプトインジェクション対策18】ログイン処理を正しく実装する
- 【スクリプトインジェクション対策17】パスワードを正しく管理する
- 【スクリプトインジェクション対策16】関連するサイトが利用しているドメイン名の一覧を提供する
- 【スクリプトインジェクション対策15】JavaScriptが無効なクライアントでも利用可能なサイトにする
- 【スクリプトインジェクション対策14】HTML,CSS,JavaScriptの生成はホワイトリスト方式を利用する
- 【スクリプトインジェクション対策13】不正な文字データを保存できないようにする
- 【スクリプトインジェクション対策12】データベースなど,内部データを信用しない
- 【スクリプトインジェクション対策11】エスケープしてはならないデータ以外はすべてエスケープする
- 【スクリプトインジェクション対策10】すべての入力値を可能な限り厳しい条件で検証する
-
Webアプリセキュリティ対策入門〜あなたのサイトは大丈夫?
本書は,Webサイトのセキュリティ確保のために必要な基礎知識と,安全なコードを書くために必要な基礎知識を解説しています。Webアプリケーションは比較的簡単に作成で...
-
はじめてのPHP言語プログラミング入門
Webアプリケーション構築ツールとしてPHPを取り上げた書籍は数多くありますが,言語の解説・入門書としての書籍はあまりありません。 本書は,プログラミング言語として...

