2011-03-22 73 views
1

(渲染HTML模板時)自動轉義,以防止XSS

<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逃脫</
  • jsidentifier取代非alnum無效字符
  • xmlattr轉義<>&並過濾不合法的字符UTF-8
  • 的HTMLEncode編碼幾乎所有的特殊情況爲這樣的東西&amp;
  • 引號引起字符串來呈現出報價(包括空),或null

其中的幾個可能不適合安全相關 - 他們只是幫助代碼保持健全。我們選擇哪種逃生模式作爲默認幫助防止XSS - 默認情況下「更安全」?如果我們默認最嚴格的(htmlencode)並從那裏放鬆/切換退出模式會怎樣?

我不想討論所有這些逃生模式的優點 - 無論好壞,它們都存在於我們的代碼庫中。我是否缺少任何模式?有什麼好的閱讀材料?

回答

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>,可能允許稍後插值僞裝成腳本內容。