【问题标题】:CSRF Validation Failed in Drupal 7Drupal 7 中的 CSRF 验证失败
【发布时间】:2025-12-16 14:20:03
【问题描述】:

我一直在搜索和搜索,包括这里的许多主题,以解决我的问题。到目前为止,我没有运气。 一点背景故事:我正在编写一个以 Drupal 7 作为后端的 AngularJS 应用程序。我可以毫无问题地登录,保存会话名称和会话 ID,并将它们放在一起作为 Cookie 标头 (I had to use this "hack")。此外,如果我在 Postman 应用程序中进行登录调用,然后尝试更新节点,它会起作用。这让我觉得是会话身份验证有问题,但我还是想不通。

话虽如此,我遇到了障碍。每当我尝试 PUT 更新节点时,都会收到以下错误:

401 (Unauthorized : CSRF validation failed)

现在,我的 ajax 调用如下所示:

  $http({
  method: 'PUT',
  url: CONSTANTS.SITE_URL+"/update/node/"+target_nid,
  headers:{
    'Content-Type': CONSTANTS.CONTENT_TYPE,
    'Authentication': CONSTANTS.SESS_NAME +"="+CONSTANTS.SESS_ID,
    'X-CSRF-Token' : CONSTANTS.TOKEN
  },
  data: {
    (JSON stuff)
  }
})

CONTENT_TYPE 是“application/json”,“Authentication”是 Cookie 标头问题的创可贴,“X-CSRF-Token”是(大概)给我带来问题的原因。 SESS_NAME、SESS_ID 和 TOKEN 都是从 Login 处的响应中收集的。我可以拉取网站上用户制作的列表,我也可以拉取网站上某种类型的所有节点的列表。我只在尝试 PUT 更新节点时遇到问题。

如果我遗漏了任何信息,请告诉我,我会补充!

编辑:我使用的是 AngularJS 1.5.3 版。

【问题讨论】:

    标签: angularjs ajax drupal-7


    【解决方案1】:

    在尝试了所有其他方法之后,我关注了我在原始帖子开头链接的线程中的一个 cmets。他们不得不在 Services.module 中注释掉一行:

    if ($non_safe_method_called && !drupal_valid_token($csrf_token, 'services')) {
      //return t('CSRF validation failed');
    }
    

    大约在第 590 行左右,根据您对文件的处理程度,加减一些。我不喜欢这样做,但我一生都无法弄清楚为什么令牌不能正常工作。当然,这是一个临时修复,但如果将来有人遇到同样的问题,它希望能帮助你!

    【讨论】:

      【解决方案2】:

      您也可以向 drupal_valid_token 添加一个 true 来代替删除该行

      if ($non_safe_method_called && !drupal_valid_token($csrf_token, 'services',true)) {
        return t('CSRF validation failed');
      }
      

      【讨论】: