内容安全策略阻止对 *://www.google.com/recaptcha/api 的请求

Content security policy blocking requests to *://www.google.com/recaptcha/api

本文关键字:google www com api 请求 recaptcha 安全策略      更新时间:2023-09-26

鉴于此链接,它似乎是内联脚本,例如用于在页面中插入 recaptcha 对象,通过

<script type="text/javascript"
     src="http://www.google.com/recaptcha/api/challenge?k=your_public_key">
</script>
<noscript>
<iframe src="http://www.google.com/recaptcha/api/noscript?k=your_public_key"
     height="300" width="500" frameborder="0"></iframe><br>
<textarea name="recaptcha_challenge_field" rows="3" cols="40">
</textarea>
<input type="hidden" name="recaptcha_response_field"
     value="manual_challenge">
</noscript>

或通过

 <script type="text/javascript" src="http://www.google.com/recaptcha/api/js/recaptcha_ajax.js"></script>

Recaptcha.create("your_public_key",
"element_id",
{
  theme: "red",
  callback: Recaptcha.focus_response_field
}

);

我总是收到一些关于内容安全策略的抱怨,尽管我的 manifest.json 显然允许像 url 这样的 http://www.google.com/recaptcha/api/js/recaptcha_ajax.js

我是否错过了一些非常明显的东西,使整个问题变得疯狂?

我只是花了两个小时来解决这个问题。对我来说,我认为对于这个例子,问题在于src属性;也就是说,在http:.更改引用,如下所示:

<script type="text/javascript" 
     src="https://www.google.com/recaptcha/api/challenge?k=your_public_key">
              ^  v
<iframe src="https://www.google.com/recaptcha/api/noscript?k=
     height="300" width="500" frameborder="0"></iframe>

修复了问题。基本上,您正在尝试使用不安全的连接访问Google API,并且某些浏览器(例如Chrome)默认情况下不会呈现不安全的内容。

在 Chrome 扩展程序中,不安全http无法通过 CSP.
列入白名单文档指出:

放宽默认策略

(...另一方面,如果您需要一些外部JavaScript或对象资源,可以通过将脚本应来自的特定 HTTPS 源列入白名单接受。将不安全的 HTTP 资源列入白名单将不起作用。这是有意为之的,因为我们希望确保可执行加载了扩展提升权限的资源正是所需的资源,但尚未被活动网络替换攻击者。由于中间人攻击既微不足道又无法通过 HTTP 检测,仅接受 HTTPS 源。

您应该将所有资源调用设置为协议相对 URL。基本上删除任何http:或https:,只需使用//

更多信息在这里http://www.paulirish.com/2010/the-protocol-relative-url/

在这里,在

<脚本 src="中将 http://替换为//是否有效 http://...">?