当前位置: 首页 > 知识库问答 >
问题:

要求在所有请求中存在X-CSRF-Token头

唐泳
2023-03-14

Symfony中的默认CSRF预防是基于表单的(如果使用提供的表单生成器,则会自动发生)。然而,对于AJAX请求,手动将CSRF令牌附加到每个HTTP请求,然后手动检查每个请求,这是非常繁琐的。

一个好的方法是将令牌嵌入为HTTP标头,如本问题的注释中建议的那样。jQuery然后可以被配置为在每个请求中包含这个标头,如这里所述。

我的问题是如何在Symfony内最好地处理这个问题?我可以使用Twig在每个页面中包含CSRF令牌,但是如何检查传入的请求,以确保每个请求在标头中包含有效令牌?

我知道如何使用$request访问HTTP头-


共有1个答案

乌鸿宝
2023-03-14

我不是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属性: