Cross-Site Scripting(XSS)の攻撃手法と対策
概要
Cross-Site Scripting(XSS)とは、URLや入力フォームを悪用しスクリプトを埋め込み、その情報を取得した他のユーザーのブラウザ上で実行させる攻撃手法のこと。スクリプトを実行することで、入力データや個人情報などを外部サーバーなどに送信することが可能になる。認証が通ったクライアント上でスクリプトを実行されるため、不正の検知が難しい。
攻撃方法の例
1.反射型XSS(Reflected XSS)
リクエストに含まれる値(GETパラメータなど)を、そのままレスポンスとして返すようなコードがある場合に発生する脆弱性。
<form>
<label for="name">Name</label>
<input type="text" id="name" name="name" />
<button type="submit">Submit</button>
</form>
<p>Hello, <?php echo $_GET['name']; ?></p>
というフォームに<script>alert('XSS');</script>
というスクリプトを入力して送信すると、ブラウザ上でalert('XSS');
が実行される。
2.蓄積型XSS(Stored XSS)
悪意のある値がデータベースなどに格納され、それを別のリクエストで取得するようなコードがある場合に発生する脆弱性。
<form>
<label for="comment">Comment</label>
<input type="text" id="comment" name="comment" />
<button type="submit">Submit</button>
</form>
<section id="comments">
<?php
// コメントをデータベースから取得して表示する(例: MySQLなど)
echo $_POST['comment'];
?>
</section>
このフォームに><script>alert('XSS');</script>
というスクリプトを入力して送信すると、alert('XSS');
が実行される。
3.DOM-based XSS(DOM-based XSS)
DOMを悪用してスクリプトを実行するようなコードがある場合に発生する脆弱性。
<script>
const urlParams = new URLSearchParams(window.location.search);
const name = urlParams.get('name');
document.getElementById('name').innerHTML = name;
</script>
<p id="name"></p>
このページでhttps://example.com/page?name=<script>alert('XSS');</script>
というURLを開くと、alert('XSS');
が実行される。
対処法
反射型XSSや蓄積型XSSは、ページに値を表示する際に必要なエスケープ処理を行うことが重要である。
サニタイズいうなキャンペーンのとおり、正しいAPIやライブラリの使い方をすることが防ぐことができる。