CORS 和 Web 扩展

2024-01-20

我设置了一个服务器http://本地主机:8080 http://localhost:8080 where http://example.com http://example.com可以执行 POST 请求:

'use strict';

const express = require('express');

const app = express();
const port = 8080;

// allowing CORS for example.com
app.use('/', function (req, res, next) {
    res.header('Access-Control-Allow-Origin', 'http://example.com');
    if (req.method === 'OPTIONS') {
        res.header('Access-Control-Allow-Methods', 'OPTIONS, POST');
        res.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length');
        res.status(200).send();
    } else {
        next();
    }
});

// handling POST requests
app.use('/', function (req, res) {
    console.log('a client did a POST request');
    res.status(200);
});

app.listen(port, () => console.log ('server started on port ' + port));

它工作正常:我无法执行 POST 请求http://本地主机:8080 http://localhost:8080 from http://本地主机:8081 http://localhost:8081因为同源政策。

然后我为 Firefox 编写了一个 Web 扩展,它将尝试向http://本地主机:8080 http://localhost:8080来自任何域。

这是它的清单:

{
    "manifest_version" : 2,
    "name" : "aBasicExtension",
    "version" : "0.0.0",
    "content_scripts" : [
        {
            "matches" : ["<all_urls>"],
            "js" : ["content-script.js"]
        }
    ],
    "permissions" : ["*://*.localhost/*"]
}

and its content-script.js code :

(() => {

    'use strict';

    const xhr = new XMLHttpRequest();

    xhr.open('POST', 'http://localhost:8080');
    xhr.setRequestHeader('Content-Type', 'application/json; charset=utf-8');

    xhr.addEventListener('readystatechange', () => {
        if (xhr.readyState === XMLHttpRequest.DONE){
            if (xhr.status === 200) console.log('OK');
            else console.error('an error has occured : ' + xhr.status);
        }
    });

    xhr.send(JSON.stringify({dataName: 'some data here'}));

})();

我不明白的是它有效。扩展程序执行请求http://本地主机:8080 http://localhost:8080Firefox 并没有阻止它,因为清单允许它,但是服务器(http://本地主机:8080 http://locahost:8080) 没有得到他的许可.


简短版本:CORS 是一种用于控制浏览器行为的协议,而不是服务器的行为。以及您对插件的使用permissions设置绕过了同源策略和 CORS 的需要。

如果您查看 CORS 代码,您会发现它没有执行任何拒绝请求的操作;它只是在响应上设置标头。这些标头将指示浏览器客户端是否可以读取响应,但无论如何都会发送响应。

