2016-02-29 67 views
2

我有一个Web应用程序,我想防止XSS。特别是,有没有:如何使用内容安全策略保护单域Web应用程序免受XSS攻击?

  • 表单提交到其他域
  • 从其他领域
  • 链接指向其他领域
  • I帧JS文件,嵌入,对象

有然而(不幸的是)很多内联JS,我将转移到JS文件,所以我可以从CSP中删除unsafe-inline

我看到它的方式,内容安全策略应该是这样的:

default-src 'self' 'unsafe-inline'; 
child-src 'none'; 
frame-src 'none'; 
object-src 'none'; 
base-uri 'self'; 
form-action 'self'; 
frame-ancestors 'none'; 
plugin-types 'none'; 
report-uri 'self'; 
sandbox ''; 
  1. 我错过了什么?

  2. 是否有一些更简单的方法来缓解unsafe-inline的风险,而不是将所有内联JS移动到外部文件?

+0

除了这些,别忘了逃避每种可能的输入类型。对于全面的讨论,让我指出你[OWASP备忘单](https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet) – MaVVamaldo

+0

@MaVVamaldo:当然 - 但这是一整套其他保护层。我正在寻找的是在编程错误的情况下的一些额外的缓解。任何想法,如果上述配置是有道理的? – johndodo

+0

如果您的网页包含用户生成的内容(例如用户名),您应该将所有内联JS移动到外部。 – Tom

回答

1

如果您真的想要,可以有内联代码。

请参阅“如果您绝对必须使用它...”部分here

基本上你要么使用nonce属性上script标签

<script nonce=EDNnf03nceIOfn39fn3e9h3sdfa> 
    //Some inline code I cant remove yet, but need to asap. 
</script> 

,然后在CSP引用此现时:

Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa' 

或生成脚本内容的SHA哈希和那么在CSP中引用它:

Content-Security-Policy: script-src 'sha256-qznLcsROx4GACP2dm0UCKCzCG-HiZ1guq6ZZDob_Tng=' 

完成此操作后,您需要删除“不安全内联”指令,以使CSP生效。请注意,您只能以这种方式执行<script>块,而不支持脚本的属性(例如OnMouseOver)。但是,您可以使用外部JavaScript或上述允许的<script>块来分配这些事件。

请记住,任何随机数都应该使用CSPRNG即时生成,否则任何攻击者都可以简单地将静态随机数附加到其注入的脚本标记中。尽管如此,您可以将该值保存在会话中,以防止在每页加载时产生额外的处理。