我有 2 个选项供您选择,做正确的方法和完全不做。
正确的方法
(警告:成本很高)
假设您的应用程序托管在云中,位于kosunen.fi 下。主要部分从https://www.kosunen.fi 云端提供。
为此域购买 DNS 委托。将localhost-a7b3ff.kosunen.fi解析为127.0.0.1 / ::1或实际客户端的本地ip地址10.0.0.63 / fe80::xxxx
为每个localhost-a7b3ff.kosunen.fi 购买 subCA 或获取批量证书购买协议、颁发证书(早期)或获取颁发证书(稍后)。这些证书将来自受信任的全球 CA,因此受到所有浏览器的信任。每个证书仅供一台 PC 使用。
为*.kosunen.fi 设置 CORS/XSRF/etc 位。
完成。
不做
意识到 localhost 流量实际上是非常安全的。浏览器通常会拒绝 http://localhost 和 http://127.0.0.1 URL(以防止从 Internet 加载的 JS 探测您的本地服务器)。
您仍然需要至少一个解析为 127.0.0.1 / ::1 的 DNS 条目 localhost.kosunen.fi,即使主机名解析为 127.0.0.1,浏览器也会欣然接受 http://localhost.kosunen.fi。
有什么风险?
有人在客户端机器上运行wireshark——如果有人有权限,你的模型无论如何都完成了。
有人劫持或毒害 DNS - 将其设置为 www.kosunen.fi 解析为正确的 IP,但 localhost.kosunen.fi 解析为他们的互联网 IP。他们窃取用户浏览器发出的请求,并且可以包含 JS。
缓解这种特殊情况——仅提供来自本地主机的数据,而不是脚本。设置限制性 CORS/XSRF/CSRF。
对于HTTP x HTTPS,您仍然可以使用 CORS,但有解决方案。
超简单的 CORS
在4040 和5050 这两个端口之间,这与不同主机(localhost 与 your.com)或协议(HTTPS 与 HTTP)之间的区别一样。这是云服务器:
import bottle
@bottle.route("/")
def foo():
return """
<html><head></head>
<body><p id="42">Foobar</p>
<script>
fetch("http://localhost:5050/").then(
function(response) {
console.log("status " + response.status);
response.json().then(
function(data) {
console.log(data);
}
);
}
);
</script>
</body></html>""".strip()
bottle.run(host="localhost", port=4040, debug=True)
这是本地主机服务器:
import bottle
@bottle.route("/")
def foo():
bottle.response.headers["Access-Control-Allow-Origin"] = "*" # usafe!
bottle.response.headers["Access-Control-Allow-Methods"] = "HEAD, GET, POST, PUT, OPTIONS"
bottle.response.headers["Access-Control-Allow-Headers"] = "Origin, Accept, Content-Type, X-Requested-With, X-CSRF-Token"
return """{"foo": 42}"""
bottle.run(host="localhost", port=5050, debug=True)
使其safe(r):在本地主机服务器中,读取请求Origin,验证它,例如starswith("https://your.com/") 然后返回与请求 Origin 相同的 Allow-Origin。 IMO 确保兼容的浏览器只会将您的本地主机内容提供给在 your.com 上下文中加载的 JS。损坏的浏览器,或者在同一台机器上运行的任何程序当然可以欺骗您的服务器。