Webセキュリティの小部屋

Twitter のフォローはこちらから Facebook ページはこちら Google+ページはこちら RSSフィードのご登録はこちらから
公開日:2013年3月19日
最終更新日:2013年12月26日

クロスサイト・スクリプティング(XSS)対策(PHP編)

クロスサイト・スクリプティング(以下、XSS)の対策は以下の記事を参照してください。

これを PHP で実現すると以下のようになります。

根本的対策

■1.HTTP レスポンスヘッダーに文字コードを指定する
PHP でレスポンスヘッダーの Content-Type に文字コードを指定するには、php.ini で設定する方法と、各ページのレスポンスヘッダーで出力する方法があります。

php.ini で設定すれば各ページで文字コードの設定を行う必要はありません。しかし、サーバーの移行などで php.ini の設定漏れが起きると脆弱性につながるため、各ページのレスポンスヘッダーで文字コードを出力するほうが確実でしょう。

・各ページのレスポンスヘッダーで出力する方法(推奨)
各ページのレスポンスヘッダーで文字コードを出力するには、header 関数を利用して以下のように記述します。

・php.ini で設定する方法
レスポンスヘッダーの Content-Type に文字コードを指定するには、php.ini で以下のように設定します。

設定後、Apache を再起動します。

■2.HTML 要素の属性は""(ダブルクオーテーション)で囲む
これはそのままですが、HTML の属性は''(シングルクォーテーション)ではなく、""(ダブルクオーテーション)で囲むようにしてください。

■3.出力する全ての要素に対してエスケープ処理を行う
PHP でエスケープ処理を行うためには、htmlspecialchars 関数を使用します。htmlspecialchars 関数は3つの引数を取ります。

第1引数 出力対象文字列
第2引数 エスケープ対象文字を指定(必須指定)
ENT_COMPAT、または ENT_QUOTES。
第3引数 文字コード(必須指定)

htmlspecialchars 関数自体は第1引数のみあれば動作するのですが、セキュリティ要件として、第2、第3引数も必須となります。

第2引数で ENT_COMPAT を指定すると &<>" をエスケープし、ENT_QUOTES を指定すると &<>"' をエスケープします。

対策2で HTML 要素の属性値を""(ダブルクオーテーション)で囲んでいるので、ENT_COMPAT と ENT_QUOTES のどちらでも問題ありませんが、対策2が間違える可能性を考えると、ENT_QUOTES を指定した方がよいでしょう。

これを受けて、htmlspecialchars 関数でエスケープする具体的な記述方法は以下のようになります。

■4.URL は「http://」か「https://」で始まるもののみ出力する
URL 判定の実装例は以下のようになります。

■5.<script></script> 要素の内容を動的に生成しない
これはそのままですね。

保険的対策

■1.入力値のチェックを行う
XSS で危険な文字である &<>' が文字列に含まれているか正規表現でチェックする実装例です。

■2.Cookie に HttpOnly 属性を付与する
Cookie に HttpOnly 属性を付与するには、setcookie 関数で以下のように記述します。第7引数の TRUE で HttpOnly 属性を付与しています。

なお、PHP のセッション ID に secure 属性と HttpOnly 属性を付与する方法は以下の記事を参照してください。

■3.Trace メソッドを無効化する
Apache の Trace メソッドを無効にするには、httpd.conf に以下の行を追加し、Apache を再起動します。


スポンサーリンク




カテゴリー:Webアプリケーションセキュリティ

Twitter でも、いろんな情報を発信しています。



コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA