gpt4 book ai didi

php - 服务器迁移后,在 CakePHP3 的请求数据中找不到“_Token”

转载 作者:可可西里 更新时间:2023-11-01 13:20:45 25 4
gpt4 key购买 nike

编辑:

提出这个问题后获得的一系列新见解告诉我问题是什么,它绝对与描述的服务器迁移没有任何关系。

给出的两个答案显示了如何为 CakePHP 2 和 3“修复”这个问题,但请记住这可能会带来安全风险。 CSRF 组件是一项重要的安全功能,不应轻易禁用。

原始问题:

我将我的 CakePHP 3 项目从笔记本电脑上的 XAMPP 迁移到服务器上的 XAMPP。自从我激活安全组件后,cake 就向我抛出一个错误。在这里,直接来自错误日志:

    2016-05-21 20:32:01 Error: [Cake\Controller\Exception\AuthSecurityException] '_Token' was not found in request data.
Request URL: /Users/addUser
Referer URL: http://localhost/users/add_user
Stack Trace:
#0 C:\xampp\htdocs\vendor\cakephp\cakephp\src\Controller\Component\SecurityComponent.php(324): Cake\Controller\Component\SecurityComponent->_validToken(Object(App\Controller\UsersController))
#1 C:\xampp\htdocs\vendor\cakephp\cakephp\src\Controller\Component\SecurityComponent.php(130): Cake\Controller\Component\SecurityComponent->_validatePost(Object(App\Controller\UsersController))
#2 C:\xampp\htdocs\vendor\cakephp\cakephp\src\Event\EventManager.php(386): Cake\Controller\Component\SecurityComponent->startup(Object(Cake\Event\Event))
#3 C:\xampp\htdocs\vendor\cakephp\cakephp\src\Event\EventManager.php(356): Cake\Event\EventManager->_callListener(Array, Object(Cake\Event\Event))
#4 C:\xampp\htdocs\vendor\cakephp\cakephp\src\Event\EventDispatcherTrait.php(78): Cake\Event\EventManager->dispatch(Object(Cake\Event\Event))
#5 C:\xampp\htdocs\vendor\cakephp\cakephp\src\Controller\Controller.php(495): Cake\Controller\Controller->dispatchEvent('Controller.star...')
#6 C:\xampp\htdocs\vendor\cakephp\cakephp\src\Routing\Dispatcher.php(109): Cake\Controller\Controller->startupProcess()
#7 C:\xampp\htdocs\vendor\cakephp\cakephp\src\Routing\Dispatcher.php(87): Cake\Routing\Dispatcher->_invoke(Object(App\Controller\UsersController))
#8 C:\xampp\htdocs\webroot\index.php(37): Cake\Routing\Dispatcher->dispatch(Object(Cake\Network\Request), Object(Cake\Network\Response))
#9 {main}

我找到了 CakePHP security component blackholing login (data[_Token][key] field not generated) ,在 StackOverflow 上,但没有关于导致我的问题的其他相关信息。在我的 Appcontroller 中:

    public function initialize()
{
parent::initialize();

$this->loadComponent('Security');
$this->loadComponent('RequestHandler');
$this->loadComponent('Flash');

最佳答案

错误与_TOKEN有关。当我们创建一个 CakePHP 表单然后基于输入字段时,CakePHP 生成名为 _TOKEN 的隐藏字段。

例如:

<?= $this->Form->create(false, [
'id' => "ajaxForm",
'url' => [
'controller' => 'TPCalls',
'action' => 'add'
],
'class'=> "addUpdateDeleteEventForm"
]);
?>
<?= $this->Form->input('id', ['label' => false]); ?>
<?= $this->Form->input('start', ['label' => false]); ?>
<?= $this->Form->input('end', ['label' => false]); ?>
<?= $this->Form->input('title', ['label' => false]); ?>
<?= $this->Form->hidden('ADD', ['value' => 'true']); ?>
<?= $this->Form->end(); ?>

现在您应该在检查 HTML 时在表单中看到 _TOKEN 值:

<input type="hidden" name="_Token[fields]" autocomplete="off" value="---HASH---">

如果您没有任何可见字段,则 _Token 将为空。如果您需要不可见的字段,则只需在表单或字段上添加一个隐藏类。

不管怎样,回到主要问题。该错误是由 _TOKEN 字段缺失引起的。在上述情况下,我会在进行 Ajax 调用之前序列化我的表单。

    //serializing the form    
var ajaxdata = $("#ajaxForm").serializeArray();

//ajax
$.ajax({
url:$("#ajaxForm").attr("action"),
type:"POST",
beforeSend: function(xhr){
xhr.setRequestHeader("X-CSRF-Token", $('[name="_csrfToken"]').val());
},
data:ajaxdata,
dataType: "json",
success:function(response) {
console.log(response);
},
error: function(response) {
console.error(response.message, response.title);
}
});

请注意,在 ajax 中,我使用的是 Cakephp 表单中的 URL,而不是在 ajax 中对其进行硬编码。这样,它将使用 cakephp url 助手。

关于php - 服务器迁移后,在 CakePHP3 的请求数据中找不到“_Token”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37360734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com