(渲染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>
\t\b\f\n\r\\\'\"
和</
</
<>&
并过滤不合法的字符UTF-8 &
null
其中一些可能与安全性无关 - 它们只是帮助代码保持理智。我们选择哪种转义模式作为默认设置以帮助防止XSS - 默认情况下“更安全”?如果我们默认使用最严格的(htmlencode)并从那里放松/切换excape模式怎么办?
我对讨论所有这些转义模式的优点并不感兴趣 - 无论好坏,它们都存在于我们的代码库中。我错过了任何模式吗?有什么好的阅读材料吗?
答案 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。
jsidentifier
和jsliteral
保护什么?他们是否会阻止eval
等危险标识符被分配?除了<!--
之外,它们可能会阻止</
,因为注入的/*<!--
可能会导致</script>
被忽略,从而可能允许稍后插值伪装成脚本内容。