【问题标题】:Guide to proper escaping in Play frameworkPlay 框架中正确转义的指南
【发布时间】:2011-08-11 12:04:31
【问题描述】:

我正在尝试绘制 Play 框架如何支持转义。

这是一个很好的页面,说明了所需的功能: https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet

所以我试图将其与 Play 模板功能联系起来,并充分了解 Play 做什么和不做什么。

另一个混淆点是对index.json 的支持(即使用模板构建 JSON 而不是 HTML)。 ${} 会神奇地切换到 JSON 文档中的 JavaScript 转义,还是仍然转义 HTML,所以 JSON 模板中的所有内容都必须有明确的 escapeJavaScript()

http://www.playframework.org/documentation/1.2/javaextensions 上还有一个 addSlashes(),但对于我能想到的任何情况,它似乎都不太合适。 (?)

如果有关于如何在 Play 中进行各种逃生操作的详尽指南,那就太好了。在我看来,在某些情况下答案是“自己动手”,但也许我错过了所包含的内容。

【问题讨论】:

  • 添加了赏金。我认为一个很好的答案看起来像是 owasp.org/index.php/… 的 Play 特定版本,它准确地显示了在代码和模板中要做什么,并且还包括 JSON 模板。
  • 您当然也可以将答案作为补丁贡献给 Play 文档!
  • 另一个有用的实用程序可能是将“asJavascriptString()”转换为 JS 字符串文字。
  • 您可以尝试在groups.google.com/group/play-framework 提出这个问题,他们通常反应迅速...

标签: java security escaping xss playframework


【解决方案1】:

我一直在研究这个问题,所以决定根据您已有的内容、OWASP cheat sheet 和我自己的一些实验来写下我自己的答案

HTML 转义:

  • ${} 或 escape() 函数

属性转义:(常用属性)

  • 只要将属性用双引号 (") 括起来并使用 ${},就可以在游戏中处理。
  • 对于复杂属性(href/src/等),请参见下面的 JavaScript
  • 示例不安全代码
    • <a id=${data.value} href="...">...</a>
    • <a id='${data.value}' href="...">...</a>
  • 这会与 data.value 中断:
    • % href=javascript:alert('XSS')
    • %' href=javascript:alert(window.location)

JavaScript 转义:(和复杂的属性)

CSS 转义:

  • 不确定,因为我不需要这个。
    • 我想您需要以某种方式创建自己的。希望有一些东西可以为您操纵字符串。

网址转义:

【讨论】:

  • 来到这里完全寻找 CSS 转义
  • 太好了,我来这里寻找其余部分,因此在我解决问题时添加了答案。当你有它们时,请添加 CSS 转义细节:)
【解决方案2】:

我认为你的总结是绝对正确的。 Play 为您提供了一些解决方案,但不是全部。但是,在 Play 没有提供某些东西的两个地方(在 CSS 和属性中),我实际上找不到需要它。

OWASP 标准规定您应该转义不受信任的代码。因此,在 CSS 中包含不受信任的代码的唯一方法是动态生成它。如果它是动态生成的,那么使用标准 Groovy 模板并因此使用${}escape() 不会阻止您这样做。

至于属性转义,据我所知,你唯一需要它的时候是在 groovy 模板中构建视图时,所以同样,你可以使用 ${} 或 @ 987654325@.

【讨论】:

  • 我不明白 ${} 或 escape() 如何用于 CSS 和属性。他们没有为这些上下文执行正确的转义算法。还有,json模板呢?
  • 您不必从静态文件中呈现 CSS,而是可以指向以 CSS 格式呈现的视图。因此,您可以获得 groovy 模板的强大功能/工具。至于属性,这些只是 HTML 元素上的属性,所以你可以有一些代码,例如
    div content
  • 您不需要像playframework.org/documentation/1.2/javaextensions 上的 addSlashes() 示例那样做吗?即 ${myValue.someCSSEscapeFunction().raw()} ?如果没有 .raw() 那么在 CSS 转义之上会有 HTML 转义,这会破坏。而且我不认为 someCSSEscapeFunction() 已经存在于 Play 中......
  • 你会用什么来做 - 我认为它必须像 ${user.name.escapeAttribute ().raw()} 但没有 escapeAttribute() 对吗? HTML 转义在这里不起作用。
  • 是的,你的 CSS 是对的,它只会做 HTML 转义。 .raw() 函数意味着 HTML 没有被转义。默认情况下,Play 会自动转义 HTML,因此您只需使用 ${user.name}
猜你喜欢
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多