在Play框架中正确转义的指南

时间:2011-04-23 14:17:02

标签: java security escaping xss playframework

我正在尝试绘制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中进行所有的转义,那将会很棒。在我看来,在几种情况下答案是“滚动你自己”,但也许我错过了所包含的内容。

2 个答案:

答案 0 :(得分:7)

我一直在研究这个,所以决定根据你已经拥有的东西,OWASP cheat sheet以及我自己的一些实验来写出我自己的答案

HTML转义:

  • $ {}或escape()函数

属性转义:(常用属性)

  • 只要您将属性用双引号(“)包装并使用$ {},就可以在播放中处理。
  • 对于复杂属性(href / src / etc.),请参阅下面的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转义:

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

网址转义

答案 1 :(得分:6)

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

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

至于属性转义,再次,就我所知,你唯一需要的时候就是在groovy模板中构建你的视图时,你可以再次使用${}escape()