XSSとは
XSS(クロスサイトスクリプティング、Cross-Site Scripting)は、Webサイトに悪意のあるスクリプトを差し込まれ、そのサイトを開いた人のブラウザ上で実行されてしまう脆弱性です。入力された文字列を、画面に出す際に適切に処理していないと起きます。詳しい分類はOWASPの解説にまとめられています。
XSSで起きること
- ログイン状態を示すCookieを盗まれ、利用者になりすまされる
- 偽のログインフォームを表示され、パスワードを入力させられる
- 利用者に気づかれないまま、投稿や購入などの操作を実行される
- 別の悪質なサイトへ転送される
スクリプトは、攻撃を受けたサイトの権限で実行されます。そのため、ブラウザの同一オリジンポリシーでは防げません。
XSSの種類
| 種類 | 仕組み |
|---|---|
| 反射型 | URLのパラメータなどに含めたスクリプトが、そのまま応答に反映される。攻撃者が作ったURLを開かせる |
| 格納型 | コメント欄やプロフィールなどに保存されたスクリプトが、ページを開いた全員に実行される |
| DOM型 | サーバーを経由せず、ブラウザ上のJavaScriptが、URLなどの値を安全でない形でページに書き込むことで起きる |
対策
- 出力時にエスケープする: 画面に出す文字列は、出力する場所(HTML本文、属性、JavaScript、URL)に合った方法でエスケープします。入力時のチェックだけでは足りません。
- フレームワークの自動エスケープを使う: テンプレートエンジンの標準の出力機能を使い、エスケープを外す指定は避けます。
- CSPを設定する: Content-Security-Policyで、読み込めるスクリプトの取得元を絞ります。万一差し込まれても、実行を抑えられることがあります。
- Cookieに HttpOnly を付ける: HttpOnlyがあると、JavaScriptからセッションのCookieを読めません。被害を小さくできます。
- ソフトウェアを更新する: WordPress本体、テーマ、プラグインのXSSの脆弱性は、更新で修正されることが多いです。
WordPressでの書き方の例
テーマやプラグインを自作する場合は、出力の種類に合う関数を使います。
<?php echo esc_html( $title ); ?>
<a href="<?php echo esc_url( $url ); ?>">リンク</a>
<input value="<?php echo esc_attr( $value ); ?>">
HTMLの一部を許可したい場合は、wp_kses() や wp_kses_post() で、許可するタグを限定します。
よくある誤解
- HttpOnlyやCSPを設定すれば、XSSの脆弱性そのものが無くなるわけではありません。被害を小さくするための追加の対策です。根本は、出力時のエスケープです。
- 入力時に「<」を取り除くだけでは、不十分なことがあります。出力する場所によって、危険な文字が変わるためです。
Webサイト セキュリティチェッカーで確認する
Webサイト セキュリティチェッカーは、公開されている情報を受動的に確認する診断です。入力欄に攻撃用の文字列を送ってXSSを探す検査は行いません。代わりに、XSSの被害を小さくするCSP、Cookieの属性、古いJavaScriptライブラリの有無を診断します。XSSそのものを調べるには、専門業者による脆弱性診断をご検討ください。
関連用語
関連する用語
サイトの設定を無料で確認する
サイトのURLを入力するだけで、XSS などの設定状況を診断できます。Webサイト セキュリティチェッカー「Security Checker X」は、登録なしで使えます。









