2018-01-07 關于XSS前端防范措施的思考

什么是xss芽隆?

  • 定義
    • cross site script垮站腳本攻擊
      • demo:
      <script>alert('alert')</script>
      
  • 類型
    • 反射型XSS(訪問鏈接時)
    • 存儲型XSS(服務器上)
    • DOM形(客戶端解析錯誤)
      • 我們遇到的就是這樣碴裙,頁面有很多可以直接寫入的地方,沒有進行代碼的轉譯雷酪。講一些特殊符號轉譯成特殊字符泽西。
      • alert,input,localstroage,cookie,document.write等等都可以注入
  • 一般的防范措施
    • 前端 htmlEnCode
      • 進行必要的轉譯九串,替換囤官,檢查特殊符號生棍,>,',<,&颤霎,\等等
      • 輸入輸出的過濾和數(shù)據(jù)轉義
      • URL校正
      • 使用更加安全的Https
      • HTML Attribute
  • 現(xiàn)實的解決方法

    • 1 可以在站點頁面加上主動監(jiān)測代碼,通過瀏覽器的performance來檢測頁面是否發(fā)出不在白名單的網(wǎng)絡請求,主要是腳本文件…
    • 2 可以重寫docmentwrite防止頁面被篡改捷绑,
    • 3 可以在頁面模板變量加包裝函數(shù),如果發(fā)現(xiàn)非法內容主動上報
    • 4 使用更加安全的https://
  • 你知道CRSF嗎氢妈?
    • CSRF是偽造客戶端請求的一種攻擊粹污,CSRF的英文全稱是Cross Site Request Forgery,字面上的意思是跨站點偽造請求首量。
      CSRF的定義是強迫受害者的瀏覽器向一個易受攻擊的Web應用程序發(fā)送請求,最后達到攻擊者所需要的操作行為壮吩。

    • CSRF漏洞的攻擊一般分為站內和站外兩種類型:

    • CSRF站內類型的漏洞在一定程度上是由于程序員濫用$_REQUEST類變量造成的,一些敏感的操作本來是要求用戶從表單提交發(fā)起POST請求傳參給程 序加缘,但是由于使用了$_REQUEST等變量鸭叙,程序也接收GET請求傳參,這樣就給攻擊者使用CSRF攻擊創(chuàng)造了條件拣宏,一般攻擊者只要把預測好的請求參數(shù) 放在站內一個貼子或者留言的圖片鏈接里沈贝,受害者瀏覽了這樣的頁面就會被強迫發(fā)起請求。

    • CSRF站外類型的漏洞其實就是傳統(tǒng)意義上的外部提交數(shù)據(jù)問題勋乾,一般程序員會考慮給一些留言評論等的表單加上水印以防止SPAM問題宋下,但是為了用戶的體驗 性,一些操作可能沒有做任何限制辑莫,所以攻擊者可以先預測好請求的參數(shù)学歧,在站外的Web頁面里編寫javascript腳本偽造文件請求或和自動提交的表單 來實現(xiàn)GET、POST請求各吨,用戶在會話狀態(tài)下點擊鏈接訪問站外的Web頁面枝笨,客戶端就被強迫發(fā)起請求。

  • ==javascriptCode代碼實現(xiàn)==

    //使用“\”對特殊字符進行轉義揭蜒,除數(shù)字字母之外横浑,小于127使用16進制“\xHH”的方式進行編碼,大于用unicode(非常嚴格模式)忌锯。
