在JSP/JSPX中转义HTML实体:没有解决方案甚至不存在的问题?

Ily*_*a.K 13 jsp jspx escaping

我们使用jspx作为模板引擎.我们有数十个具有数百个el表达式的屏幕,例如$ {user.firstName}或"$ {mail.subject}"

默认情况下,所有这些HTML代码都不会被转义.如果在字段中存在<或"的东西 - 屏幕将失败.我们总是可以使用fn:escapeXml,但在所有地方这样做真的很无聊.

1)默认情况下是否有办法逃脱?

我知道的唯一方法是破解JSP编译器(如tomcat的jasper).但这不是一条路.

2)为什么某人可能需要在el中使用未转义的HTML?在模板外部存储HTML(例如在数据库中)不是一个好习惯.

3)我确信模板引擎应该自动处理它(就像在XSLT中一样),用户为什么要关心它?手动转义(fn:escapeXml)闻起来像SQL手动转义(用于代替JDBC setParam):样板代码和sql注入的好地方(在我们的例子中是跨站点脚本).

Bal*_*usC 11

1)默认情况下有没有办法逃脱?

不在复古的JSP中.然而,它的后继者Facelets在默认情况下逃脱了它们.禁用转义的唯一方法是使用<h:outputText value="#{bean.foo}" escape="false" />而不是#{bean.foo}.


2)为什么某人可能需要在el中使用未转义的HTML?在模板外部存储HTML(例如在数据库中)不是一个好习惯.

然而,存储已清理的 HTML比通常更常见.例如允许无辜的HTML标签,如的一小部分<p>,<b>,<i>并从该on*属性已经被剥离.


3)我确信模板引擎应该自动处理它(就像在XSLT中一样),用户为什么要关心它?手动转义(fn:escapeXml)闻起来像SQL手动转义(用于代替JDBC setParam):样板代码和sql注入的好地方(在我们的例子中是跨站点脚本).

JSP是一种古老的视图技术.它不是一个灵活的模板引擎.

SQL注入通常只需使用PreparedStatement而不是Statement(或使用ORM框架而不是"原始JDBC")来防止,就像通过使用MVC框架而不是"原始JSP"来防止XSS问题一样.


至于你的具体问题,你可以用4种方式解决这个问题:

  1. 咬紧牙关,更换所有EL-in-template-text,重新显示用户控制的输入fn:escapeXml()或者<c:out>教你自己和你的团队将来注意这一点.提示,像Eclipse这样有点不错的IDE有一个基于正则表达式的查找和替换所有文件.

  2. 有一种DB拦截器在插入DB之前剥离恶意HTML.如有必要,运行DB脚本以清理现有数据.然而,这是一种解决方法,而不是真正的解决方案.

  3. 将JSP EL解析器替换为转义所有HTML的自定义转换器.然而,这样做的缺点是,只要真正需要,你就永远无法通过EL显示纯HTML.

  4. 使用内置HTML转义的体面MVC框架.然而,这不仅仅是修复单个EL表达式的工作.


Ale*_*øld 7

是的,默认情况下可以转义所有EL表达式.这可以通过注册自定义ELResolver来完成.例如,请参阅此站点以获取如何完成的示例:http: //pukkaone.github.com/2011/01/03/jsp-cross-site-scripting-elresolver.html