域"A"包含来自域"B"的图像
<img src="https://DOMAIN_B/basic-auth/protected_image/secure.jpg">
域"B"具有基本的HTTP身份验证。
<?php
header("HTTP/1.1 401 Unauthorized");
header("WWW-Authenticate: Basic realm='Please login'");
exit;
?>
我的问题是为什么域"A"上没有出现登录弹出窗口。Chrome 给出错误"401 未经授权"。 但从技术上讲,浏览器应该在域"A"上弹出登录显示。另一方面,一切都在本地和 https://jsfiddle.net/w493nnp9/18/工作正常。
您可以访问此链接,页面显示登录弹出窗口。但是为什么其他域不显示。 https://jsfiddle.net/w493nnp9/18/
谢谢
如果它显示登录表单,那将是对站点 B 的潜在 CSRF 攻击。
假设用户重复使用他们的密码,这不是一个强有力的假设,很多人都这样做。如果站点 A 包含来自基本身份验证站点 B 的图像,则用户将认为站点 A 正在请求其密码。如果与站点 B 相同,他们将登录到站点 B,而无需这样做。从那时起,由于基本身份验证信息会一直保留到浏览器关闭,站点 A 可以对站点 B 执行常规 CSRF(当然,除非有保护,应该有,因为用户也可能故意登录到 B(。
即使在站点 B 上提供了进一步的 CSRF 保护,如果在您的场景中显示登录弹出窗口,它也会使 http 基本身份验证本质上容易受到登录 csrf 的攻击。
登录弹出窗口不显示在<img>
标签中,弹出窗口将显示<iframe>
示例中:<iframe src="https://httpbin.org/basic-auth/user/passwd">
为什么其他域不起作用? 这是因为其他域具有"跨源"策略(在响应标头中查找(。
例如:您提供的链接"https://httpbin.org/basic-auth/user/passwd",有访问控制允许来源:*这里*表示允许每个人获取数据的域。 检查您的域"B"标头响应,是否具有"访问控制允许源"。
基本上域"B"需要有标头="访问控制-允许-来源:*"才能工作。
谢谢,
杰基