網絡安全-CSRF

原文請看個人GitHub博客>>html

CSRF介紹

跨站請求僞造(英語:Cross-site request forgery),也被稱爲 one-click attack 或者 session riding,一般縮寫爲 CSRF 或者 XSRF, 是一種挾制用戶在當前已登陸的Web應用程序上執行非本意的操做的攻擊方法。laravel

簡單的說,就是利用遊覽器對用戶的信任,好比,用戶已經登陸了ww.aaa.com,天然aaa這個網站就會將用戶的登陸狀態session存在cookie中;
而後,aaa.com這個網頁有一個對做品點讚的功能,點贊提交地址爲aaa.com/api.like?id=777
這時,另一個叫www.bbb.com的網站,放了這樣一個元素<img src="aaa.com/api.like?id=888">,這樣的話,一旦用戶進入這個bbb.com頁面,就會請求aaa.com這個網站的點贊接口,並且點讚的用戶對象是888;
最後由於用戶的登陸信息還沒有過時,那就等於給id爲888這個做品點讚了,然而,用戶並不知情。git

防護方式

有兩種方法:github

  1. 後端判斷referer是否合法(不推薦)
    經過HTTP的referer可知道,用戶是經過哪一個網站發送這個請求的。可是referer的判斷並非好方法,有各類方式能夠繞過的方法,具體可見 CSRF 花式繞過Referer技巧>>
  2. 每次請求帶上token
    好比laravel,在後端模板渲染的時候會提供一個csrf的token,這樣的話,不一樣域的網站是拿不到token的,因此也就防止了csrf了。

補充

使用iframe會引出一些不安全的問題,好比繞過referer驗證,好比資源盜用等,因此,不少網站會設置X-Frame-OptionsDENY,這也是一個安全的補充點。web

Q&A

問:既然請求靜態資源都是get請求,那麼要是後端把點贊接口改成post的方式也能夠吧?後端

答:不能夠。由於,bbb.com網站徹底能夠設置一個form表單,action爲bbb.com,method爲post,接着input的name爲id,value爲888,而後,script代碼直接submit表單。爲了頁面不重定向,還能夠在form外層加一個iframe。因爲form表單實際上是直接跳轉,因此不存在跨域的問題。api

總結

防止CSRF的最好方法仍是帶token吧~跨域

相關文章
相關標籤/搜索