瞭解 xss 和 防護 xss

什麼是xss?

  • 定義javascript

    • cross site script垮站腳本攻擊
      • demo:
      <script>alert('alert')</script>
      複製代碼
  • 類型html

    • 反射型XSS(訪問連接時)
    • 存儲型XSS(服務器上)
    • DOM形(客戶端解析錯誤)
      • 咱們遇到的就是這樣,頁面有不少能夠直接寫入的地方,沒有進行代碼的轉譯。講一些特殊符號轉譯成特殊字符。
      • alert,input,localstroage,cookie,document.write等等均可以注入
  • 通常的防範措施前端

    • 前端 htmlEnCode
      • 進行必要的轉譯,替換,檢查特殊符號,>,',<,&,\等等
      • 輸入輸出的過濾和數據轉義
      • URL校訂
      • 使用更加安全的Https
      • HTML Attribute
  • 現實的解決方法

    • 1 能夠在站點頁面加上主動監測代碼,經過瀏覽器的performance來檢測頁面是否發出不在白名單的網絡請求,主要是腳本文件…
    • 2 能夠重寫docmentwrite防止頁面被篡改,
    • 3 能夠在頁面模板變量加包裝函數,若是發現非法內容主動上報
    • 4 使用更加安全的https://
  • 你知道CRSF嗎?java

    • CSRF是僞造客戶端請求的一種攻擊,CSRF的英文全稱是Cross Site Request Forgery,字面上的意思是跨站點僞造請求。 CSRF的定義是強迫受害者的瀏覽器向一個易受攻擊的Web應用程序發送請求,最後達到攻擊者所須要的操做行爲。程序員

    • CSRF漏洞的攻擊通常分爲站內和站外兩種類型:瀏覽器

    • CSRF站內類型的漏洞在必定程度上是因爲程序員濫用_REQUEST類變量形成的,一些敏感的操做原本是要求用戶從表單提交發起POST請求傳參給程 序,可是因爲使用了_REQUEST等變量,程序也接收GET請求傳參,這樣就給攻擊者使用CSRF攻擊創造了條件,通常攻擊者只要把預測好的請求參數 放在站內一個貼子或者留言的圖片連接裏,受害者瀏覽了這樣的頁面就會被強迫發起請求。安全

    • CSRF站外類型的漏洞其實就是傳統意義上的外部提交數據問題,通常程序員會考慮給一些留言評論等的表單加上水印以防止SPAM問題,可是爲了用戶的體驗 性,一些操做可能沒有作任何限制,因此攻擊者能夠先預測好請求的參數,在站外的Web頁面裏編寫javascript腳本僞造文件請求或和自動提交的表單 來實現GET、POST請求,用戶在會話狀態下點擊連接訪問站外的Web頁面,客戶端就被強迫發起請求。bash

  • javascriptCode代碼實現

//使用「\」對特殊字符進行轉義,除數字字母以外,小於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){ //數字
                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代碼實現

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>
複製代碼

參考:服務器

相關文章
相關標籤/搜索