説明
データベースなどの永続ストレージから読み取った値を、出力エンコーディングせずにHTMLとして表示すると、格納型XSSが発生するおそれがあります。
想定される影響
影響を受けるページを閲覧したすべてのユーザーのブラウザーで、悪意あるスクリプトが実行される可能性があります。
対処方法
保存前の検証とは別に、出力時にもエンコードします。HTMLテキストと引用符で囲んだ通常の属性値には htmlspecialchars を使い、JavaScript、CSS、URLの値には、それぞれの出力先に適した対策を講じます。
例
変更前
php
<?php
$row = mysqli_fetch_row($result);
$guestbook .= "<div>Name: {$row[0]}</div>";
変更後
php
<?php
$row = mysqli_fetch_row($result);
$name = htmlspecialchars($row[0], ENT_QUOTES, 'UTF-8');
$guestbook .= "<div>Name: {$name}</div>";
解説:
- 変更前: 保存されたデータを出力エンコーディングせずにHTMLレスポンスへ書き込んでいます。
- 変更後: 保存された値をHTMLエンコードしてから、
div要素のテキストとして埋め込みます。