Smartyでのエスケープをまとめた

SmartyでのXSS対応方法をまとめます。

足りてないパターンがあれば追加予定。

参考

要素内容

<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対策方法

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対策方法

Smartyでは

<{$hoge|escape:'javascript'}> を使います。 ※ \ " ' 改行 </エスケープされます。

例:

<script type="text/javascript">
  var x = "hoge";
  document.write('<{$hoge|escape:'javascript'}>');
</script>