var JavaScriptEncode = function(str){
     
    var hex=new Array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');
        
    function changeTo16Hex(charCode){
        return "\\x" + charCode.charCodeAt(0).toString(16);
    }
    
    function encodeCharx(original) {
        
        var found = true;
        var thecharchar = original.charAt(0);
        var thechar = original.charCodeAt(0);
        switch(thecharchar) {
            case '\n': return "\\n"; break; //newline
            case '\r': return "\\r"; break; //Carriage return
            case '\'': return "\\'"; break;
            case '"': return "\\\""; break;
            case '\&': return "\\&"; break;
            case '\\': return "\\\\"; break;
            case '\t': return "\\t"; break;
            case '\b': return "\\b"; break;
            case '\f': return "\\f"; break;
            case '/': return "\\x2F"; break;
            case '<': return "\\x3C"; break;
            case '>': return "\\x3E"; break;
            default:
                found=false;
                break;
        }
        if(!found){
            if(thechar > 47 && thechar < 58){ //數(shù)字
                return original;
            }
            
            if(thechar > 64 && thechar < 91){ //大寫字母
                return original;
            }

            if(thechar > 96 && thechar < 123){ //小寫字母
                return original;
            }        
            
            if(thechar>127) { //大于127用unicode
                var c = thechar;
                var a4 = c%16;
                c = Math.floor(c/16); 
                var a3 = c%16;
                c = Math.floor(c/16);
                var a2 = c%16;
                c = Math.floor(c/16);
                var a1 = c%16;
                return "\\u"+hex[a1]+hex[a2]+hex[a3]+hex[a4]+"";        
            }
            else {
                return changeTo16Hex(original);
            }
            
        }
    }     
  
    var preescape = str;
    var escaped = "";
    var i=0;
    for(i=0; i < preescape.length; i++){
        escaped = escaped + encodeCharx(preescape.charAt(i));
    }
    return escaped;
}
  • ==htmlCode代碼實現(xiàn)==

    var HtmlUtil = {
    htmlEncode:function (html){
        var temp = document.createElement ("div");
        (temp.textContent != undefined ) ? (temp.textContent = html) : (temp.innerText = html);
        var output = temp.innerHTML;
        temp = null;
        return output;
    },
    htmlDecode:function (text){
        var temp = document.createElement("div");
        temp.innerHTML = text;
        var output = temp.innerText || temp.textContent;
        temp = null;
        return output;
    },
    htmlEncodeByRegExp:function (str){
        var s = "";
        if(str.length == 0) return "";
        s = str.replace(/&/g,"&amp;");
        s = s.replace(/</g,"&lt;");
        s = s.replace(/>/g,"&gt;");
        s = s.replace(/ /g,"&nbsp;");
        s = s.replace(/\'/g,"&#39;");
        s = s.replace(/\"/g,"&quot;");
        return s;
    },
    htmlDecodeByRegExp:function (str){
        var s = "";
        if(str.length == 0) return "";
        s = str.replace(/&amp;/g,"&");
        s = s.replace(/&lt;/g,"<");
        s = s.replace(/&gt;/g,">");
        s = s.replace(/&nbsp;/g," ");
        s = s.replace(/&#39;/g,"\'");
        s = s.replace(/&quot;/g,"\"");
        return s;
    }
};

Test 代碼

<button onclick='alert("1\x29\x3balert\x282\u54c8\u54c8\x29")'>測試JavaScriptEncode值</button>
<div>&lt;script&gt;alert(&#x27;1&#x54c8;&#x54c8;&#x27;&nbsp;&#x2F;);&lt;&#x2F;script&gt;</div>

參考:

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末伪嫁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子偶垮,更是在濱河造成了極大的恐慌张咳,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件似舵,死亡現(xiàn)場離奇詭異脚猾,居然都是意外死亡,警方通過查閱死者的電腦和手機砚哗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門龙助,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事提鸟【” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵称勋,是天一觀的道長胸哥。 經(jīng)常有香客問我,道長赡鲜,這世上最難降的妖魔是什么空厌? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮银酬,結果婚禮上嘲更,老公的妹妹穿的比我還像新娘。我一直安慰自己揩瞪,他們只是感情好赋朦,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著李破,像睡著了一般北发。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上喷屋,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天琳拨,我揣著相機與錄音,去河邊找鬼屯曹。 笑死狱庇,一個胖子當著我的面吹牛,可吹牛的內容都是我干的恶耽。 我是一名探鬼主播密任,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼偷俭!你這毒婦竟也來了浪讳?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤涌萤,失蹤者是張志新(化名)和其女友劉穎淹遵,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體负溪,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡透揣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了川抡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辐真。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出侍咱,到底是詐尸還是另有隱情耐床,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布楔脯,位于F島的核電站咙咽,受9級特大地震影響,放射性物質發(fā)生泄漏淤年。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一蜡豹、第九天 我趴在偏房一處隱蔽的房頂上張望麸粮。 院中可真熱鬧,春花似錦镜廉、人聲如沸弄诲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽齐遵。三九已至,卻和暖如春塔插,著一層夾襖步出監(jiān)牢的瞬間梗摇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工想许, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留伶授,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓流纹,卻偏偏與公主長得像糜烹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子漱凝,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內容