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