HTTP Headers 之 Origin

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP Headers 之 Origin相关的知识,希望对你有一定的参考价值。

参考技术A

HTTP 协议中的 Origin Header 存在于请求中 用于指明当前请求来自于哪个站点

Origin 仅仅包含站点信息, 不包含 任何路径信息。

参考: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Origin

当我们的浏览器发出跨站请求时,行为正确的服务器会校验当前请求是不是来自被允许的站点。服务器就是通过 Origin 字段的值来进行的判断。

当服务器的配置出错时,比如配置成了 https://baidu.com/ ,则可能造成一些难以理解的问题。

比如有的浏览器(IE)能够请求成功,而有的浏览器却请求失败(Chrome)。这不是因为前一个浏览器行为正确,而是因为前一个浏览器发出请求时没有带上 Origin 而后一个浏览器带上了正确的 Origin 。而在服务器端,因为没有 Origin Header,所以认为这不是一次 CORS 请求,所以没有进行 CORS 校验。这也反过来要求服务端强制请求带上 Origin Header,才能进一步保证服务器的安全性。

req.headers.origin 始终未定义,如何允许多个域用于 ALLOW-FROM

【中文标题】req.headers.origin 始终未定义,如何允许多个域用于 ALLOW-FROM【英文标题】:req.headers.origin always undefined, how to allow multiple domains for ALLOW-FROM 【发布时间】:2019-01-11 05:28:59 【问题描述】:

我想允许 Access-Control-Allow-Origin (CORS) 和 ALLOW-FROM (iframe) 用于多个地址。我环顾四周,发现了这个:

Enable Access-Control-Allow-Origin for multiple domains in nodejs

还有其他几个人说要做这样的事情:

const allowedOrigins = ["https://example1.com", "https://example2.com"];

if (allowedOrigins.includes(req.headers.origin)) 
    res.set("Access-Control-Allow-Origin", req.headers.origin);
    res.set("X-Frame-Options", `ALLOW-FROM $req.headers.origin`);

问题是req.headers.origin 在开发和生产服务器中总是未定义。当我查看 Web Inspector 的 Network 选项卡时,从来没有一个名为 origin 的请求标头,只有 host 或有时是 referer

所以我尝试了以下方法:

const origin = `$req.protocol://$req.headers.host`;
res.set("Access-Control-Allow-Origin", origin);

这很好用,但它不能用于 X-Frame-Options 标头,因为 host 是 Web 所在的地址,而不是 iframe 父级的地址。我需要ALLOW-FROM https://example1.com,而不是ALLOW-FROM https://myapp.com。你能帮我解决一下吗?

【问题讨论】:

【参考方案1】:

我希望,这就是你要找的:

Configuring CORS w/ Dynamic Origin
var express = require('express')
var cors = require('cors')
var app = express()

var whitelist = ['http://example1.com', 'http://example2.com']
var corsOptions = 
  origin: function (origin, callback) 
    if (whitelist.indexOf(origin) !== -1) 
      callback(null, true)
     else 
      callback(new Error('Not allowed by CORS'))
    
  


app.get('/products/:id', cors(corsOptions), function (req, res, next) 
  res.json(msg: 'This is CORS-enabled for a whitelisted domain.')
)

app.listen(80, function () 
  console.log('CORS-enabled web server listening on port 80')
)

【讨论】:

您好,我需要为多个域设置 X-Frame-Options,以便它们可以将我的网站嵌入 iframe。 cors 是否也设置了此标头?它似乎有不同的目的(CORS 处理)。 感谢您的提示,但这对我有什么帮助?这似乎是一种更复杂的写作方式res.set("X-Frame-Options", "Deny");

以上是关于HTTP Headers 之 Origin的主要内容,如果未能解决你的问题,请参考以下文章

jmeter之headers中的Content-Type.

接口测试工具-Jmeter使用笔记(三:管理请求服务器信息和Headers参数)

Python之requests错误Expecting value: line 1 column 1 (char 0)

postman之HTTP请求

python爬虫之headers处理网络超时代理服务问题处理

php请求远程文件之返回头部信息 get_headers()