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

2022-09-01 17:52:38

我试图弄清楚Play框架如何支持转义。

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

因此,我试图将其与Play模板功能联系起来,并完全了解Play做什么和不做什么。

另一个混淆点是支持(即使用模板来构建JSON而不是HTML)。在JSON文档中是否神奇地切换到JavaScript转义,或者它是否仍然转义HTML,因此JSON模板中的所有内容都必须具有显式?index.json${}escapeJavaScript()

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

如果有一个关于如何在Play中逃脱的所有口味的彻底指导,那就太好了。在我看来,在几种情况下,答案是“滚你自己的”,但也许我错过了包含的内容。


答案 1

我一直在研究这个问题,所以决定根据你已经拥有的东西写下我自己的答案,这个OWASP备忘单和我自己的一些实验

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 转义:

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

网址转义:


答案 2

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

OWASP 标准指定应转义不受信任的代码。因此,在CSS中拥有不受信任的代码的唯一方法是动态生成代码。如果它是动态生成的,那么没有什么可以阻止您使用标准Groovy模板执行此操作,因此使用和。${}escape()

至于属性转义,据我所知,您唯一需要它的时间是在时髦的模板中构建视图时,因此,您可以使用or 。${}escape()