1、xss跨站腳本攻擊(原理、如何進行的、防御手段是什么,要說清楚)
2、CSRF跨站請求偽造(如何偽造法?怎么防御?等等都要說清楚)
3、sql腳本注入(注入方式,防御方式)
4、上傳漏洞 (防御方式)
1.xss攻擊
xss攻擊又叫做跨站腳本攻擊,主要是用戶輸入或通過其他方式,向我們的代碼中注入了一下其他的js,而我們又沒有做任何防范,去執行了這段js。
可能用戶會寫一個死循環,將我們的頁面給弄崩了,但是也有可能通過這種方式,來獲取我們的cookie,從而回去登陸態等信息
xss攻擊從來源可分為反射型和存儲型
反射型:
將xss代碼通過url來注入
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>反射型</title> </head> <body> <div id="test"></div> <script> var $test = document.querySelector('#test');; $test.innerHTML = window.location.hash </script> </body> </html>
在IE瀏覽器去訪問該頁面並在地址后面加上index.html#<img src="404.html" onerror="alert('xss')" />
這時頁面一打開就會有個xss的彈窗,這就是最簡單的反射型攻擊
當然可能會覺得這樣沒有任何作用,但是修改一下代碼
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>反射型</title> </head> <body> <div id="test"></div> <script> // 先向頁面的cookie存儲一個name=1的信息 document.cookie = "name=1" var $test = document.querySelector('#test');; $test.innerHTML = window.location.hash </script> </body> </html>
此時打開的地址修改為index.html#<img src="404.html" onerror="alert(document.cookie)" />
這里就會發現彈窗內容為我們存取的cookie。
注意:1.這里必須用IE打開這個鏈接,因為chrome和safari等瀏覽器,會主動將url里的一下字符串進行encode,保證了一定的安全性。 2.為什么我們這里用img的onerror來注入腳本呢?而不是直接用script標簽來執行,我們修改一下訪問的地址index.html#<script>alert(document.cookie)</script>
,這時會發現,頁面並沒有執行這段代碼,但是這段代碼已經注入到了#test標簽中了。所以,一般通過img的onerror來注入是最有效的方法
存儲型
將xss代碼發送到了服務器,在前端請求數據時,將xss代碼發送給了前端。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>存儲型</title> </head> <body> <div id="test"></div> <script> // 先向頁面的cookie存儲一個name=1的信息 document.cookie = "name=1" // 這里假設是請求了后台的接口 response是我們請求回來的數據 var response = '<img src="404.html" onerror="alert(document.cookie)"' var $test = document.querySelector('#test');; $test.innerHTML = response </script> </body> </html>
這里最常見的情況就是一個富文本編輯器下,由用戶輸入了一串xss代碼,存儲在了服務器中,我們在展示用戶輸入內容時,沒有做防范處理。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>富文本</title> </head> <body> <div id="test"></div> <textarea name="" id="" cols="30" rows="10"></textarea> <button onclick="submit()">提交</button> </body> </html> <script> function submit() { var $test = document.querySelector('#test'); $test.innerHTML = document.querySelector('textarea').value } </script>
xss的防范手段:
1.encode
encode也分為html的encode和js的encode
html的encode: 就是將一些有特殊意義的字符串進行替換,比如:
& => &
" => "
' => '
< => <
> => >
通過這些字符的替換,之前我們輸入的<img src="null" onerror="alert()">
就被encode成了<img src="null" onerror="alert()">
js的encode: 使用“\”對特殊字符進行轉義,除數字字母之外,小於127的字符編碼使用16進制“\xHH”的方式進行編碼,大於用unicode(非常嚴格模式)
用“\”對特殊字符進行轉義,這個可能比較好理解,因為將一下,比如',"這些字符轉譯為',"就可以使得js變為一個字符串,而不是一個可執行的js代碼了,那為什么還需要進行16進制轉換和unicode轉換呢?這樣做是為了預防一下隱藏字符,比如換行符可能會對js代碼進行換行
//使用“\”對特殊字符進行轉義,除數字字母之外,小於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){