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种方式解决这个问题:
咬紧牙关,更换所有EL-in-template-text,重新显示用户控制的输入fn:escapeXml()
或者<c:out>
教你自己和你的团队将来注意这一点.提示,像Eclipse这样有点不错的IDE有一个基于正则表达式的查找和替换所有文件.
有一种DB拦截器在插入DB之前剥离恶意HTML.如有必要,运行DB脚本以清理现有数据.然而,这是一种解决方法,而不是真正的解决方案.
将JSP EL解析器替换为转义所有HTML的自定义转换器.然而,这样做的缺点是,只要真正需要,你就永远无法通过EL显示纯HTML.
使用内置HTML转义的体面MVC框架.然而,这不仅仅是修复单个EL表达式的工作.
是的,默认情况下可以转义所有EL表达式.这可以通过注册自定义ELResolver来完成.例如,请参阅此站点以获取如何完成的示例:http: //pukkaone.github.com/2011/01/03/jsp-cross-site-scripting-elresolver.html