Java 游戏框架中正确逃生指南

Java 游戏框架中正确逃生指南,java,security,escaping,xss,playframework,Java,Security,Escaping,Xss,Playframework,我试图找出Play框架如何支持转义 这是一个很好的页面,详细说明了所需的功能: 所以我试图将其与Play模板功能联系起来,并充分理解Play的功能和不功能 HTML转义:${}或escape()函数 属性转义:我找不到内置解决方案 JavaScript转义:有一个escapeJavaScript() CSS转义:我找不到内置的解决方案 URL转义:没有什么特别的内置,但通常是Java解决方案,例如-更新:在 另一个混淆点是对index.json的支持(即使用模板构建json而不是HTML)

我试图找出Play框架如何支持转义

这是一个很好的页面,详细说明了所需的功能:

所以我试图将其与Play模板功能联系起来,并充分理解Play的功能和不功能

  • HTML转义:
    ${}
    escape()
    函数
  • 属性转义:我找不到内置解决方案
  • JavaScript转义:有一个
    escapeJavaScript()
  • CSS转义:我找不到内置的解决方案
  • URL转义:没有什么特别的内置,但通常是Java解决方案,例如-更新:在
另一个混淆点是对
index.json
的支持(即使用模板构建json而不是HTML)。
${}
是神奇地切换到JSON文档中的JavaScript转义,还是仍然转义HTML,因此JSON模板中的所有内容都必须具有显式的
escapeJavaScript()

上还有一个addSlashes(),但它似乎不适合我能想到的任何情况。(?)


这将是伟大的,有一个关于如何做游戏中逃跑的所有口味的全面指导。在我看来,在很多情况下,答案都是“自己滚”,但也许我遗漏了其中的内容

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

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


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

我一直在研究这个问题,因此决定根据您已经掌握的内容编写我自己的答案,这和我自己的一些实验

HTML转义:

  • ${}或escape()函数
属性转义:(公共属性)

  • 只要将属性用双引号(“)括起来并使用${},就可以在游戏中处理此问题
  • 有关复杂属性(href/src/etc),请参见下面的JavaScript
  • 示例不安全代码
  • 对于data.value,这将与此中断:
    • %href=javascript:alert('XSS')
    • %'href=javascript:alert(window.location)
JavaScript转义:(和复杂属性)

  • 使用escapeJavaScript()
  • 示例不安全代码
  • 对于data.value,这将与此中断:
    • ”;javascript:alert(window.location);//
CSS转义:

  • 不确定,因为我不需要这个。
    • 我想你需要以某种方式创建自己的字符串。希望有什么东西可以为你操作字符串
URL转义:

  • 使用urlEncode()

我不明白${}或escape()可用于CSS和属性。它们不能为这些上下文执行正确的转义算法。还有,json模板呢?您不必从静态文件呈现CSS,而是可以指向以CSS格式呈现的视图。因此,您可以获得groovy模板的功能/工具。至于属性,这些只是attribUTE在一个HTML元素上,所以你可以有一些代码,比如div content,你不需要像上面的addSlashes()示例那样做吗?例如${myValue.someCSSEscapeFunction().raw()}?如果没有.raw(),那么在CSS转义的基础上会有HTML转义,这会中断。我不认为someCSSEscapeFunction()已经存在于游戏中…例如,你会使用什么来做-我认为它必须像${user.name.escapeAttribute().raw()}但是没有一个escapeAttribute()对吗?HTML转义在这里不起作用。是的,你使用CSS是对的,那只会进行HTML转义。the.raw()函数表示不会转义HTML。默认情况下,Play会自动转义HTML,因此您只需使用${user.name}添加了一个悬赏。我认为一个很好的答案看起来像是一个特定于游戏的版本,显示了在代码和模板中要做什么,还包括JSON模板。你当然可以将答案作为补丁添加到游戏文档中!另一个有用的工具可能是“asJavascriptString()“转换为JS字符串文字。你可以试着在问这个问题,他们通常反应非常迅速……相关:来这里就是为了寻找CSS escapingGreat,我来这里是为了寻找它的其余部分,因此在我找到答案时添加了答案。有CSS转义详细信息时,请添加它们:)