У меня есть следующий контроллер 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 для формирования, когда происходит аэро, например. выброшенное исключение делает мою форму нежелательной.
Также оставлять без защиты - не лучший вариант. Так как же эффективно его защитить?

По истечении срока действия лучшим вариантом является использование 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 (все также должны быть заглавными).
Так что вы можете поцеловать уязвимость на прощание.