日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

go预防CSRF攻击

發(fā)布時間:2025/6/15 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 go预防CSRF攻击 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

CSRF(Cross-site request forgery),中文名稱:跨站請求偽造,也被稱為:one click attack/session riding,縮寫為:CSRF/XSRF。

那么CSRF到底能夠干嘛呢?你可以這樣簡單的理解:攻擊者可以盜用你的登陸信息,以你的身份模擬發(fā)送各種請求。攻擊者只要借助少許的社會工程學的詭計,例如通過QQ等聊天軟件發(fā)送的鏈接(有些還偽裝成短域名,用戶無法分辨),攻擊者就能迫使Web應用的用戶去執(zhí)行攻擊者預設(shè)的操作。例如,當用戶登錄網(wǎng)絡(luò)銀行去查看其存款余額,在他沒有退出時,就點擊了一個QQ好友發(fā)來的鏈接,那么該用戶銀行帳戶中的資金就有可能被轉(zhuǎn)移到攻擊者指定的帳戶中。

所以遇到CSRF攻擊時,將對終端用戶的數(shù)據(jù)和操作指令構(gòu)成嚴重的威脅;當受攻擊的終端用戶具有管理員帳戶的時候,CSRF攻擊將危及整個Web應用程序。

CSRF的原理

要完成一次CSRF攻擊,受害者必須依次完成兩個步驟 :

  • 1.登錄受信任網(wǎng)站A,并在本地生成Cookie 。
  • 2.在不退出A的情況下,訪問危險網(wǎng)站B。

看到這里,讀者也許會問:“如果我不滿足以上兩個條件中的任意一個,就不會受到CSRF的攻擊”。是的,確實如此,但你不能保證以下情況不會發(fā)生:

  • 你不能保證你登錄了一個網(wǎng)站后,不再打開一個tab頁面并訪問另外的網(wǎng)站,特別現(xiàn)在瀏覽器都是支持多tab的。
  • 你不能保證你關(guān)閉瀏覽器了后,你本地的Cookie立刻過期,你上次的會話已經(jīng)結(jié)束。
  • 上圖中所謂的攻擊網(wǎng)站,可能是一個存在其他漏洞的可信任的經(jīng)常被人訪問的網(wǎng)站。

因此對于用戶來說很難避免在登陸一個網(wǎng)站之后不點擊一些鏈接進行其他操作,所以隨時可能成為CSRF的受害者。

CSRF攻擊主要是因為Web的隱式身份驗證機制,Web的身份驗證機制雖然可以保證一個請求是來自于某個用戶的瀏覽器,但卻無法保證該請求是用戶批準發(fā)送的。

如何預防CSRF

過上面的介紹,讀者是否覺得這種攻擊很恐怖,意識到恐怖是個好事情,這樣會促使你接著往下看如何改進和防止類似的漏洞出現(xiàn)。

CSRF的防御可以從服務端和客戶端兩方面著手,防御效果是從服務端著手效果比較好,現(xiàn)在一般的CSRF防御也都在服務端進行。

服務端的預防CSRF攻擊的方式方法有多種,但思想上都是差不多的,主要從以下2個方面入手:

  • 1、正確使用GET,POST和Cookie;
  • 2、在非GET請求中增加偽隨機數(shù);

我們上一章介紹過REST方式的Web應用,一般而言,普通的Web應用都是以GET、POST為主,還有一種請求是Cookie方式。我們一般都是按照如下方式設(shè)計應用:

1、GET常用在查看,列舉,展示等不需要改變資源屬性的時候;

2、POST常用在下達訂單,改變一個資源的屬性或者做其他一些事情;

接下來我就以Go語言來舉例說明,如何限制對資源的訪問方法:

mux.Get("/user/:uid", getuser) mux.Post("/user/:uid", modifyuser)

這樣處理后,因為我們限定了修改只能使用POST,當GET方式請求時就拒絕響應,所以上面圖示中GET方式的CSRF攻擊就可以防止了,但這樣就能全部解決問題了嗎?當然不是,因為POST也是可以模擬的。

因此我們需要實施第二步,在非GET方式的請求中增加隨機數(shù),這個大概有三種方式來進行:

  • 為每個用戶生成一個唯一的cookie token,所有表單都包含同一個偽隨機值,這種方案最簡單,因為攻擊者不能獲得第三方的Cookie(理論上),所以表單中的數(shù)據(jù)也就構(gòu)造失敗,但是由于用戶的Cookie很容易由于網(wǎng)站的XSS漏洞而被盜取,所以這個方案必須要在沒有XSS的情況下才安全。
  • 每個請求使用驗證碼,這個方案是完美的,因為要多次輸入驗證碼,所以用戶友好性很差,所以不適合實際運用。
  • 不同的表單包含一個不同的偽隨機值,我們在4.4小節(jié)介紹“如何防止表單多次遞交”時介紹過此方案,復用相關(guān)代碼,實現(xiàn)如下:

生成隨機數(shù)token

h := md5.New() io.WriteString(h, strconv.FormatInt(crutime, 10)) io.WriteString(h, "ganraomaxxxxxxxxx") token := fmt.Sprintf("%x", h.Sum(nil))t, _ := template.ParseFiles("login.gtpl") t.Execute(w, token)

輸出token

<input type="hidden" name="token" value="{{.}}">

驗證token

r.ParseForm() token := r.Form.Get("token") if token != "" {//驗證token的合法性 } else {//不存在token報錯 }

這樣基本就實現(xiàn)了安全的POST,但是也許你會說如果破解了token的算法呢,按照理論上是,但是實際上破解是基本不可能的,因為有人曾計算過,暴力破解該串大概需要2的11次方時間。

總結(jié)

以上是生活随笔為你收集整理的go预防CSRF攻击的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。