首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >表单创建时,csrf_protection false选项不起作用

表单创建时,csrf_protection false选项不起作用
EN

Stack Overflow用户
提问于 2013-11-12 21:18:18
回答 1查看 874关注 0票数 0

我按照这个示例对在我的actionController:http://www.craftitonline.com/2011/08/symfony-2-how-to-disable-csrf-on-a-per-form-basis/中生成的表单禁用csrf保护。

所以我要做的是:

代码语言:javascript
运行
复制
public function contactAction(Request $request)
    {
        $this->focus = "contact";

        $em = $this->getDoctrine()->getManager();
        $contactPosts = $em->getRepository('VisualImmersionAdminBundle:Post')->findByPostCategory('Contact');
        if (!$contactPosts) {
            throw $this->createNotFoundException('Unable to find Post entity.');
        }
        $form = $this->createFormBuilder(
            array(
                'csrf_protection' => false
            )
        )
            ->add('Sujet', 'text',
                array(
                    'label' =>false
                )
            )
            ->add('Nom', 'text',
                array(
                    'label' =>false
                )
            )
            ->add('Entreprise', 'text',
                array(
                    'label' =>false
                )
            )
            ->add('Courriel', 'email',
                array(
                    'label' =>false
                )
            )
            ->add('Message', 'textarea',
                array(
                    'label' =>false
                )
            )
            ->getForm();

        $form->handleRequest($request);

        if ($form->isValid()) {
            $data = $form->getData();
            $message = \Swift_Message::newInstance()
                ->setSubject($data['Sujet'] . ' ' . $data['Entreprise'])
                ->setFrom($data['Courriel'])
                ->setTo('contact@visual-immersion.com')
                ->setBody('text à placer par la suite')
            ;
            $this->get('mailer')->send($message);
        }


        return $this->render('VisualImmersionSiteBundle:Site:contact.html.twig',
            array(
                'focus' => $this->focus,
                'form'   => $form->createView(),
                 'contactPosts' => $contactPosts,
            ));
    }

在我的树枝上:

代码语言:javascript
运行
复制
div class="semi-container">
                {% if form_errors(form) %}
                    <div class="errors">{{ form_errors(form) }}</div>
                {% endif %}
                <form class="contact-form" action="{{ path('visual_immersion_site_contactpage') }}" method="post" {{ form_enctype(form) }}>
                    {{ form_row(form.Sujet, { 'attr': {'placeholder': 'Objet' }}) }}
                    {{ form_row(form.Nom, { 'attr': {'placeholder': 'Nom' }}) }}
                    {{ form_row(form.Entreprise, { 'attr': {'placeholder': 'Entreprise' }}) }}
                    {{ form_row(form.Courriel, { 'attr': {'placeholder': 'Courriel' }}) }}
                    {{ form_row(form.Message, { 'attr': {'placeholder': 'Message' }}) }}
                    <button type="submit" class="link-know-more">Demander un devis !</button>
                </form>
            </div>

但是form_errors总是返回错误:

CSRF令牌无效。请尽量重新提交表格。

在我的小树枝上,邮件还没寄出去.

我使用命令缓存进行了验证:清楚是否存在问题,但没有,这不是缓存问题。

知道吗?

(谢谢你的帮助:)

编辑:

好的,我解决了我最初的问题:

Form_rest(表单)用于隐藏输入。

但随着csrf的关闭,我不需要,对吗?

EN

回答 1

Stack Overflow用户

发布于 2013-11-12 22:21:44

您不能在没有类的情况下使用$form->isValid(),因为它检查类约束。handleRequest()检查表单验证规则,因此如果需要的话,必须向表单生成器添加验证规则。

查看您所链接的教程,特别是

代码语言:javascript
运行
复制
$form = $this->createFormBuilder($users, array(
    'csrf_protection' => false,  // <---- set this to false on a per Form Instance basis
))->add(...)
;

这应该更好

代码语言:javascript
运行
复制
$form = $this->createFormBuilder(null, array(
                'csrf_protection' => false
            ))

这是唯一让我觉得不对的事情。

一个很好的替代方法是创建一个虚拟实体,用于创建表单,但不要持久化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19940089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档