我们使用 jspx 作为模板引擎。我们有十几个带有数百个 el 表达式的屏幕,例如 ${user.firstName} 或 "${mail.subject}"
默认情况下,所有这些 HTML 代码都不会转义。如果字段中有 < 或 "的内容——屏幕将失败。我们总是可以使用 fn:escapeXml 但在所有地方这样做真的很无聊。
1)
有没有办法默认逃逸?
我知道的唯一方法是破解 JSP 编译器(比如 jasper for tomcat)。但这不是一条可行的路。
2)
为什么有人可能需要在 el 中未转义的 HTML?将 HTML 存储在模板之外(例如在数据库中)不是一个好习惯。
3) 我确信模板引擎应该自动处理它(就像在 XSLT 中所做的那样),用户为什么要关心它?
手动转义 (fn:escapeXml) 闻起来像 SQL 手动转义(用于代替 JDBC setParam):样板代码和 sql 注入(inject)的好地方(在我们的例子中是跨站点脚本)。
最佳答案
1) Is there a way to do escape by default?
不在老式 JSP 中。然而,它的继任者 Facelets 在默认情况下会避开它们。禁用转义的唯一方法是使用
<h:outputText value="#{bean.foo}" escape="false" />
而不是 #{bean.foo}
.2) Why somebody may ever need unescaped HTML in el? Storing HTML outside of template (in database for example) is not a good practice.
入库sanitized然而,HTML 比通常完成的要多。例如。允许一小部分无辜的 HTML 标签,如
<p>
, <b>
, <i>
以及从哪个 on*
属性已经被剥离。3) I am sure template engine should handle it automatically (as it done in XSLT), why should user care about it? Manual escaping (fn:escapeXml) smells like SQL manual escaping (which is used instead of JDBC setParam): boilerplate code and good place for sql-injection (cross-site scripting in our case).
JSP是一种古老的 View 技术。它不是一个真正灵活的模板引擎。
通常只使用
PreparedStatement
就可以防止 SQL 注入(inject)。而不是 Statement
(或者通过使用 ORM 框架而不是“原始 JDBC”,就像您的 XSS 问题可以通过使用 MVC 框架而不是“原始 JSP”来防止)。至于您的具体问题,您可以通过以下四种方式解决:
fn:escapeXml()
或 <c:out>
并教你自己和你的团队在 future 注意这一点。提示,像 Eclipse 这样有点体面的 IDE 有一个基于正则表达式的 find-and-replace-in-all-files。 关于jsp - 在 JSP/JSPX : no solution for problem that should not even exist? 中转义 HTML 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5887037/