我正在尝试使用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()
)
});
我错过了什么吗?
谢谢, 拉杜。
答案 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中使用双下划线吗?