在Play框架中正确转义的指南
我正在尝试绘制Play框架如何支持转义。
这是一个很好的页面,列出了所需的function: https : //www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet
因此,我试图将其与Play模板function联系起来,并充分了解Play的function和不执行function。
- HTML转义:
${}
或escape()
函数 - 属性转义:我找不到内置解决方案
- JavaScript转义:有一个
escapeJavaScript()
http://www.playframework.org/documentation/1.2/javaextensions - CSS转义:我找不到内置的解决方案
- URL转义:没有什么特别的内置,但通常的Java解决方案,例如Java相当于生成相同输出的JavaScript的encodeURIComponent? – 更新:在http://www.playframework.org/documentation/1.2/javaextensions上有urlEncode()
另一个困惑点是对index.json
的支持(即使用模板来构建JSON而不是HTML)。 ${}
是否神奇地切换到JSON文档中的JavaScript转义,或者它是否仍然转义HTML,因此JSON模板中的所有内容都必须具有显式的escapeJavaScript()
?
在http://www.playframework.org/documentation/1.2/javaextensions上也有一个addSlashes(),但对于我能想到的任何情况,它似乎都不太合适。 (?)
如果有一个关于如何在Play中进行所有转义的全面指导,那将是很棒的。 在我看来,在几种情况下答案是“滚动你自己”,但也许我错过了所包含的内容。
我一直在调查这个,所以决定根据你已经拥有的东西,这个OWASP备忘单和我自己的一些实验来写出我自己的答案。
HTML转义:
- $ {}或escape()函数
属性转义:(通用属性)
- 只要您将属性用双引号(“)包装并使用$ {},就可以在播放中处理。
- 对于复杂属性(href / src / etc.),请参阅下面的JavaScript
- 示例不安全的代码
- 对于data.value,这会打破这个:
-
% href=javascript:alert('XSS')
-
%' href=javascript:alert(window.location)
-
JavaScript转义:(和复杂的属性)
- 使用escapeJavaScript()。 http://www.playframework.org/documentation/1.2/javaextensions
- 示例不安全的代码
- 对于data.value,这会打破这个:
-
'; javascript:alert(window.location);//
-
CSS转义:
- 不确定,因为我不需要这个。
- 我想你需要以某种方式创造自己的。 希望有一些东西可以为你操纵弦乐。
url转义:
我认为你的摘要绝对正确。 Play为您提供了一些解决方案,但并非全部。 但是,在Play没有提供某些东西的地方(在CSS和属性中),我实际上找不到它的需要。
OWASP标准指定您应该转义不受信任的代码。 因此,在CSS中使用不受信任的代码的唯一方法是动态生成它。 如果它是动态生成的,那么没有什么能阻止你使用标准的Groovy模板,因此使用${}
和escape()
。
至于属性转义,再次,就我所知,你唯一需要这个时候就是在groovy模板中构建你的视图时,你可以再次使用${}
或escape()
。