📌  相关文章
📜  拒绝执行内联脚本,因为它违反了以下内容安全策略指令 - Javascript (1)

📅  最后修改于: 2023-12-03 15:25:52.208000             🧑  作者: Mango

拒绝执行内联脚本,因为它违反了以下内容安全策略指令 - Javascript

在现代Web应用程序中,内容安全策略(Content Security Policy,CSP)是一种重要的安全控制,可以限制浏览器从何处加载资源。CSP 的主要目的是减少攻击者针对应用程序的攻击面。

如果网站使用 CSP,浏览器将拒绝执行内联脚本,以防止潜在的跨站脚本(XSS)攻击。如果内联脚本被拒绝执行,则会显示国际化的错误消息,如下所示:

Refused to execute inline script because it violates the following Content Security Policy directive: "script-src 'self'". Either the 'unsafe-inline' keyword, a hash ('sha256-...'), or a nonce ('nonce-...') is required to enable inline execution.

这个错误消息说明了CSP的指令,也给出了如何允许内联脚本的几种方式,如使用unsafe-inline关键字,使用哈希或使用随机数(nonce)。

CSP指令解释

CSP指令通常使用HTTP头或元素标签中的Content-Security-Policy字段来指定。指令分别对应不同功能:

  • default-src:指定允许加载的外部内容的地址
  • script-src:指定允许加载JavaScript的地址,包括内联代码
  • style-src:指定允许加载样式表的地址,包括内联样式
  • img-src:指定允许加载图像的地址
  • media-src:指定允许加载媒体资源的地址
  • font-src:指定允许加载字体的地址
  • connect-src:指定允许Ajax和WebSockets请求的地址
  • object-src:指定允许加载插件和嵌入式内容的地址
  • child-src:指定允许创建嵌入式内容(如和
  • frame-src:指定允许创建和
  • sandbox:对当前资源强制使用安全策略
如何解决内联脚本被拒绝执行问题

有三种方法可以解决内联脚本被CSP拒绝执行的问题:

1. 使用'unsafe-inline'关键字

这种方法很方便,但不建议使用。只需要将script-src指令中加入'unsafe-inline'关键字即可。例如:

<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';">

这样就允许了内联脚本。但由于使用'unsafe-inline'可以使应用程序容易受到XSS攻击,因此不建议使用。

2. 使用哈希

另一种允许内联脚本的方法是使用哈希,哈希可确保脚本内容没有被篡改。可以为允许的脚本指定一个哈希值,例如:

<script>
  function say_hello() {
    alert("Hello!");
  }
</script>
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'sha256-u4oyMdE4KjmwNe0ihbMEwiLSdzqjE9ITq3ikczs+ihY=';">

这样可以确保指定脚本内容不被篡改,但也存在一些弊端:

  • 需要为每个脚本都生成一个哈希值
  • 对于动态生成的脚本,哈希无法生效
3. 使用随机数(nonce)

最后一种方法是使用随机数(nonce),与哈希类似,但更加灵活,可以确保内联脚本代码没有被篡改。随机数(nonce)是一个任意字符串,只要在同一个页面上使用相同的字符串就可以了。例如:

<script type="text/javascript" nonce="H2yidiDoodle">
  function say_hello() {
    alert("Hello!");
  }
</script>
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'nonce-H2yidiDoodle';">

在CSP中指定相同的随机数,浏览器就可以执行内联脚本了。不过,需要注意以下几点:

  • 需要在每个允许执行的脚本中指定相同的 nonce 值
  • nonce 值必须是根据 CSP 指令的规则生成的随机值,不能与其它 nonce 值重复
  • 攻击者如果能够注入恶意的内联脚本,则可以篡改 nonce
总结

在开发Web应用程序时, CSP 是一种重要的安全机制,可以大大减少Web应用程序的风险。在使用 CSP 时,需要非常小心,确保配置正确,避免应用程序容易受到攻击。