我正在使用其公共 api 访问 NASA 图片,但收到此错误:
\n\nCross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at\n[nasa api website] (Reason: CORS header \xe2\x80\x98Access-Control-Allow-Origin\xe2\x80\x99 missing).\nRun Code Online (Sandbox Code Playgroud)\n\n但是当我检查他们的响应头时, \xe2\x80\x98Access-Control-Allow-Origin\xe2\x80\x99 存在并设置为 \'*\',在这里你可以看到它:
\n\n响应标头:
\n\nAccess-Control-Allow-Origin *\nAge 0\nCache-Control max-age=0, private, must-revalidate\nContent-Encoding gzip\nContent-Type application/json; charset=utf-8\nDate Sat, 28 Mar 2020 14:37:13 GMT\nEtag W/"e26hidden..."\nReferrer-Policy strict-origin-when-cross-origin\nServer openresty\nStrict-Transport-Security max-age=31536000; includeSubDomains\nVary Origin\nVia https/1.1 api-umbrella (ApacheTrafficServer [cMsSf ]), 1.1 vegur\nX-Cache MISS\nX-Content-Type-Options nosniff\nX-Download-Options noopen\nX-Frame-Options SAMEORIGIN\nX-Permitted-Cross-Domain-Policies none\nX-RateLimit-Limit 1000\nX-RateLimit-Remaining 999\nX-Request-Id 00c8c415-37ad-474b-bfbd-8e968d60f37f\nX-Runtime 0.125778\nX-Xss-Protection 1; mode=block\nRun Code Online (Sandbox Code Playgroud)\n\n请求标头:
\n\nAccept text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\nAccept-Encoding gzip, deflate, …Run Code Online (Sandbox Code Playgroud) 我是 CORS 配置的新手并试图解决这个问题,但根据文档,我的设置看起来是正确的。我希望你能帮我看看我错过了什么。我的代码正在尝试PUT使用签名 url将 ( ) 文件直接上传到谷歌存储。
访问 XMLHttpRequest ' https://storage.googleapis.com/herdboss-dev.appspot.com/uploads/152/152-owner-152-61.jpg?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Go ...' 来自 ' https://herdboss-dev.appspot.com ' 已被 CORS 策略阻止:请求的资源上不存在 'Access-Control-Allow-Origin' 标头。
我已经在我的 Google 存储桶上设置了 CORS 策略(为了可读性添加了换行符):
% gsutil cors get gs://herdboss-dev.appspot.com
[{
"maxAgeSeconds": 3600,
"method": ["GET", "HEAD", "PUT"],
"origin": ["https://herdboss-dev.appspot.com"],
"responseHeader": ["X-Requested-With", "Access-Control-Allow-Origin", "Content-Type"]
}]
Run Code Online (Sandbox Code Playgroud)
根据我的 chrome 检查员,飞行前请求发生并返回正确的方法和标题(据我所知)。另外,作为旁注,我注意到 PUT 在 OPTIONS 之前出现在我的 Chrome 检查器中,但时间戳显示 OPTIONS 是最先发送的。
当OPTIONS调用发生时,Google Storage 会正确响应并表示它可以支持我的请求方法GET, HEAD, PUT和来源https://herdboss-dev.appspot.com:
放置请求
但是,当PUT发生这种情况时,Google Storage 不会以正确的Access-Control-Allow-Origin标头响应:
我错过了什么或做错了什么?PUT当我进行直接 …
使用node.js 的请求模块,可以很容易地设置请求并从源中正确压缩压缩数据的请求:
var request = require('request');
var requestOptions = {
url: 'http://whatever.com/getDataWithCompression',
gzip: true // <--- this is all that is required
};
request(
requestOptions,
function (error, response, data) {
// do stuff with data (which is already decompressed)
}
);
Run Code Online (Sandbox Code Playgroud)
但是,我在html文档中嵌入了一些js代码,这些代码也需要发出http请求,所以没有request我使用的node.js 模块XMLHttpRequest:
var request = new XMLHttpRequest();
request.open('GET', 'http://whatever.com/getData', true);
request.onload = function() {
// do stuff with request.responseText
};
request.send();
Run Code Online (Sandbox Code Playgroud)
但是,尽管有大量的谷歌搜索,我无法弄清楚如何发出XMLHttpRequest请求和解压缩gzip压缩数据.将不胜感激任何帮助.
根据我的理解,使用CORS模块将从Access-Control-Allow-Origin资源中删除标头,导致XmlHttp请求从浏览器失败.
但是,这是否会阻止来自CURL或其他本机应用程序/ Web服务器的Http请求(即通过PHP编写并运行的请求)成功从该资源检索数据?
我正在尝试编写一个拦截器,以使用Angular向所有HTTP请求添加令牌。我大致使用这里给出的食谱-https: //thinkster.io/interceptors
因此代码使用http模块工厂和一个tokenInterceptor()函数。我可以成功地将令牌添加为请求的标头-但是现在,当令牌通过拦截器时,它会被某种CORS阻止机制阻止。我在Chrome控制台中收到此错误-
XMLHttpRequest无法加载http://127.0.0.1:/。对预检请求的响应未通过访问控制检查:请求的资源上不存在“ Access-Control-Allow-Origin”标头。因此,不允许访问源“ http://127.0.0.1:/ ”。响应的HTTP状态码为403。
我尝试将拦截器如下所示的访问控制允许源标头设置为无效:
config.headers['Access-Control-Allow-Origin'] = '*';
Run Code Online (Sandbox Code Playgroud)
我在网上尝试了一些建议,但没有帮助。要解决与CORS相关的问题,客户端是否需要做任何事情-还是服务器方面的问题?
我正在尝试修复具有 onblur 事件侦听器的代码,该事件侦听器执行 setSelectionRange。我注意到,在 Chrome 上使用此功能时,模糊事件会将光标移动到下一个选项卡索引。然而,在 safari 上,光标保留在同一元素上,并且光标移动到 setSelectionRange 中指定的位置。
问题:
下面是一段 hello world 代码,显示了当我在 Safari 和 Chrome 中按 Tab 键移出某个字段时,光标的行为有何不同:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>JS Bin</title>
<script>
function handleBlur() {
event.target.setSelectionRange(1,1)
};
</script>
</head>
<body>
<input value="First Name" onblur="handleBlur()">
<input value="Last Name" onblur="handleBlur()">
</body>
</html>
Run Code Online (Sandbox Code Playgroud) 我启用了内容安全策略meteor包meteor/browser-policy-common
现在我从ostrio收到这个错误:与CSP相关的文件
拒绝从'blob:http:// localhost:3000/ef628f55-736b-4b36-a32d-b1056adfaa8c ' 创建一个worker,因为它违反了以下内容安全策略指令:"default- src'self'http :// fonts. googleapis.com https://fonts.googleapis.com http://fonts.gstatic.com https://fonts.gstatic.com http://code.ionicframework.com https://code.ionicframework.com ".请注意,'worker-src'未明确设置,因此'default-src'用作后备.
我的实际browser-policy-common配置看起来像这样
import { BrowserPolicy } from 'meteor/browser-policy-common';
// e.g., BrowserPolicy.content.allowOriginForAll( 's3.amazonaws.com' );
// BrowserPolicy.content.allowFontOrigin("data:");
BrowserPolicy.framing.disallow();
BrowserPolicy.content.disallowInlineScripts();
BrowserPolicy.content.disallowEval();
BrowserPolicy.content.allowInlineStyles();
BrowserPolicy.content.allowFontDataUrl();
const trusted = [
'fonts.googleapis.com',
'fonts.gstatic.com',
'code.ionicframework.com',
];
_.each(trusted, (origin) => {
BrowserPolicy.content.allowOriginForAll(origin);
});
Run Code Online (Sandbox Code Playgroud)
你能告诉我应该更改哪个配置以允许ostrio:文件blob:http:// localhost:3000 / ...工作?
非常感谢!
有谁遇到过Google Chrome和SRI Hash这个问题,它在控制台窗口中不断抛出相同的错误:
无法找到在“诚信”属性的有效消化资源“ https://fonts.googleapis.com/css?family=Indie+Flower ”与计算SHA-256诚信“yxJPuU / cJi0 / 8FoS + agssT / MtC4P3SGuU + JOzbTejqQ ='。资源已被阻止。
我正在从https://report-uri.io/home/sri_hash生成代码,并且还尝试过https://www.srihash.org/
根据这个网站https://glebbahmutov.com/blog/subresource-integrity/,作者有同样的问题,因此添加了多个散列<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Indie+Flower" integrity="sha256-CoGIUDlbZltnYk6u/wQKXOszdOOWImA1XzSERnNzHlc= sha384-vk+perBz0d5g0G+x7+4BxElvHeiaLNX7jegOI63Bg53TxNYaUzLGEsSQ4AmIwVr4 sha512-h+9Z3+9s3jtPJjXU9phAXFQwYYFSYhXlnkPwkuubLFf5kfeXWIRC32YkRdB08xmut/dJG/RjPoiR/r4DAtm3PQ==" crossorigin="anonymous">
我拼命地尝试让会话cookie在我的环境中工作,但到目前为止还没有运气。
我的后端是一个节点/express 应用程序,在端口 3000 上运行。CORS 启用如下:
const corsOptions = {
origin: "http://127.0.0.1:4300",
allowedHeaders: [ "Origin", "X-Requested-With", "Content-Type", "Accept", "Authorization", "x-xsrf-token" ],
credentials: true
};
if (isDebug) {
corsOptions.maxAge = 1;
}
app.use(cors(corsOptions));
Run Code Online (Sandbox Code Playgroud)
我使用快速会话和护照进行登录。会话配置如下:
const options = {
secret: '...',
cookie: { httpOnly: true }
};
app.use(session(options));
Run Code Online (Sandbox Code Playgroud)
前端是 Angular 2 SPA,在端口 4300 上运行。当我从 Express 服务器为前端提供服务时,一切都按预期工作。但如果没有,我会遇到以下晦涩的问题:
登录路由返回带有会话 ID 的 cookie。但是到后端的下一个请求是使用不同的会话 ID 发送的?!我不知道这个不同的会话 ID 是从哪里来的。特别是因为会话 cookie 被标记为仅限 HTTP。
HTTP 请求的发送方式如下:
const response = this.http.get(url, { withCredentials: true });
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法:
TL;DR:网站通过 HTTPS 提供服务,需要通过未加密的通道 (ws:// url) 访问 WebSockets 服务器。浏览器不喜欢这样。
加密 Websocket 是可能的,但不方便 - 没有可以签署证书的可信机构,因此需要为每个客户端手动安装它。我想把它作为最后的手段。
该网站必须通过 HTTPS 提供服务,并且不能降级为 HTTP。
有没有其他方法可以绕过这个限制?我尝试了内容安全策略,但它不起作用。
javascript ×5
cors ×3
ajax ×1
angular ×1
angularjs ×1
asp.net-core ×1
cookies ×1
cross-domain ×1
cross-site ×1
encryption ×1
express ×1
hash ×1
html-input ×1
http-headers ×1
httprequest ×1
interceptor ×1
meteor ×1
node.js ×1
reactjs ×1
request ×1
safari ×1
security ×1
websocket ×1