1、什麼是CSRF?javascript
CSRF是Cross Site Request Forgery的縮寫,翻譯過來就是跨站請求僞造。那麼什麼是跨站請求僞造呢?讓我一個詞一個詞的解釋:html
一、跨站:顧名思義,就是從一個網站到另外一個網站。java
二、請求:即HTTP請求。數據庫
三、僞造:在這裏能夠理解爲仿造、假裝。跨域
綜合起來的意思就是:從一個網站A中發起一個到網站B的請求,而這個請求是通過了假裝的,假裝操做達到的目的就是讓請求看起來像是從網站B中發起的,也就是說,讓B網站所在的服務器端誤覺得該請求是從本身網站發起的,而不是從A網站發起的。固然,請求通常都是惡意的。瀏覽器
看到這裏,你可能會問:爲何要假裝成從B網站發起的呢?從網站A直接向B網站服務器發起請求不能夠嗎?安全
要回答這個問題,就須要咱們對Cookie機制有必定的認識。關於Cookie機制我會單獨寫一篇文章,這裏不作詳細介紹。這裏你只須要知道:之因此要假裝成從B網站發起的,是由於Cookie是不能跨域發送的。結合上面這個例子來講就是:若是從A網站直接發送請求到B網站服務器的話,是沒法將B網站中產生的Cookie一塊兒發給B服務器的。服務器
可能你還會問,爲何非要發送Cookie呢?這是由於服務器在用戶登陸後會將用戶的一些信息放到Cookie中返回給客戶端,而後客戶端在請求一些須要認證的資源的時候會把Cookie一塊兒發給服務器,服務器經過讀取Cookie中的信息來進行用戶認證,認證經過後纔會作出正確的響應。dom
A網站訪問B網站服務器的一些須要認證的資源的時候,若是沒有Cookie信息,服務器是拒絕訪問的,那麼A網站就沒法進行惡意操做。而僞形成B網站的請求,就能夠將B網站的Cookie一塊兒發到B服務器,這個時候就服務器就認爲該請求是合法的,就會給出正確的響應,這個時候,A網站就達到目的了。網站
簡單一句話就是:攻擊者盜用了你的身份,以你的名義發送惡意請求。
那麼,A網站經過CSRF可以作那些操做呢?
2、CSRF可以作什麼呢?
CSRF可以作的事情包括:以你名義發送郵件,發消息,盜取你的帳號,甚至於購買商品,虛擬貨幣轉帳……形成的問題包括:我的隱私泄露以及財產安全。等等等等。
3、通俗點的例子
下面咱們舉個例子來講明CSRF攻擊是如何實現的。
假設有一個微博網站B,B有一個「加關注」的功能,即一個用戶能夠關注另外一個用戶,而這個功能是這樣的實現的:用戶每次點擊「加關注」按鈕的時候,就會向服務器發送一個GET請求,URL以下:
http://www.bdomain.com/addfriends?uid=123
URL中的參數uid表示的是你要關注的用戶的ID。
在正常狀況下,即你登陸B網站後,點擊「加關注」按鈕,瀏覽器會將上面的URL連同B網站產生的Cookie一塊兒發送到B網站的服務器,B服務器首先經過Cookie進行用戶認證,若是Cookie中的信息正確,就會進行向數據庫中寫入記錄,這樣,你就成功關注了ID爲123的用戶。
假如我是一個惡意用戶,我想讓更多的人關注我,而我又不想經過正常的渠道去實現,由於畢竟正常渠道比較浪費時間,因而我便開始想歪主意,碰巧,B網站的「加關注」的實現原理被我發現了。這個時候,我便進行了以下操做:
首先我在我本身的網站A裏發了篇文章,文章中全是妖嬈的美女圖片,你們都喜歡美女嘛,因此就會有不少人來看個人這些美女,咱們知道,圖片在網頁中大都是經過<img scr=」http://….」/>這樣的形式實現的,圖片加載的時候就會請求src中指定的URL,而我就把衆多美女圖片的src寫成了B博客裏「加關注」的URL,不一樣的是將參數uid的值都寫成了我在B網站中的ID(假設是456),即:
http://www.bdomain.com/addfriends?uid=456
在網站A中的代碼中就是:<img src=」http://www.bdomain.com/addfriends?uid=456″ />,當用戶點擊我發的文章的時候,瀏覽器就會請求這個src中的URL,這樣就達到了在A網站中請求B服務器資源的目的,可是這樣還差了一步,由於請求仍是從A網站發出的,因此就沒有B網站產生的Cookie,因此仍是達不到目的,那該怎樣作呢?
這就須要利用用戶的上網習慣了,咱們平時都會同時瀏覽不少網頁,好比,你打開瀏覽器登陸了B網站,與此同時,你可能也打開了個人網站A,而碰巧被我網站裏全是美女的帖子吸引住了,就忍不住打開了這個帖子,這個時候,個人網站A就發起了上面的那個到B服務器的請求,而此時,你已經登陸了B網站,Cookie已經產生了,瀏覽器一看請求的域名是bdomain.com,便將存放在客戶端的B網站的Cookie給順帶一塊兒發了過去,這樣,服務器就會誤認爲是你主動要關注個人,因而,便向數據庫寫入了一條記錄,而你就在不知不覺中,默默無聞的關注我了~~~
這樣,個人目的就達到了~~~~
而若是不少用戶都像你同樣,在登陸B微博的同時查看了個人帖子,那麼他們也同樣,默默無聞的關注了我~因而,個人粉絲量就大增!~~~
這裏要說明一下:上面例子中說的同時打開多個網頁只是能夠被利用的方法中的一種,但並非惟一的一種,你要知道,黑客們可不是吃素的啊,他們手段多着呢~在此順道向黑客們的技術深深的致一敬~!
4、下面借用別人的圖文來講明一個整個CSRF的過程:
從上圖能夠看出,要完成一次CSRF攻擊,受害者必須依次完成兩個步驟:
1.登陸受信任網站A,並在本地生成Cookie。
2.在不登出A的狀況下,訪問危險網站B。
看到這裏,你也許會說:「若是我不知足以上兩個條件中的一個,我就不會受到CSRF的攻擊」。是的,確實如此,但你不能保證如下狀況不會發生:
1.你不能保證你登陸了一個網站後,再也不打開一個tab頁面並訪問另外的網站。
2.你不能保證你關閉瀏覽器了後,你本地的Cookie馬上過時,你上次的會話已經結束。(事實上,關閉瀏覽器不能結束一個會話,但大多數人都會錯誤的認爲關閉瀏覽器就等於退出登陸/結束會話了……)
3.上圖中所謂的攻擊網站,多是一個存在其餘漏洞的可信任的常常被人訪問的網站。
5、GET仍是POST
上面我舉得例子中,B網站用的是GET請求,因此就被我輕鬆的利用了,那麼,若是B網站「加關注」的實現方式採用的是POST請求,是否是就能有效防止CSRF攻擊了呢?
不是這樣的,若是B改用了POST請求,那麼經過<img src/>這樣的方式的確沒法達到目的了,可是攻擊者仍是能夠經過人爲構造POST請求的方式達到目的。
那麼,在開發過程當中,應該如何有效避免CSRF攻擊呢?
==================================================
要回答這個問題,請參考:
http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html
http://book.2cto.com/201212/12162.html
==================================================
轉載:https://my.oschina.net/jasonultimate/blog/212554
聲明:本文的第四部分摘自:https://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html
若對原做者形成了困擾,請及時與小菜菜聯繫~