格納型XSS

格納型XSS

説明

データベースなどの永続ストレージから読み取った値を、出力エンコーディングせずに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 要素のテキストとして埋め込みます。

参考資料