生产服务器上的CakePHP3“在请求数据中未找到'_Token'

时间:2018-08-09 20:34:51

标签: php cakephp cakephp-3.6

我有一个使用CakePHP 3.6创建的网站,该网站似乎在我的计算机上运行良好(使用WAMP,PHP 5.6.31,Apache 2.4.27),但是放入生产服务器(Ubuntu 14.04,PHP 5.6)时却有不同的行为.37,Apache 2.4.7)。

只有一个在生产服务器上生成以下错误的POST请求:

'_Token' was not found in request data.

Cake\Controller\Exception\AuthSecurityException

我启用了安全组件,但我不想禁用它。所有表单字段都是使用FormHelper创建的。这些字段不会使用Javascript进行修改。

错误并非总是会发生,并且主要取决于用户在表单中输入的内容。我无法确定哪种内容会产生此错误。发送的数据是可能包含任何内容的一组字符串。但我看不到内容与该错误的相关性。

这是生成表格的代码示例

<?php

    echo '<div class="custom-card">';
    echo $this->Form->create($keyword);
    echo '<table class="table table-striped table-bordered">';

    // Create Table Headers with languages name
    $tableHeaders = ["Mot clé"];
    for ($i = 0; $i < count($languagesEnabled); $i++)
    {
        array_push($tableHeaders, "{$languagesEnabled[$i]->name} (version {$languagesEnabled[$i]->version})");
    }
    array_push($tableHeaders, "");
    echo '<thead>';
    echo $this->Html->tableHeaders($tableHeaders);
    echo '</thead>';

    //Fill Table Cells with keywords and sentences
    for ($i = 0; $i < count($keywords); $i++)
    {
        $keywordName = $this->Form->text("keywords.$i.name", ["value" => $keywords[$i]->name, 'class' => 'form-control']);
        $keywordId = $this->Form->hidden("keywords.$i.id", ["value" => $keywords[$i]->id]);

        $tableCells = [$keywordName . " " . $keywordId];
        $tableCells = array_pad($tableCells, count($languages) - 1, "");
        for ($j = 0; $j < count($languagesEnabled); $j++)
        {
            $sentenceLanguageId = $this->Form->hidden("keywords.$i.sentences.$j.language_id", ["value" => $languagesEnabled[$j]->id]);
            $sentenceKeywordId = $this->Form->hidden("keywords.$i.sentences.$j.keyword_id", ["value" => $keywords[$i]->id]);
            $sentenceArray = ["value" => findSentenceValueInArray($keywords[$i]->sentences, $languagesEnabled[$j]->id)];
            $sentenceValue = $this->Form->textarea("keywords.$i.sentences.$j.sentence", [
                'value' => $sentenceArray,
                'class' => 'form-control',
                'id' => "area-$i-$j",
                'onfocus' => "autosize(document.getElementById('area-$i-$j'))"
                ]);
            $tableCells[$j + 1] = $sentenceValue . $sentenceLanguageId . $sentenceKeywordId;
        }
        $tableCells[count($languagesEnabled) + 1] = $this->Html->link('Supprimer',
            ['controller' => 'Keywords', 'action' => 'remove', $keywords[$i]->id],
            ['confirm' => 'Êtes vous sûr de vouloir supprimer la phrase ?']);
        echo $this->Html->tableCells($tableCells);
    }
    echo "</table>";
    echo $this->Form->submit('Valider', ['class'=>'btn btn-primary']);
    echo $this->Form->end();
    echo '</div>';
?>

1 个答案:

答案 0 :(得分:0)

感谢Greg,我能够找到问题所在。正如他所说,如果您发送的数据过多,则会被截断。

为诊断问题,我实际上显示了SecurityComponent接收到的数据。您可以在vendor\cakephp\cakephp\src\Controller\Component\SecurityComponent.php中访问它。此文件中有一个函数_validToken(Controller $controller)。显示$check变量的内容可能会有所帮助(为此,我使用了pr()函数)。

我注意到我发送的某些数据实际上丢失了。显然,正如CakePHP所说,也没有_Token。

我唯一要做的就是在我的php.ini文件中增加max_input_vars