webpack-dev-server 的 allowedHosts 安全机制的目的是什么?
What is the purpose of webpack-dev-server's allowedHosts security mechanism?
webpack-dev-server
试图通过实施特定的 Host
header 值来缓解什么安全风险?
默认情况下,webpack-dev-server
仅允许 Host
header 指定本地环回地址(localhost
、127.0.0.1
等)的连接。所有其他主机都会收到此响应:"Invalid Host header"。但当然 --allowed-hosts
/allowedHosts
配置允许扩大此限制。
这似乎完全基于 Host
header。我可以用curl设置自定义Hostheader,请求成功:
curl -X GET -H "Host: http://0.0.0.0:9001/" http://me.internal.example.com:9001/
所以我很好奇 — 如果 allowedHosts
不阻止来自 curl 或其他自定义用户代理的连接,它解决了什么问题?它似乎只针对使用普通浏览器的普通用户,以保护他们免受错误主机提供的站点的影响。但是 Man-In-The-Middle 攻击可以很容易地代理连接并覆盖主机 header。
为了防止 MITM 攻击,您可以使用 https(带有浏览器信任的证书)。但在那种情况下,证书本身似乎可以减轻 MITM 攻击。
我确定我遗漏了一些东西,因此欢迎任何进一步的解释。
简短版本:
攻击是:一个邪恶的网站使用AJAX从您本地webpack-dev-server读取数据。
长版:
这是与 websockets 一起使用的正常安全机制。
攻击
攻击是这样进行的:您当前登录的是 whosebug.com。攻击者向您发送了一封包含 link: Hey, watch these cute kittens <a href="evil-attacker.com">here</a>
的电子邮件。当然你马上点击link。 evil-attacker.com 上的页面包含一个 Javascript 连接到 whosebug.com 并以您的名字写下答案(因为您已登录),这让您看起来很糟糕。
Same-origin-policy
whosebug.com 可以通过检查创建答案的 POST 请求的 Origin
header 是“whosebug.com”。在这种情况下,它将是“evil-attacker.com”,而 post 将被拒绝。
但是,如果 Whosebug 开发人员休假多年并且 whosebug.com 不再维护怎么办 - 没有人实施过这样的保护。
幸运的是,浏览器开发人员没有放假,他们实施了一种额外的保护 - same-origin 政策。这只是意味着浏览器将不允许 evil-attacker.com 连接到 whosebug.com(不同的域)以进行恶意 posts.
CORS
如果 Whosebug 想要 允许某些网站以您的名义进行 运行 操作,例如允许 meta.whosebug.com 显示您来自 whosebug.com,他们必须使用 CORS 预检请求。
网络套接字
Websockets 是一项新技术 - 没有旧的(未维护的)网站使用 websockets。因此,不需要 same-origin 政策来保护旧网站免受此类攻击。
因此,当指定 Websocket protocol 时,他们决定使用上述更简单的 Origin
检查。
为此,Websocket 服务器必须知道可以从哪些来源合法访问它。
webpack-dev-server
试图通过实施特定的 Host
header 值来缓解什么安全风险?
默认情况下,webpack-dev-server
仅允许 Host
header 指定本地环回地址(localhost
、127.0.0.1
等)的连接。所有其他主机都会收到此响应:"Invalid Host header"。但当然 --allowed-hosts
/allowedHosts
配置允许扩大此限制。
这似乎完全基于 Host
header。我可以用curl设置自定义Hostheader,请求成功:
curl -X GET -H "Host: http://0.0.0.0:9001/" http://me.internal.example.com:9001/
所以我很好奇 — 如果 allowedHosts
不阻止来自 curl 或其他自定义用户代理的连接,它解决了什么问题?它似乎只针对使用普通浏览器的普通用户,以保护他们免受错误主机提供的站点的影响。但是 Man-In-The-Middle 攻击可以很容易地代理连接并覆盖主机 header。
为了防止 MITM 攻击,您可以使用 https(带有浏览器信任的证书)。但在那种情况下,证书本身似乎可以减轻 MITM 攻击。
我确定我遗漏了一些东西,因此欢迎任何进一步的解释。
简短版本:
攻击是:一个邪恶的网站使用AJAX从您本地webpack-dev-server读取数据。
长版:
这是与 websockets 一起使用的正常安全机制。
攻击
攻击是这样进行的:您当前登录的是 whosebug.com。攻击者向您发送了一封包含 link: Hey, watch these cute kittens <a href="evil-attacker.com">here</a>
的电子邮件。当然你马上点击link。 evil-attacker.com 上的页面包含一个 Javascript 连接到 whosebug.com 并以您的名字写下答案(因为您已登录),这让您看起来很糟糕。
Same-origin-policy
whosebug.com 可以通过检查创建答案的 POST 请求的 Origin
header 是“whosebug.com”。在这种情况下,它将是“evil-attacker.com”,而 post 将被拒绝。
但是,如果 Whosebug 开发人员休假多年并且 whosebug.com 不再维护怎么办 - 没有人实施过这样的保护。
幸运的是,浏览器开发人员没有放假,他们实施了一种额外的保护 - same-origin 政策。这只是意味着浏览器将不允许 evil-attacker.com 连接到 whosebug.com(不同的域)以进行恶意 posts.
CORS
如果 Whosebug 想要 允许某些网站以您的名义进行 运行 操作,例如允许 meta.whosebug.com 显示您来自 whosebug.com,他们必须使用 CORS 预检请求。
网络套接字
Websockets 是一项新技术 - 没有旧的(未维护的)网站使用 websockets。因此,不需要 same-origin 政策来保护旧网站免受此类攻击。
因此,当指定 Websocket protocol 时,他们决定使用上述更简单的 Origin
检查。
为此,Websocket 服务器必须知道可以从哪些来源合法访问它。