Symfony中的默认CSRF预防是基于表单的(如果使用提供的表单生成器,则会自动发生)。然而,对于AJAX请求,手动将CSRF令牌附加到每个HTTP请求,然后手动检查每个请求,这是非常繁琐的。
一个好的方法是将令牌嵌入为HTTP标头,如本问题的注释中建议的那样。jQuery然后可以被配置为在每个请求中包含这个标头,如这里所述。
我的问题是如何在Symfony内最好地处理这个问题?我可以使用Twig在每个页面中包含CSRF令牌,但是如何检查传入的请求,以确保每个请求在标头中包含有效令牌?
我知道如何使用$request访问HTTP头-
我不是100%确定,但我会使用BaseFormType并扩展它。
您的基本表单类型将使用表单事件PRE_SET_数据侦听器,并在请求中查找标头,然后将该标头填充到\u令牌
字段中。
//FormType
class BaseFormType extends AbstractType
{
protected $request;
public function __construct(Request $request)
{
$this->request = $request;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$request = $this->request;
$builder->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event) use($request){
$token = $request->headers->get('X-CSRF-Token');
if($token){
$form = $event->getForm();
$form->get('_token')->setData($token);
}
}
}
}
然后,您的所有表单类型都将扩展:
//YourCustomFormType
class YourCustomFormType extends BaseFormType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
parent::buildForm();
$form->add('name');
}
}
然后你的控制器动作
//Controller
public function sayMyNameAction(Request $request)
{
$name = new Name();
$form = $this->createForm(new YourCustomFormType($request),$name);
if($request->isMethod('POST'))
{
$form->handleRequest($request);
if($form->isValid()){
return new JsonResponse(array('say':$name->getName()));
}
}
}
或者类似的东西。
配置Spring Security 3.2后,csrf。令牌未绑定到请求或会话对象。 这是Spring Security配置: login.jsp文件 它呈现下一个html: 结果是403 HTTP状态: 在一些调试之后更新,请求对象以良好的形式发出DelegatingFilterProxy,但在CoyoteAdapter的469行中,它执行请求。回收();这会删除所有属性。。。 我使用JDK 1
问题内容: 如何在我的Laravel应用程序的Ajax请求(GET或POST)中自动添加csrf令牌,而无需将其手动添加到每个请求中。 我的ajax请求 问题答案: 在Laravel中,默认情况下, csrf令牌元标记 的值会通过Axios HTTP库进行注册。但是,如果您 不使用此库 ,则需要为应用程序手动配置此行为。 为此,请将令牌存储在HTML元标记中 然后,一旦创建了meta标签,就可以指
我必须保护我的Web应用程序不受CSRF的影响,这是一个非常复杂的问题。Net核心MVC web应用程序,客户端为Angular 9。 这是我尝试过的 在Angular应用程序中,我添加了一个http拦截器来提取和发送请求头中的令牌 现在我从服务器收到一个错误的请求错误(400)
以前一直用 vue3,现在在学习用 nuxt3,遇到一个传 token 的问题,研究半天没明白,nuxt3 这个 token 要怎么请求的时候传过去? 我先讲下我的 vue3 是怎么用的 用户第一次访问网站,检查 localStorage.getItem('token') 是否为空,如果为空或token过时,直接跳到登录页面,登录后获取 token 存放到 localStorage.setItem
问题内容: 我想在jQuery的更改事件上在服务器上上传图像,但是使用codeigniter csrf我只能上传一次图像。如何使用Ajax上传图像以进行多个请求。设置此功能时请注意 那么我能够发送多个请求jQuery onchange事件,但是当csrf_protection将为false时,我认为csrf没有任何优势。所以问题是启用csrf_protection时如何使用ajax发送多个请求。我
问题内容: 我想每次发送ajax请求时显示一个“正在加载”进度栏。是否有可能在任何时候使用jQuery发送ajax请求时收到通知? 问题答案: 您可以使用该方法来设置将应用于整个页面的全局AJAX属性: