【发布时间】:2013-04-11 21:11:33
【问题描述】:
我想要完成的是使用 ajax 的内联登录,它执行以下操作:
登录链接显示在不安全的 HTTP 页面上,比如“http://www.somedomain.com/somepage/”此处未收集登录信息
单击登录链接时,会创建一个 iframe,其 src 指向“https://www.somedomain.com/rest_api/values/”这是登录表单首次显示的位置,通过 HTTPS
在新的 iframe 弹出窗口中,用户会看到一个登录表单,该表单本身是通过 HTTPS 加载的安全登录表单,用户填写表单并单击继续,然后返回给自己。
-
假设用户已成功登录,则会对可通过
window.parent.document访问的脚本进行 jquery 调用,该脚本会使用当前用户小部件更新原始页面,然后调用要销毁的 iframe。
当我强制 iframe 使用相同的域和协议时,这很有效,但是当我进入 HTTP 并强制 IFRAME 使用 HTTPS 加载登录脚本时,我得到可怕的“权限被拒绝访问属性成功登录后,Firebug 中的“文档”错误。
我知道需要设置 Access-Control-Allow-Origin 标头,因此它被动态设置为使用请求页面的任何域的 HTTPS 版本,我已经在 Firebug 的标头响应中验证了这一点原始页面请求。
那么为什么我仍然收到错误,响应头显示:
Access-Control-Allow-Origin: https://www.somedomain.com
所以我还需要设置什么,或者问题可能在其他地方吗?
感谢您的帮助!
编辑:上面更新指出我并不愚蠢,登录表单确实是安全加载的;)
【问题讨论】:
-
在第 1 步,您已经失败了。登录页面必须通过 HTTPS 提供,否则您的安全性将非常低
-
@SLaks 也许我不清楚,当您单击登录创建 IFRAME 时,您还没有填写任何内容,您所做的只是启动创建 IFRAME 的脚本,并且将 src 设置为通过 HTTPS 在其中加载登录表单。所以确实是安全的。
-
@SLaks 我误解了吗?我阅读它的方式是登录表单显示在指向 https 域的 iFrame 中。因此,登录表单本身位于 https 上,它无法与父页面对话,因为它的来源不同(不是 https)
-
@SLaks 我描述的方式可能有点令人困惑,iframe 确实通过 HTTPS 加载了登录表单,尽管父窗口是通过 HTTP 加载的。通过 HTTPS 加载的登录表单和最终的表单提交都在 IFRAME 中通过 HTTPS 完成,所以除非我遗漏了一些东西,否则所有通信都是安全的。成功登录时会出现问题,成功页面只是加载一个页面,该页面执行立即 jquery 调用以使用新的用户小部件填充父页面,然后销毁 iframe。有意义吗?
-
@oucil:这根本没有帮助。攻击者修改原始页面以在 iframe 中加载
https://evil.com/login-stealer,用户一点也不聪明。用户应该(但可能没有)接受培训,只有在地址栏中看到 https 时才输入密码。