问题: 假设目前网站的登录实现是,在http协议下,使用XHR方式调用http协议下的后端接口实现登录。现需求变更如下:
为了提高站点登录的安全性,登录接口要修改为ssl加密方式,请简述修改会带来的问题并出实现方案(要求:实现方案需兼容所有主流浏览器)。有意面试的同学请将答案私信给我,热心网友仍然可以回答本问题,下周同一时间将会公布一实现方案。补充说明: 请从浏览器的同源策略及HTTP安全角度作答。

解决方案 »

  1.   

    答案如期奉上:既然是前端面试题,答案的范围自然就限定在了前端领域。浏览器的同源策略要求当前域和被请求域的域名、端口和协议必须相同,其中有一点不同就会认定为跨域,因此,题目的一方面其实是考察前端开发中比较经典的跨域问题,这里是协议不同,属于完全跨域。前端开发中跨域问题的解决,想必各位同仁都有一定的了解,像JSONP、iframe跨子域、Window name传输、postMessage方法等等,当然不同的方案会有不同的适用情形。在题目里,需求的变更是为提高登录的安全性,由XHR的同域HTTP更换为SSL方式,即接口协议要换成HTTPS(它如何保证安全性,请自行Google),JSONP不具有安全性,首先排除掉。题目属于完全跨域,跨子域的方案自然是行不通的,因此把关注点放在postMessage和window name跨域上面。postMessage属于浏览器的新特性,目前(IE8+、chrome、safari、
    Firefox、Opera)等浏览器均已支持这一特性,可以用postMessage实现主页面和iframe的通信(完全跨域也是可以的),可以考虑使用postMessage在iframe和主页面之间实现相互通信。具体实现:在接口服务器(HTTPS)部署一个代理文件proxy.htm,这个HTTPS协议的代理页面就可以用XHR方式和同源的HTTPS协议的接口通信了。至此,较先进的浏览器中的这个问题得到解决。但是,目前国内IE6、IE7及相应内核的浏览器,依然占据着很大的浏览器市场份额,对于这部分浏览器,考虑采用window name传输的方式,来实现主页面和iframe的通信了,具体window name的实现细节,在这里就不再描述了,大家可以参考怿飞的博文《使用 window.name 解决跨域问题》http://www.planabc.net/2008/09/01/window_name_transport/,主页面和iframe之间的通信能保证相对安全性,真正和服务器之间的通信是经过HTTPS加密过的,因此能在一定程度上保证了信息安全。至此,问题得到了解决,欢迎大家的任何意见和建议。
      

  2.   

    其实我认为还有更好的办法来解决。
    请看这里
    http://blog.csdn.net/truelove12/article/details/6704227因为使用https来通讯,所以查询字符串一样会得到加密,安全性问题会有所保障。这里存在的问题我blog里面也说了,就是无法得知运行结果。
    其实,服务端可以根据传递的查询字符串判断后,将结果写到cookie中,因为这个服务端页面返回的mime类型不是图片的内容类型,所以image对象上一定会触发error事件,所以可以在error事件中判断cookie的值,就可以知道运行结果了。