使用ajax提交数据时检测到CSRF攻击

时间:2010-02-05 21:33:05

标签: php jquery ajax symfony1 csrf

我正在尝试使用symfony 1.4中的jquery提交表单,但每次都会弹出CSRF攻击检测到的错误。这是我用来提交表单数据的代码:

$.ajax({
      type: 'post',
      cache: false,
      url: $('#assign-form form').attr('action'),
      data: (
        'activity[id]=' + $('#activity_id').val() +
        '&activity[_csrf_token]=' + $('#activity__csrf_token').val() +
        '&activity[assigned_to_user_id]=' + $('#activity_assigned_to_user_id').val() +
        '&activity[assigned_to_group_id]=' + $('#activity_assigned_to_group_id').val()
      )
});

我错过了什么吗?

谢谢, 拉杜。

5 个答案:

答案 0 :(得分:1)

要注意的一件事是验证输入的Form对象是否与生成令牌的类完全相同。默认情况下,该类用于生成CSRF令牌。

例如,如果您有一个用于生成表单html的表单子类的实例,然后您发布到使用祖先表单类的操作,则默认情况下验证很可能会失败。

如果结果证明这是您的问题,则可以覆盖令牌创建。

另外,您是否确认令牌字段的值实际上包含令牌? console.log()可以帮助您发现这一点。

嗯......当我仔细查看你的代码时,另一件需要注意的事情就是你正在构建一个查询字符串以传入'data'。您是否尝试过传递实际的JSON样式对象?

答案 1 :(得分:0)

通常原因是浏览器不接受cookie - 您是否检查过cookie是否按预期返回(例如iehttpheaders,wireshark,tamperdata)?

您是否在settings.yml中配置了密码?

下进行。

答案 2 :(得分:0)

这个小问题让我过去很生气。

如果您可以为此特定表单(通常可以)禁用CSRF保护,则可以将以下内容添加到/ lib / form / ...文件夹中的Form类:

public function configure ()

  $this->disableLocalCSRFProtection();

我相信如果您不希望禁用它,也可以为表单的特定实例禁用CSRF,但我没有尝试过/没有手头的代码。

答案 3 :(得分:0)

会话cookie是否真的通过ajax查询收到了它?服务器返回的会话cookie应该与普通的HTTP请求(例如第一个请求启动会话管理)和XMLHttpRequest完全相同,否则你将遇到CSRF的麻烦。

答案 4 :(得分:0)

$( '#activity__csrf_token')。VAL()

您的意思是在该元素ID中使用双下划线吗?