如何在用户未登录时使用AJAX和CakePHP 3检查CSRF令牌?

时间:2015-11-30 09:06:45

标签: cakephp cakephp-3.0 cakephp-3.1 cakephp-3.x

所以我让我的网站上线,我进入公共领域,人们并不总是很好。我刚刚开始学习CSRF,并发现当我将cakephp 3网站现场直播时,这是我需要的东西。 As seen here!

我将csrf组件和安全组件添加到我的站点,但我有一个主要问题。现在,当用户想要注册时,他们就无法注册。我使用条带的自定义表单来发送付款,但也使用ajax将用户添加到我的数据库。首先添加用户,然后处理付款并将订单保存到数据库中。

根据条带docs我在单击提交按钮后将隐藏值中的标记添加到表单中,但无法注意到我的新安全性不允许这种情况发生。

由于我使用ajax将发布数据发送给我的用户控制器并在提交时添加表单输入,

如何检查csrf令牌并确保在没有禁用所涉及操作的安全性的情况下没有安全漏洞?

如何做到这一点的一个例子将非常受欢迎,因为在cakephp 3中似乎缺乏这样做的例子。由于cakephp 3 automagic添加了令牌,我也很难弄清楚一切是如何工作的。表格和cookie。我不确定如何/在哪里/检查什么。

3 个答案:

答案 0 :(得分:5)

对于pass X-CSRF-Token,请在Ajax请求中使用beforeSend参数,并定义cookie的csrfToken值。

$.ajax({
    url: '/foo/bar',
    type: 'POST',
    dataType: 'HTML',
    data: data,
    beforeSend: function(xhr){
        xhr.setRequestHeader('X-CSRF-Token', csrfToken);
    },
})
.done(function(data) {
    alert('done !');
});

答案 1 :(得分:3)

  

根据条带文档,我在单击提交按钮后将隐藏值中的标记添加到表单中并且无法帮助但是注意到我的新安全性不允许这种情况发生。

在POST到另一个站点时,Cake的CSRF令牌无效。

  

由于我使用ajax将发布数据发送给我的用户控制器并在提交时添加表单输入,

     

如何检查csrf令牌并确保在没有禁用所涉及操作的安全性的情况下没有安全漏洞?

CSRF令牌在名为csrfToken的cookie中可用,因此请在您的javascript中读取该令牌,并为您的AJAX请求设置X-CSRF-Token标头。 CsrfCompoment将进行检查。

答案 2 :(得分:2)

using js function:

function getCookie(name) {
  var value = "; " + document.cookie;
  var parts = value.split("; " + name + "=");
  if (parts.length == 2) return parts.pop().split(";").shift();
}
...
then
$.ajax
        ({
            type: "Post",
            url: "URL_HERE",
            data: {some_data},
            beforeSend: function(xhr){
                xhr.setRequestHeader('X-CSRF-Token', getCookie('csrfToken'));
            },
            success: function (e) {
            },
            errors: function () {
            }
        });