并且默认情况下,所有这些HTML代码都不会被转义.如果会有<或者“在现场屏幕中将会失败,我们可以随时使用fn:escapeXml,但是在所有地方真的很无聊. 1)
默认情况下是否有办法逃脱?
我知道的唯一方式是攻击JSP编译器(如jasper for tomcat).但这不是一个方法.
2)
为什么有人可能需要非转义的HTML?在模板之外存储HTML(例如在数据库中)不是一个好习惯.
3)我确信模板引擎应该自动处理它(如在XSLT中完成的),为什么用户需要关心它?
手动转义(fn:escapeXml)闻起来像SQL手动转义(使用而不是JDBC setParam):样板代码和sql-injection的好地方(在我们的例子中是跨站点脚本).
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通常是完成的.例如.以允许诸如< p>,< b>,< i>的无辜HTML标签的一小部分并且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是一种古老的视图技术.这不是一个灵活的模板引擎.
通常只需使用PreparedStatement而不是Statement(或通过使用ORM框架而不是“raw JDBC”来防止SQL注入,就像通过使用MVC框架而不是“raw JSP”可以防止XSS问题一样).
对于你的具体问题,你可以用四种方式来解决这个问题:
>咬住项目符号并替换所有EL-in-template-text,它通过fn:escapeXml()或< c:out>重新显示用户控制的输入.并教你自己和你的团队在未来注意这一点.提示,像Eclipse那样有点体面的IDE有一个基于regex的find-and-replace-in-all-files.>有一些数据库拦截器,在插入数据库之前,将恶意HTML剥离.如果需要,运行DB脚本来清理现有数据.然而,这不仅仅是一个实际的解决方案.>用自定义的代替JSP EL解析器来转义所有的HTML.但是这样做的缺点是,无论何时真正需要,您永远不会显示EL的纯HTML.>使用内置HTML转义的体面的MVC框架.然而,这不仅仅是修复各个EL表达式更多的工作.