php - 即使在传递 _csrf_token 时也检测到 Symfony CSRF 攻击

标签 php forms symfony1 csrf

这是我的表格:

<form novalidate action="<?php echo url_for('article/submit') ?>" method="POST">
  <?php echo $form['title']->renderRow() ?>
  <?php echo $form['content']->renderRow() ?>
  <?php echo $form->renderHiddenFields() ?>
  <input type="submit" value="Save"/>
</form>

查看生成的 HTML 源代码,_csrf_token 实际上正在呈现。这是我的操作:

public function executeSubmit(sfWebRequest $request)
{
  $this->forward404Unless($request->isMethod('post'));
  $request->checkCSRFProtection();

  die('submitting post...');
}

错误:

_csrf_token [CSRF attack detected.]

即使在我的操作中,如果我执行 var_dump($_POST);死; 我得到:

Array
(
  [title] => string(8) "My title"
  [content] => string(10) "My Content"
  [_csrf_token] => string(32) "<my token here>"
)

因此 csrf token 肯定被正确呈现和传递。我做错了什么?

此外,是否有任何关于 checkCSRFProtection() 的文档? API 文档除了承认它的存在外,什么也没说。

最佳答案

需要检查的几件事:

(来源: 来自 http://oldforum.symfony-project.org/index.php/t/17867/ )

确保您已在设置中定义了“ secret ”:

csrf_secret: ThisIsMySecret  # Unique secret to enable CSRF protection or false to disable`

此外,根据我从该表单帖子中收集到的信息,CSRF 保护检查是在 $this->form->isValid() 中自动完成的,因此您对 $ 的调用如果您已经在检查表单是否有效,则 request->checkCSRFProtection() 是不必要的。如果不是,请添加 $this->form->isValid()

$request->checkCSRFProtection() 似乎也不适用于表单;它的目的(如果我是正确的)是验证用户单击链接时提供的请求。启用 CSRF 保护后,link_to() 会自动为其生成的链接添加 CSRF 保护。因此,基本上,表单的 CSRF 保护与并非源自表单的请求的保护是不同的。

有关详细信息,请参阅此票证:http://trac.symfony-project.org/ticket/7315

可能感兴趣的另一张票:http://trac.symfony-project.org/ticket/5698

关于php - 即使在传递 _csrf_token 时也检测到 Symfony CSRF 攻击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7016493/

相关文章:

php - 如何将变量传递给 Symfony 中的路由默认值?

php - 如何将错误和警告记录到文件中?

html - 表中的表单字段/两个半 block ,使用 "tab"导航

node.js - 表单 save mongoose 上随机生成 id

symfony1 - 如何在 symfony 1.4 中创建/使用自定义类和助手?

php - Laravel Schema 是否开箱即用地管理多态关联?

javascript - 如何让用户能够添加另一个选择数据?

android - 在 Android 中模拟 HTML 表单

mysql - 需要 Symfony 1.4 Doctrine 模式帮助来解决违反完整性约束的问题

mod-rewrite - Lighttpd 配置,. (点)在我的查询字符串中导致 404