Php 使用ajax提交数据时检测到CSRF攻击
我试图在symfony 1.4中使用jquery提交表单,但每次都会弹出CSRF攻击检测到的错误。这是我用来提交表单数据的代码:Php 使用ajax提交数据时检测到CSRF攻击,php,jquery,ajax,symfony1,csrf,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() + '&activi
$.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()
)
});
我错过什么了吗
谢谢,
Radu。需要注意的一点是,验证输入的表单对象是否与生成令牌的表单对象完全相同。默认情况下,该类用于生成CSRF令牌 例如,如果有一个表单子类的实例用于生成表单html,然后发布到使用祖先表单类的操作,则默认情况下验证很可能失败 如果发现这是您的问题,则可以覆盖令牌创建 另外,您是否验证了令牌字段的值实际上包含令牌?console.log()可能会帮助您发现这一点
嗯……当我仔细查看代码时,另一件需要注意的事情是,您正在构建一个查询字符串来传递“数据”。您是否尝试过传递实际的JSON样式对象?通常的原因是浏览器不接受Cookie-您是否检查了Cookie是否按预期返回(例如IEHttpHeader、wireshark、tamperdata) 您是否在settings.yml中配置了密码
C.这个小问题过去让我发疯 如果您可以接受为此特定表单禁用CSRF保护(通常可以),您可以在/lib/form/…中将以下内容添加到表单类中:。。。文件夹:
public function configure ()
$this->disableLocalCSRFProtection();
我相信,如果您并不总是希望禁用表单的特定实例,也可以禁用该实例的CSRF,但我还没有尝试过这个/手头没有代码。会话cookie是否真的通过ajax查询接收到它?服务器返回的会话cookie应该与普通HTTP请求(例如,启动会话管理的第一个请求)和XMLHttpRequest完全相同,否则CSRF会给您带来麻烦。$(“#activity_ucsrf_token”).val()
您的意思是在该元素id中有一个双下划线吗?可以粘贴表单的HTML代码,也可能是应该处理表单的PHP?浏览器正在接受cookies。是的,security.yml中的配置是:csrf_secret:42f41325ba2c680972d2b164f954f74c1b82fdb表单类是相同的。以前从未使用过JSON样式的对象。。。有什么我应该读的文章吗?关于JSON风格的对象,我只是指使用JavaScript对象来存储键/值对。最终,$.ajax()将为您将其转换为查询字符串,但它可以使内容更可读,更易于扩展。下面是上面代码在使用JSON样式对象时的大致情况:关于JSON的文章很多,但我不确定是否有明确的建议。然而,为了熟悉JSON概念,最好的开始是干杯$表单->禁用LocalCsrfProtection();