【テクニカル・上級編】XSS対策としてのコンテキスト依存の出力エンコーディング – アプリケーションセキュリティ & 安全な開発防御ガイド

コンテキストを読み違えるな:XSS防御の最前線と「エンコーディング」の深淵

「XSS対策はサニタイズしていればOK」。そんな甘い言葉を信じている若手エンジニアほど、本番環境で痛い目を見る。我々のような現場の人間からすれば、XSS(Cross-Site Scripting)は「ブラウザがデータの『意味』を勝手に解釈する」という仕様上の隙を突く、極めて古典的かつ狡猾な攻撃だ。

単なる をエスケープしないと、ブラウザのパーサーを強制終了させ、任意のコードを注入されるリスクがある。

// セキュアなJS埋め込み実装例(PHPを用いた概念コード)
function js_escape($str) {
// 全ての非英数字をUnicodeエスケープに変換
return preg_replace_callback('/[^A-Za-z0-9]/', function($matches) {
return sprintf('\u%04x', ord($matches[0]));
}, $str);
}

// 出力時
const userData = '';

3. 生成AI時代の新たな境界線:プロンプトインジェクションとの交差点

近年、我々が警戒しているのは、従来のXSSとLLM(大規模言語モデル)のプロンプトインジェクションの融合だ。

AIが生成した回答をそのままHTMLとしてレンダリングするアプリケーションが増えているが、ここでAIが「悪意あるHTMLタグ」を生成した場合、それがそのままブラウザで実行されるリスクがある。

防御層(ガードレイル)のアーキテクチャ設計:
1. Content Security Policy (CSP) の厳格化: unsafe-inline は論外。nonce を利用し、許可されたスクリプトのみを実行させる。
2. DOMPurifyの導入: AIの出力をレンダリングする前に、信頼できるライブラリでHTMLをサニタイズする。
3. サンドボックス化: ユーザー入力を扱う領域には