jsp - 在 JSP/JSPX : no solution for problem that should not even exist? 中转义 HTML 实体

标签 jsp escaping jspx

我们使用 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”来防止)。

至于您的具体问题,您可以通过以下四种方式解决:
  • 咬紧牙关,将所有重新显示用户控制输入的 EL-in-template-text 替换为 fn:escapeXml()<c:out>并教你自己和你的团队在 future 注意这一点。提示,像 Eclipse 这样有点体面的 IDE 有一个基于正则表达式的 find-and-replace-in-all-files。
  • 有一种 DB 拦截器,可以在插入 DB 之前去除恶意 HTML。如有必要,运行数据库脚本来清理现有数据。然而,这更像是一种解决方法,而不是真正的解决方案。
  • 将 JSP EL 解析器替换为转义所有 HTML 的自定义解析器。然而,这有一个缺点,即您永远无法在真正需要时通过 EL 显示纯 HTML。
  • 使用具有内置 HTML 转义功能的体面的 MVC 框架。然而,这不仅仅是修复单个 EL 表达式的工作。
  • 关于jsp - 在 JSP/JSPX : no solution for problem that should not even exist? 中转义 HTML 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5887037/

    相关文章:

    mysql - jdbc转MYSQL错误: No suitable driver found for jdbc:mysql://localhost:3306/test?用户='root'&密码=''

    java - 如何使用java刷新文件夹

    javascript - 命令按钮双操作 : save and redirect to other page

    c# - 转义左括号 C# 正则表达式

    java - 如何在 JSPX 中处理 Optionals?

    javascript - 启用文本框并使其可编辑

    java - 如何创建可以跨多个页面或在框架/iframe 内访问的全局 JSP 变量?

    html - JSP 在 Websphere Application Server 8.5 上加载不完整

    php - Twig 中 escape ('html' ) 和 escape ('html_attr' ) 的区别

    python - 在 Django 中将模板渲染为 json 的转义字符串