💡

XSS対策メモ

に公開

はじめに

Webアプリケーション開発において、最も有名な脆弱性の一つがXSS(Cross Site Scripting)です。

XSSは、ユーザーの入力をそのままHTMLとして出力してしまうことで発生します。攻撃者が悪意あるスクリプトを埋め込むと、被害者のブラウザ上でそのスクリプトが実行され、Cookie の窃取、セッションハイジャック、フィッシング詐欺などの被害につながります。

「自分のサイトは静的なページだけだから大丈夫」「入力フォームはないから関係ない」と思っていても、URLパラメータや検索機能、エラーメッセージの表示など、意外なところにXSSの脆弱性は潜んでいます。

XSSとは

XSS(Cross Site Scripting)は、Webアプリケーションの脆弱性を突いて、攻撃者が用意した悪意あるスクリプトを被害者のブラウザ上で実行させる攻撃手法です。

XSSが起きてしまう原因・対策

hiddenパラメータなら大丈夫と思ってしまう

HTMLのinputタグtype=hiddenと指定可能で、フォーム送信時にサーバーへ送られるのが特徴です。hiddenという単語のイメージで安全だと思いがちですが、簡単に攻撃されてしまいます。

サンプル
商品購入ページで本来は10,000円の商品が1円で購入されてしまう。

// purchase.html

<input type="hidden" name="price" value="10000">

実行例

curl -X POST https://example.com/purchase -d "price=1"

対策方法
対策方法はtype=hiddenを使わずにサーバー側で値を管理することが大切です。

本文に入力値をそのまま出力してしまう

HTMLの本文部分にユーザー入力値をサニタイジングせずに出力すると、スクリプトが実行されてしまいます。

サンプル
掲示板にコメントを投稿する際、スクリプトタグが含まれた入力をそのまま表示してしまう

// comment.html
<div class="comment">
  ようこそ<?php echo $_GET['name']; ?>さん
</div>

実行例

https://example.com/comment.php?name=<script>alert('XSS')</script>

ブラウザに表示されるHTML:

html<div class="comment">
  ようこそ<script>alert('XSS')</script>さん
</div>

結果:アラートが実行されてしまう。

対策方法
HTMLの本文で特殊文字となる <、>、& の3文字をサニタイジングすることが大切です。
php// 正しい実装例

<div class="comment">
  ようこそ<?php echo htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8'); ?>さん
</div>

変換結果:

html<div class="comment">
  ようこそ&lt;script&gt;alert('XSS')&lt;/script&gt;さん
</div>

Discussion