Защита запросов JQuery Ajax от атак CSRF с помощью токена CSRF на Symfony 3.4

У меня есть следующий контроллер Symfony:

namespace AppBundle\Controller

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;

class MyController extends Controller
{
  /**
  * @Route("/form", name = "get_form")
  * @Method("GET")
  */
  public function getFormAction(Request $request)
  {
    return $this->render('some_twig.html.twig');
  }

  /**
  * @Route("/form_submit", name = "submit_form")
  * @Method("POST")
  */
  public function ajaxFormAction(Request $request)
  {
    if ($request->isXmlHttpRequest()){
    return new JsonResponse(['data':"All midori"],JsonResponse::HTTP_OK);
    } else {
     return new JsonResponse(['data':"Echi, hentai, baka"],JsonResponse::HTTP_BAD_REQUEST);
    }
  }
}

Форма отправляется через следующий код javascript:

$("#someform").on('submit',function(e){
    e.preventDefault();

    var self=this; //To avoid Confusion using this
    var url=$(self).attr('action');

    $.ajax({
      'method': "POST",
      'url': url,
      'data': $(self).serialize(),
      'statusCode': {
        400: function(data,textStatus,jqXHR) {
          //Handle Error 400
        },
        500: function(data,textStatus,jqXHR){
         //Handle error 500
        }
      },
      'success':function(data){
        //DO some stuff
      }
    });
  })

Но у меня проблемы с тем, как защитить метод Symfony Ajax от атак CSRF. Когда я пытаюсь защитить, помещая токен CSRF для формирования, когда происходит аэро, например. выброшенное исключение делает мою форму нежелательной.

Также оставлять без защиты - не лучший вариант. Так как же эффективно его защитить?

Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
0
0
328
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

По истечении срока действия лучшим вариантом является использование DunglasAngularCsrfBundle (ищите документацию здесь). В вашем примере поместите следующий код в ваш security.yml:

dunglas_angular_csrf:
  # Collection of patterns where to set the cookie
  cookie:
      set_on:
        - {route: ^get_form, methods: [GET]}
  secure:
    - {route: ^submit_form, methods:[POST]}

Затем измените код jquery следующим образом:

$("#someform").on('submit',function(e){
e.preventDefault();

var self=this; //To avoid Confusion using this
var url=$(self).attr('action');

$.ajax({
  'method': "POST",
  'url': url,
  'data': $(self).serialize(),
  'beforeSend': function(request) {
    request.setRequestHeader('X-XSRF-TOKEN', Cookies.get('XSRF-TOKEN'));
  },
  'statusCode': {
    400: function(data,textStatus,jqXHR) {
      //Handle Error 400
    },
    500: function(data,textStatus,jqXHR){
     //Handle error 500
    }
  },
  'success':function(data){
    //DO some stuff
  }
});


})

Я получаю значение cookie с помощью библиотеки js-cookie, но вы также можете использовать методы, упомянутые в следующем отвечать.

Вся идея состоит в том, чтобы получить токен CSRF через XSRF-TOKEN (должен быть заглавным, а не то, что указано в документации) и вернуть значение через настраиваемый HTTP-заголовок X-XSRF-TOKEN (все также должны быть заглавными).

Так что вы можете поцеловать уязвимость на прощание.

Другие вопросы по теме