Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

what is the difference between X-XSRF-TOKEN and X-CSRF-TOKEN?

When use hidden field and when use header and why ?
X-XSRF_TOKEN when we use?
X-CSRF TOKEN when we use?

like image 450
Kishori Ghorpade Avatar asked Feb 23 '17 05:02

Kishori Ghorpade


People also ask

What is XSRF token?

A CSRF token is a secure random token (e.g., synchronizer token or challenge token) that is used to prevent CSRF attacks. The token needs to be unique per user session and should be of large random value to make it difficult to guess. A CSRF secure application assigns a unique CSRF token for every user session.

What is X CSRF?

In a CSRF attack, an innocent end user is tricked by an attacker into submitting a web request that they did not intend. This may cause actions to be performed on the website that can include inadvertent client or server data leakage, change of session state, or manipulation of an end user's account.

What is CSRF token in SAP Gateway?

SAP Gateway generates a CSRF token and sends it back in the HTTP response header field X-CSRF-Token. This happens in a non-modifying request (such as GET) if the header field X-CSRF-Token with the value Fetch is sent along with the non-modifying request.

Should XSRF token be Httponly?

The XSRF-TOKEN cookie is both httponly and secure, it is getting decrypted accurately and it does match up with the token stored for the session on the server.


Video Answer


2 Answers

All of them are for cross site request forgery protection and you need to use just one of them when sending a request to backend. Different names come from different frameworks.

It's all about sending a csrf value to backend. Then backend will compare it with the csrf value stored in database for that specific user and if it matches, it will allow processing the request.

csrf :

  • Is used in html forms (not ajax)
  • Produced in backend while rendering html form.
  • we can not set request header in html forms directly, so an easy way is to send it via form input as a hidden field.
  • you can name this hidden input whatever you want. e.g. <input name="my_csrf_input" value="a_hashed_string_the_csrf_value"

x-csrf-token:

  • It is added to the request header for ajax requests.
  • To use it, we can put the csrf value in a meta tag while rendering the html, then in front end we can get the value from that meta tag and send it to backend.

Laravel specific:

  • When using laravel as backend. Laravel checks this header automatically and compares it to the valid csrf value in database.(laravel has a middleware for this)

x-xsrf-token:

  • It is added to the request header for ajax requests.
  • Popular libraries like angular and axios, automatically get value of this header from xsrf-token cookie and put it in every request header.
  • To use it, we should create a cookie named xsrf-token in backend, then our front end framework that uses angular or axios will use it automatically.

Laravel specific:

  • Because it's popular, laravel creates this cookie in each response.
  • so when you're using for example axios or angular with laravel, you don't need to do anything. just log user in and 'auth' middleware will do the job.
  • In laravel, its a bigger string compared to x-csrf-token because cookies are encrypted in laravel.
like image 171
Ahmad Mobaraki Avatar answered Sep 19 '22 14:09

Ahmad Mobaraki


when you are submitting your data using ajax you will need headers for CSRF token because ajax will not send the token along with the data.

You can use hidden field for ajax request with following code

$.ajaxSetup( {     headers:     {         'X-CSRF-Token': $('input[name="_token"]').val()     } }); 

but you will have to add hidden field for every ajax requests.

The difference between the X-CSRF-TOKEN and X-XSRF-TOKEN is that the first uses a plain text value and the latter uses an encrypted value, because cookies in Laravel are always encrypted. If you use the csrf_token() function to supply the token value, you probably want to use the X-CSRF-TOKEN header.

its removed in laravel 5.2 doc but you can find it in laravel 5.0 doc, link is here

like image 38
Divyank Avatar answered Sep 17 '22 14:09

Divyank