java - 使用 PlayFramework2 在 JSON 中转义 HTML

标签 java backbone.js playframework escaping playframework-2.0

我正在使用 PlayFramework2,但我找不到正确处理 HTML 转义的方法。

在模板系统中,默认情况下会过滤 HTML 实体。
但是,当我将 REST 请求与 Backbone.js 结合使用时,我的 JSON 对象不会被过滤。

我使用play.libs.Json.toJson(myModel)对象转换为字符串
因此,在我的 Controller 中,我使用 return ok(Json.toJson(myModel));发送响应...但是在这里,我的模型的属性不 protected 。
我找不到处理它的方法...

第二个问题:
模板引擎默认过滤 HTML 实体,这意味着我们必须将原始用户输入存储到数据库中。
这是一种保存行为吗?

第三个问题:
PlayFramework 中是否有手动转义字符串的功能?我能找到的所有这些都需要添加新的依赖项。

谢谢!

编辑:我在 Backbone.js 模板级别找到了一种方法: - 使用myBackboneModel.escape('attr');而不是myBackboneModel.get('attr');
Underscore.js 模板系统还包括该选项:<%= attr %>渲染时不会转义,但是 <%- attr %>渲染时转义!
请注意效率,每次渲染时都会重新转义字符串。这就是为什么应该优先选择 Backbone .create() 的原因。

最佳答案

预防 XSS 攻击的最佳实践通常建议您对输出进行推理,而不是对输入进行推理。这背后有很多原因。我认为最重要的是:

  • 除非您确切知道将如何输出/渲染数据,否则推理转义某些内容是没有任何意义的。因为不同的渲染方式需要不同的转义策略,例如正确转义的 HTML 字符串不足以在 Javascript block 中使用它。需求和技术不断变化,今天您以一种方式呈现数据 - 明天您可能会使用另一种方式(假设您将在不需要 HTML 转义的移动客户端上工作,因为它根本不使用 HTML渲染数据)您只能在渲染数据时确定正确的转义策略。这就是现代框架将转义委托(delegate)给模板引擎的原因。我建议您查看以下文章:XSS (Cross Site Scripting) Prevention Cheat Sheet
  • 转义用户的输入实际上是一种破坏性/有损的操作 - 如果您在将用户的输入保存到存储之前转义它,您将永远不会知道他的原始输入是什么。没有确定的方法可以“转义”HTML 转义字符串,请考虑上面我的移动客户端示例。

这就是为什么我相信正确的方法是将转义委托(delegate)给您的模板引擎(即您用于 Backbone 的 Play 和 JS 模板引擎)。无需将序列化为 JSON 的字符串进行 HTML 转义。请注意,在幕后 JSON 序列化程序将对您的字符串进行 JSON 转义,例如如果你的字符串中有引号,它将被正确转义以确保生成的 JSON 是正确的,因为它毕竟是一个 JSON 序列化器,这就是为什么它只关心正确的 JSON 渲染,它对 HTML 一无所知(而且它不应该)。但是,当您在客户端渲染 JSON 数据时,您应该使用用于 Backbone 的 JS 模板引擎提供的功能正确地对它进行 HTML 转义。

回答另一个问题:您可以使用 play.api.templates.HtmlFormat 手动转义原始 HTML 字符串:

import play.api.templates.HtmlFormat
...
HtmlFormat.escape("<b>hello</b>").toString()
// -> &lt;b&gt;hello&lt;/b&gt;

如果您确实需要使 JSON 编码器转义某些 HTML 字符串,一个好主意可能是为它们创建一个包装器,比如说 RawString 并提供自定义 Format[RawString] 也会在其 writes 方法中对字符串进行 HTML 转义。详情见:play.api.libs.json API documentation

关于java - 使用 PlayFramework2 在 JSON 中转义 HTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16220908/

相关文章:

javascript - 重新渲染后的 Marionette ItemView 事件

java - 使用 Java 和 JUnit 在 Play 2 中测试表单

amazon-web-services - 玩!框架 + DynamoDB

java - Hibernate 过滤器关联

java - 在java中获取用户的SpooleFileList以及我们在as400中可以执行的所有操作(如查看、更改等)

java - 重复局部变量(For 循环)

java - openkm 6.3.0 社区版和 TomCat 不能在 64 位 Windows 7 上运行

java - Resteasy spring 自定义对象映射器

javascript - 在 Backbone 的所有路由中默认显示一个 View

javascript - Backbonejs - 在不更改 URL 的情况下触发路由事件