定義javascript
<script>alert('alert')</script>
複製代碼
類型html
通常的防範措施前端
你知道CRSF嗎?java
CSRF是僞造客戶端請求的一種攻擊,CSRF的英文全稱是Cross Site Request Forgery,字面上的意思是跨站點僞造請求。 CSRF的定義是強迫受害者的瀏覽器向一個易受攻擊的Web應用程序發送請求,最後達到攻擊者所須要的操做行爲。程序員
CSRF漏洞的攻擊通常分爲站內和站外兩種類型:瀏覽器
CSRF站內類型的漏洞在必定程度上是因爲程序員濫用_REQUEST等變量,程序也接收GET請求傳參,這樣就給攻擊者使用CSRF攻擊創造了條件,通常攻擊者只要把預測好的請求參數 放在站內一個貼子或者留言的圖片連接裏,受害者瀏覽了這樣的頁面就會被強迫發起請求。安全
CSRF站外類型的漏洞其實就是傳統意義上的外部提交數據問題,通常程序員會考慮給一些留言評論等的表單加上水印以防止SPAM問題,可是爲了用戶的體驗 性,一些操做可能沒有作任何限制,因此攻擊者能夠先預測好請求的參數,在站外的Web頁面裏編寫javascript腳本僞造文件請求或和自動提交的表單 來實現GET、POST請求,用戶在會話狀態下點擊連接訪問站外的Web頁面,客戶端就被強迫發起請求。bash
//使用「\」對特殊字符進行轉義,除數字字母以外,小於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;
}
複製代碼
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,"&");
s = s.replace(/</g,"<");
s = s.replace(/>/g,">");
s = s.replace(/ /g," ");
s = s.replace(/\'/g,"'");
s = s.replace(/\"/g,""");
return s;
},
htmlDecodeByRegExp:function (str){
var s = "";
if(str.length ** 0) return "";
s = str.replace(/&/g,"&");
s = s.replace(/</g,"<");
s = s.replace(/>/g,">");
s = s.replace(/ /g," ");
s = s.replace(/'/g,"\'");
s = s.replace(/"/g,"\"");
return s;
}
};
複製代碼
<button onclick='alert("1\x29\x3balert\x282\u54c8\u54c8\x29")'>測試JavaScriptEncode值</button>
<div><script>alert('1哈哈' /);</script></div>
複製代碼
參考:服務器