Smartyでのエスケープをまとめた
足りてないパターンがあれば追加予定。
参考
- 『体系的に学ぶ安全なWebアプリケーションの作り方 第2版』
- Smartyのコード https://github.com/smarty-php/smarty/blob/478f8a29b4da07b7d18164cc8554b967a2036678/libs/plugins/modifier.escape.php
要素内容
<p>ここに文字が入る場合</p>
XSS対策方法
<
と &
を文字参照にする
Smartyでは
<{$hoge|escape:'html'}>
を使います。
※ & " ' < >
がエスケープされます。
例:
<div> <p>名前:</p><span><{$name|escape:'html'}></span> </div>
属性値
<input type="text" name="name" value="ここに文字が入る場合">
XSS対策方法
- 属性値を
"
で囲う <
"
&
を文字参照にする
Smartyでは
<{$hoge|escape:'html'}>
を使います。
※ & " ' < >
がエスケープされます。
例:
<input type="text" name="name" value="<{$name|escape:'html'}>">
属性値(URL)
<a href="ここに文字が入る場合">hogehoge</a>
XSS対策方法
- URLの形式チェックをする
- 属性値としてエスケープ
Smartyでは
<{$hoge|escape:'html'}>
を使います。
※ & " ' < >
がエスケープされます。
また、PHP側で形式のチェックをします。
例:
<a href="<{$url|escape:'html'}>">hogehoge</a>
if (preg_match('/\Ahttps?:\/\//', $url) || preg_match('/\A\//', $url)) { return ture; } else { return false; }
イベントハンドラ
<body onload="init('ここに文字が入る場合')">
XSS対策方法
- JavaScriptとしてエスケープ
\ ' " 改行
=>\\ \' \" \n
- 属性値としてエスケープ
Smartyでは
<{$hoge|escape:'javascript'|escape:'html'}>
を使います。
※ \ " ' 改行 </
と & " ' < >
がエスケープされます。
例:
<body onload="init('<{$hoge|escape:'javascript'|escape:'html'}>')">
script要素内の文字列リテラル
※基本的には、JavaScriptに直接文字を埋め込まないのが推奨
<script type="text/javascript"> var x = "hoge"; document.write('ここに文字が入る場合'); </script>
XSS対策方法
- Javascriptとしてエスケープ
</
が出現しないよう考慮
Smartyでは
<{$hoge|escape:'javascript'}>
を使います。
※ \ " ' 改行 </
がエスケープされます。
例:
<script type="text/javascript"> var x = "hoge"; document.write('<{$hoge|escape:'javascript'}>'); </script>