XSS対策におけるHTMLコンテキストとJavaScriptコンテキストでのエンコードの違い
2024/02/04
XSS対策で行われるエスケープは、コンテキストによってエンコードが異なるため、ライブラリを使用していてもコンテキストの指定を誤るとバグの原因になります。例えば、PHPのテンプレートエンジンであるTwigでは、次のようにコンテキストを指定します。
```twig
{# HTMLコンテキストでエスケープする #}
{{ content|e('html') }}
{# JavaScriptコンテキストでエスケープする #}
{{ content|e('js') }}
```
## HTMLまたはHTML属性値のコンテキスト
HTMLタグ内やHTMLの属性値内では、文字参照に変換されます。
※エスケープすべき文字をすべて列挙しているとは限らないことに注意してください。
| エスケープ対象 | エスケープ後 |
| :--- | :--- |
| & | \& |
| < | \< |
| > | \> |
| " | \" |
| ' | \' |
## JavaScriptのコンテキスト
JavaScriptのソース内、\<script\>タグ内、JavaScriptの文字列リテラル内、HTMLのイベントハンドラ(onclickなど)の引数内、JSON内では、ASCII文字`\xHH`やUnicode文字`\uHHHH`や\\を使用した変換が行われます。
※**引用符で囲まれたデータ内**を想定しています。
※エスケープすべき文字をすべて列挙しているとは限らないことに注意してください。
| エスケープ対象 | エスケープ後 |
| :--- | :--- |
| \ | \\\\ |
| " | \x22 または \u0022 または \\" |
| ' | \x27 または \u0027 または \\' |
### 参考
[Twig HTMLエスケープ](https://twig.symfony.com/doc/3.x/templates.html#html-escaping)
[OWASP Cheat Sheet Series](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.md)
[OWASP Java Encoder](https://owasp.org/www-project-java-encoder/)
徳丸 浩.安全なWebアプリケーションの作り方.第2版.SB Creative.2019.