如果请求和响应的 uri 相同,为啥 Microsoft Edge 在调用 POST/REDIRECT/GET 方法时发送空的 http-referer?

Posted

技术标签:

【中文标题】如果请求和响应的 uri 相同,为啥 Microsoft Edge 在调用 POST/REDIRECT/GET 方法时发送空的 http-referer?【英文标题】:why does Microsoft edge send empty http-referer on call of POST/REDIRECT/GET method if uri of request and response is same?如果请求和响应的 uri 相同,为什么 Microsoft Edge 在调用 POST/REDIRECT/GET 方法时发送空的 http-referer? 【发布时间】:2019-06-27 22:13:44 【问题描述】:

目前,我正在开发 Django1.11 项目,我使用带有方案“https”的 nginx 部署了我的应用程序。我想提交表单但不想重新提交,所以我使用了 POST/REDIRECT/GET 模式。在 Mozilla 和 chrome 上一切正常,如预期的那样,即对于 POST/REDIRECT/GET 调用将呈现相应的网页,在重新加载和重新提交时,相同的表单将按预期呈现 403 访问被拒绝。仅当我在 Microsoft EDGE 浏览器中测试相同视图时才会出现此问题。在调用 POST/REDITECT/GET 方法时,它直接向我抛出 403。403 的原因是 'REASON_NO_REFERER'。 Microsoft Edge 在使用 POST/REDIRECT/GET 模式时转发空 HTTP-referer。

我找到了一个补丁:

html 模板的 <head> 中添加 <meta name="referrer" content="origin-when-cross-origin" />,现在 Edge 也可以正常工作了。但是,如果我不在标题中添加此元标记,我仍然不知道 Edge 有什么问题。另外,它会导致任何安全漏洞吗?

Django 解释了为什么必须进行referer 检查。

Suppose a user visits http://example.com/
            # An active network attacker (man-in-the-middle, MITM) sends a
            # POST form that targets https://example.com/detonate-bomb/ and
            # submits it via javascript.
            #
            # The attacker will need to provide a CSRF cookie and token, but
            # that's no problem for a MITM and the session-independent
            # secret we're using. So the MITM can circumvent the CSRF
            # protection. This is true for any HTTP connection, but anyone
            # using HTTPS expects better! For this reason, for
            # https://example.com/ we need additional protection that treats
            # http://example.com/ as completely untrusted. Under HTTPS,
            # Barth et al. found that the Referer header is missing for
            # same-domain requests in only about 0.2% of cases or less, so we can use strict Referer checking.

那么,在这种情况下,是否意味着必须在 HTML 中添加元数据才能在 HTTP-referer 中提供 xyz-origin?如果是,是否会导致中间人攻击的任何安全漏洞,因为攻击者也可能有 http-referer?

我的网络概念很差,所以如果我这边有什么遗漏或错误,请纠正我。

【问题讨论】:

在 Microsoft Edge 42.17134.1098.0 的一种情况下仅针对 POST 遇到此类问题。其他浏览器或 IE 或 Edge 版本没有。 【参考方案1】:

meta referrer 标签可与大多数浏览器一起使用,以用户定义的方式传递引用者信息。流量仍然加密,使用 HTTPS 的所有好处仍然存在,但现在您可以将引荐来源数据传递到所有网站,甚至是使用 HTTP 的网站。

Origin When Cross-Origin:当目标具有相同的方案、主机和端口(即子域)时,无论是 HTTP 还是 HTTPS,都将完整的 URL 作为引用者发送,同时发送 origin-仅将信息推荐给外部站点。

因此,基于此,我认为您不会遇到任何与安全相关的问题。

参考资料:

(1)The Meta Referrer Tag: An Advancement for SEO and the Internet

(2)SEO for HTTPS Sites: Should You Implement the Meta Referrer Tag?

(3)https://www.w3.org/TR/referrer-policy/

【讨论】:

这些网址非常有用。基本上我知道我们应该根据我们的要求使用元引荐来源网址。

以上是关于如果请求和响应的 uri 相同,为啥 Microsoft Edge 在调用 POST/REDIRECT/GET 方法时发送空的 http-referer?的主要内容,如果未能解决你的问题,请参考以下文章

laravel框架总结 -- 请求和响应

接口测试- 请求和响应

为啥这里“找不到与请求 URI 匹配的 HTTP 资源”?

HTTP状态码

向 Cassini Web 服务器发送请求 URI 为“/”的 POST 请求,导致 405 错误。为啥?

http 301和302的区别