問題:
假設目前網站的登入實現是,在http協議下,使用XHR方式調用http協議下的後端介面實現登入。現需求變更如下:
為了提高網站登入的安全性,登入介面要修改為ssl加密方式,請簡述修改會帶來的問題並出實現方案(要求:實現方案需相容所有主流瀏覽器)。
補充說明: 請從瀏覽器的同源策略及HTTP安全形度作答。
答案:
既然是前端面試題,答案的範圍自然就限定在了前端領域。
瀏覽器的同源策略要求當前域和被請求域的網域名稱、連接埠和協議必須相同,其中有一點不同就會認定為跨域,因此,題目的一方面其實是考察前端開發中比較經典的跨域問題,這裡是協議不同,屬於完全跨域。
前端開發中跨域問題的解決,想必各位同仁都有一定的瞭解,像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加密過的,因此能在一定程度上保證了資訊安全。
至此,問題得到瞭解決,歡迎大家的任何意見和建議。