最終更新日:2020年8月13日
クロスサイト・スクリプティング(XSS)対策(PHP編)
クロスサイト・スクリプティング(以下、XSS)の対策は以下の記事を参照してください。
これを PHP で実現すると以下のようになります。
根本的対策
■1.HTTP レスポンスヘッダーに文字コードを指定する
PHP でレスポンスヘッダーの Content-Type に文字コードを指定するには、php.ini で設定する方法と、各ページのレスポンスヘッダーで出力する方法があります。
php.ini で設定すれば各ページで文字コードの設定を行う必要はありません。しかし、サーバーの移行などで php.ini の設定漏れが起きると脆弱性につながるため、各ページのレスポンスヘッダーで文字コードを出力するほうが確実でしょう。
・各ページのレスポンスヘッダーで出力する方法(推奨)
各ページのレスポンスヘッダーで文字コードを出力するには、header 関数を利用して以下のように記述します。
header("Content-type: text/html; charset=utf-8");
・php.ini で設定する方法
レスポンスヘッダーの Content-Type に文字コードを指定するには、php.ini で以下のように設定します。
default_charset = "UTF-8"
設定後、Apache を再起動します。
# service httpd restart
■2.HTML 要素の属性は""(ダブルクオーテーション)で囲む
これはそのままですが、HTML の属性は''(シングルクォーテーション)ではなく、""(ダブルクオーテーション)で囲むようにしてください。
<a href="https://www.websec-room.com/">Webセキュリティの小部屋</a>
■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 関数でエスケープする具体的な記述方法は以下のようになります。
htmlspecialchars($target, ENT_QUOTES, "UTF-8")
■4.URL は「http://」か「https://」で始まるもののみ出力する
URL 判定の実装例は以下のようになります。
function is_url($url) { if (preg_match('/\Ahttp:\/\//', $url) || preg_match('/\Ahttps:\/\//', $url)) { return true; } else { return false; } }
■5.<script></script> 要素の内容を動的に生成しない
これはそのままですね。
保険的対策
■1.入力値のチェックを行う
XSS で危険な文字である &<>' が文字列に含まれているか正規表現でチェックする実装例です。
function is_xss($xss) { if (preg_match('/[&<>"\']/', $xss)) { return true; } else { return false; } }
■2.Cookie に HttpOnly 属性を付与する
Cookie に HttpOnly 属性を付与するには、setcookie 関数で以下のように記述します。第7引数の TRUE で HttpOnly 属性を付与しています。
setcookie("key", "value", 0, "/", null, FALSE, TRUE);
なお、PHP のセッション ID に secure 属性と HttpOnly 属性を付与する方法は以下の記事を参照してください。
■3.Trace メソッドを無効化する
Apache の Trace メソッドを無効にするには、httpd.conf に以下の行を追加し、Apache を再起動します。
TraceEnable Off
参考
Webアプリケーションセキュリティに関する記事は、以下のページにまとまっています。ぜひご確認ください。
スポンサーリンク
カテゴリー:Webアプリケーションセキュリティ対策
コメントを残す