目前,我正在开发 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 模板<meta name="referrer" content="origin-when-cross-origin" />
,<head>
现在 Edge 也可以正常工作了。但是,如果我不在标题中添加此元标记,我仍然不知道 Edge 有什么问题。另外,它是否会导致任何安全漏洞?
Django 解释了为什么引用者检查是必须的。
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?
我的网络概念很差,所以如果我这边有什么遗漏或错误,请纠正我。