close

在laravel中,HTML的header裡面含有CSRF-token的資料

圖1

因為剛好在使用axios,而laravel預設會在header內,加上X-CSRF-TOKEN,來阻擋Cross site request forgery

於是好奇來看看到底送什麼資料出去。 從下面這張圖,可以看到他還多了一個header稱之為X-XSRF-TOKEN

圖2

於是找到StackOverFlow上的連結

https://stackoverflow.com/questions/34782493/difference-between-csrf-and-x-csrf-token

主要講述傳統form內會夾帶csrf token和使用header的csrf token的差異在哪。

首先先介紹傳統的方式。

傳統方式:

一般來說我們都會使用HTML tag  : Form,然後再裡面包一個@csrf,這樣子form在submit的時候就可以自動附帶hidden value。

可是這種方式在server side,要替每個form裡面添加csrf token,並且要確認csrf token是否過期,在開發上確實需要多花些心力。

 

新的替代方式: X-CSRF-TOKEN

在每一次的Session連線,設置一個Cookie,讓javascript去讀取cookie然後把它加到header裡面去,則你使用axios或ajax時,自動將他加入到Form Data裡面去。如下圖3

圖3

之後發送request除了header的CSRF-token之外,也要把那個Cookie value也加進去,如圖2

然後server就可以檢查CSRF-Token和cookie內的值是不是相同的。 

這個機制是基於javascript只能在same domain下,才能存取該cookies, 所以假設其他網站亂設定csrf-token,是沒有用的

除非該page,有XSS的漏洞,直接在該網頁植入javascript。然而即使駭客使用phishing的方式給你link,也只會帶到cookie value,

而無法擷取header內的 X-CSRF-TOKEN value.

 

總結

相較於傳統方式,新的替代方案讓你不需要去替每個form都設定csrf token,且檢驗方式也相對簡單,server side不需要保存csrf token,只需要Check Cookie value 和csrf是否相符即可。

而不需要持續追中csrf token的 validity。 All you need is to set a cookie to a random value for each session.

唯一缺點,需要javacript,且需要支援XHR Request,傳統的Form沒辦法設定header。且傳統的form的csrf token只會在需要使用時,才發給token。

然而有些security scans會提示說新的替代方案有一些安全問題。例如:cookie is not set with the HTTP-ONLY flag, 所以可以被javascript讀取。

但該機制需要js可以讀取cookie。

 

note:

CSRF token validated on POST/PUT/DELETE requests.

laravel CSRF medium 講解 

https://medium.com/@barryvdh/csrf-protection-in-laravel-explained-146d89ff1357

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 蕭瑞文 的頭像
    蕭瑞文

    Neil的部落格

    蕭瑞文 發表在 痞客邦 留言(0) 人氣()