You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

连接BrasilAPI时遇Content Security Policy脚本加载错误求助

解决Content Security Policy阻止加载外部脚本的问题

问题分析

错误提示显示当前生效的CSP规则script-src 'self' 'wasm-unsafe-eval' 'inline-speculation-rules'阻止了加载https://apis.google.com/js/api.js。你的代码里没有直接引入该脚本,大概率是Font Awesome Kit这类依赖间接触发了它的加载,而现有CSP规则未允许对应源。

另外注意:你HTML头部的meta标签仅设置了upgrade-insecure-requests,说明实际生效的CSP来自其他渠道——可能是服务器响应头,或是开发构建工具自动注入的规则。

解决方案

1. 调整Content Security Policy规则

需要在CSP中添加允许加载相关外部脚本的源:

  • 允许Font Awesome Kit的脚本源:https://kit.fontawesome.com
  • 允许Google的脚本源:https://apis.google.com

如果通过meta标签设置CSP,修改对应的meta标签为:

<meta http-equiv="Content-Security-Policy" content="
  upgrade-insecure-requests;
  script-src 'self' 'wasm-unsafe-eval' 'inline-speculation-rules' https://kit.fontawesome.com https://apis.google.com;
  style-src 'self' https://kit.fontawesome.com;
  font-src 'self' https://kit.fontawesome.com;
">

如果是服务器端设置CSP响应头,需要在Content-Security-Policy字段中添加上述源。

2. 修复JavaScript代码的两处问题

你的循环逻辑和DOM插入方式存在错误,修改后代码如下:

async function carregarEstados(){
    const APIResponse = await fetch(`https://brasilapi.com.br/api/ibge/uf/v1`)
    if(APIResponse.status === 200){
        const data = await APIResponse.json()
        console.log(data[0]['sigla'])
        for (let index = 0; index < data.length; index++) {
            const option = document.createElement('option')
            option.value = data[index]['sigla']
            option.textContent = data[index]['sigla']
            document.querySelector('#estado').append(option)
        }
    }else{
        console.log("Algo deu errado")
    }
} 

修改点说明:

  • 循环从索引0开始,避免漏掉第一个州的数据,同时防止访问超出数组长度的undefined项
  • 使用createElement创建option元素后再插入DOM,替代直接拼接HTML字符串的方式,避免append()方法无法识别HTML字符串的问题

额外提示

如果是在Vite、Create React App这类开发环境中,工具可能会自动注入CSP规则,需要在对应配置文件中修改CSP相关设置;生产环境则需确保服务器配置的CSP响应头包含必要的源。

内容的提问来源于stack exchange,提问作者G4rutti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 09:31:05