【问题标题】:Symfony: secure delete link with CSRFProtectionSymfony:使用 CSRFProtection 安全删除链接
【发布时间】:2011-09-10 16:35:33
【问题描述】:

我有一个删除链接,用于删除 ID /comment/:id/delete 的评论对象

为了保护此链接,我在链接中添加了一个 csrf 令牌

$CSRFTokenForm = new BaseForm();
$link = url_for(..., array('_csrf_token' => $CSRFTokenForm->getCSRFToken()));

在 executeDelete 中,我使用checkCSRFProtection() 方法,一切正常。

唯一的问题是每个评论都由一个部分显示,每个部分创建它自己的BaseForm() 以创建令牌,这是浪费时间,因为它们都是一样的..

您对如何提高效率有更好的想法,比如静态getCSRFToken() 方法或创建全局BaseForm()

【问题讨论】:

    标签: php symfony1 csrf


    【解决方案1】:

    使用 SF 的方法 => 删除。它为您创建 CSRF 令牌:

    <?php 
        echo link_to('comment/' . $comment->getId() . '/delete', 
                 array(
                     'method'  => 'delete', 
                     'confirm' => 'Do you really want to delete the comment??', 
                     'title'   => 'Delete'
                 )
             ); 
    ?>
    

    【讨论】:

    • 如果我使用jq_link_to_remote()?
    • 我不知道 Symfony 的 jQuery 插件。但你也可以试试:jq_link_to_remote($name, array('method' =&gt; 'delete', ...) , $html_options = array())
    • 它不起作用.. 无论如何,我不太喜欢 symfony 输出删除链接的方式.. 有没有每次都创建一个新的 BaseForm() 的情况下获取 csrf?
    【解决方案2】:

    是的,这是一个 jQuery 插件错误。如果您使用的是 sfJqueryReloadedPlugin - 1.4.3,您需要更改插件目录中 jQueryHelper 文件的源代码,并将“BaseForm”而不是“sfForm”放在“csrf => 1”部分

    【讨论】:

      【解决方案3】:

      使用 jQuery 插件试试:

      jq_link_to_remote('comment/' . $comment-&gt;getId() . '/delete', array('csrf' =&gt; 1))

      sourcecode 中找到它,他们也使用 BaseForm 实例来实现。

      【讨论】:

        猜你喜欢
        • 2013-12-28
        • 1970-01-01
        • 2017-02-14
        • 1970-01-01
        • 2012-02-24
        • 1970-01-01
        • 1970-01-01
        • 2021-09-08
        • 1970-01-01
        相关资源
        最近更新 更多