这一事实可能会被某些强制 CORS 预检的请求所掩盖。在这种情况下,浏览器首先发送一个特殊的OPTIONS请求,以及附加到该响应的标头可以阻止浏览器发送真正的请求。这是一种向后兼容机制,并不适用于所有请求。 (看这个答案 https://stackoverflow.com/questions/15381105/cors-what-is-the-motivation-behind-introducing-preflight-requests/41687744#41687744以获得更长的解释。)

这就是你的例子中发生的情况。你的POST属于需要在 CORS 下进行飞行前检查的类型。因此,在常规版本中,浏览器会发送预检检查,查看响应标头,并且不会发送真正的请求。但如果它是一种不同类型的 POST,它将直接发送请求,并且服务器将执行它。

在插件版本中,您特别允许在您的permissions环境。这绕过同源策略 https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#Host_permissions:

额外的权限包括:XMLHttpRequest 和获取对这些源的访问权限,而无需跨源限制(即使是从内容脚本发出的请求)。

因此在这种情况下不需要预检,直接发送请求。

如果您想拒绝服务器上来自某些域的请求(或更普遍地防止 CSRF),则可以进行其他设置。它们是什么取决于您的网络框架。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CORS 和 Web 扩展 的相关文章

随机推荐

  • 悬停时重新启动动画

    我正在尝试创建一些复活节动画 其中有一只小兔子接住了下落的鸡蛋 现在效果很好 但我遇到的麻烦是我似乎无法创建一个按钮来重新启动我的多个动画并让它们再次下落 向下移动 我已经尝试了很多东西 这似乎是我能得到的最接近的东西 但这似乎只是播放 暂
  • 如何在无人值守的情况下安装 Visual Studio Build Tools?

    我正在尝试在 PowerShell 中以无人值守的方式安装 Visual Studio Build Tools 我跟着https silentinstallhq com visual studio build tools 2022 sile
  • 我应该将自定义方法从控制器移至模型吗?

    假设我有一个产品模型和 ProductsController 控制器具有所有标准的 CRUD 方法 产品执行各种验证等 这里有一个问题 我有几个自定义的非常复杂的操作 它们也需要以多种格式响应 json html xml csv pdf 等
  • 检查 CancellationTokenSource.Cancel() 是否已使用 Moq 调用

    我有一个条件语句 应如下所示 if view VerifyData true else view PermanentCancellation Cancel 其中 PermanentCancellation 的类型为 Cancellation
  • 如何获取 Windows 用户帐户的用户权限和特权

    我需要能够检查所有these http technet microsoft com en us library dd349804 v WS 10 aspx用户权利和特权 我尝试使用令牌来访问这些 但这仅完成了权限列表 我查过这个图书馆 ht
  • 每个 Android 设备的唯一 ID

    我实际上正在开发一个 Android 应用程序 希望为每个 Android 设备捕获唯一的 Id 但不确定哪个 Id 是可靠的 电话号码Imei imsi 从android 10开始 即使提供了权限 第三方应用程序也将无法检索此id 安全
  • 链式作业如何进行?

    引用某事 gt gt gt x y somefunction 是相同的 gt gt gt y somefunction gt gt gt x y 问题 是 x y somefunction 与 x somefunction y somefu
  • “3.4E +/- 38(7 位数字)”到底是什么意思? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我试图了解数据类型的范围 对于非浮点
  • ELOOP:遇到太多符号链接

    当尝试点击命令时 npm install g angular email protected cdn cgi l email protection Note 我有 Node Js LTS 10 xx 版本 Net Framework 4 7
  • StreamSocket、DataWriter.StoreAsync()、DataReader.LoadAsync() -- 异步问题

    我正在创建一个 Win 8 商店应用程序 在其中使用 StreamSocket 连接到用 Java 编写的服务器 当我在调试中运行应用程序时 在 StreamSocket ConnectAsync DataWriter StoreAsync
  • Swift:以模态方式呈现并解除导航控制器

    我有一个非常常见的 iOS 应用场景 The MainVC该应用程序的一个UITabBar控制器 我在 AppDelegate swift 文件中将此 VC 设置为 rootViewController func application a
  • “不匹配”的正则表达式语法?

    我有一个大量使用正则表达式的 python 模板引擎 它使用像这样的串联 re compile regexp1 regexp2 regexp3 我可以修改各个子字符串 regexp1 regexp2 等 是否有任何不匹配的小而轻的表达式 我
  • Keras Tuner:根据层数选择单元数

    我正在使用 Keras Tuner 来调整神经网络的超参数 我想搜索隐藏层的最佳数量以及每层中的最佳单元数 为了避免模型过度参数化 我想施加以下条件 如果模型有两层 则选择最佳的单元数 每层最多 64 个 如果模型有一层 则选择最佳的单元数
  • iOS swift3 图表xaxis重复值问题

    我在使用 iOS 图表库为 xAxis 创建字符串值时遇到问题 x 值总是有重复值 请参见下图 您可以看到值总是JAN JAN JAN JAN FEB FEB FEB 我如何设置图表的 x 值 如下所示JAN FEB MAR import
  • PHP - 如何将数组发送到另一个页面?

    我正在尝试将数组发送到另一个页面 我之前尝试过的是 page1
  • 如何通过调用命名空间中没有该方法的函数来找到未附加包中的非导入方法?

    R 命名空间充当其关联包中所有函数的直接环境 换句话说 当函数bar 从包装中foo调用另一个函数 R 求值器首先在中搜索另一个函数
  • JQuery Select2 - 如何选择所有选项

    我正在使用 jQuery select2 多选下拉列表 我需要从代码中选择下拉列表中的所有选项 基本上有一个全选复选框 必须在其上实现此功能 我想从此复选框中选择 取消选择选项 使用选择 2DEMO http jsfiddle net jE
  • 强制 MATLAB 重新加载 mex 函数中链接的库

    我有一个墨西哥功能 比如说myfunction mexmaci64 这是 OS X 上的正确结局 现在 myfunction 链接到一个库mylibrary dylib mex 文件和库都位于同一文件夹中 现在 每当我改变一些东西mylib
  • Delphi:启动应用程序的快捷方式在哪里? [复制]

    这个问题在这里已经有答案了 我知道可以使用 Application Exename 找到当前可执行文件所在的目录 但是当应用程序使用另一个目录中的快捷方式启动时呢 我可以找到快捷方式所在的那个目录的地址吗 因为我想在那里创建一些文件 使用X
  • CORS 和 Web 扩展

    我设置了一个服务器http 本地主机 8080 http localhost 8080 where http example com http example com可以执行 POST 请求 use strict const express