自动转义以防止XSS

时间:2011-03-22 18:07:19

标签: javascript html templates escaping xss

(渲染HTML模板时)

<hidden name=”param${ns?htmlattr}” />
<a href=”${url?urlencode}”>${usercontent?htmlencode}</a>
${rawhtml?htmlliteral}
<script>
var a = “${str?jsstr}”; //null becomes “”
var b = ${str?quote,jsstr}; //allow null, render quotes if nonnull
var c = ${func?jsliteral}
var ${func?jsidentifier} = null;
</script>
  • jsstr转义\t\b\f\n\r\\\'\"</
  • jsliteral escapes </
  • jsidentifier用虚拟角色替换非alnum
  • xmlattr转义<>&并过滤不合法的字符UTF-8
  • htmlencode几乎将所有边缘情况编码为&amp;
  • 等内容
  • quote会导致字符串呈现出引用(包括空)或null

其中一些可能与安全性无关 - 它们只是帮助代码保持理智。我们选择哪种转义模式作为默认设置以帮助防止XSS - 默认情况下“更安全”?如果我们默认使用最严格的(htmlencode)并从那里放松/切换excape模式怎么办?

我对讨论所有这些转义模式的优点并不感兴趣 - 无论好坏,它们都存在于我们的代码库中。我错过了任何模式吗?有什么好的阅读材料吗?

1 个答案:

答案 0 :(得分:1)

查看http://js-quasis-libraries-and-repl.googlecode.com/svn/trunk/safetemplate.html

它定义HTML中的上下文以及从这些上下文到转义函数的映射。

对于可运行的示例,请查看http://js-quasis-libraries-and-repl.googlecode.com/svn/trunk/index.html。尝试从右上角的下拉菜单中的“安全HTML”示例开始。

为了解决您的具体示例,jsliteral看起来有点狡猾。从<script>块中的html编码中获得什么好处?内容是CDATA。

jsidentifierjsliteral保护什么?他们是否会阻止eval等危险标识符被分配?除了<!--之外,它们可能会阻止</,因为注入的/*<!--可能会导致</script>被忽略,从而可能允许稍后插值伪装成脚本内容。