4

我在名为 add.ctp 的视图中的输入字段存在问题。当输入类型设置为“文本”时,程序顺序正常。但是当我将输入类型更改为“隐藏”时,会显示以下错误:

该请求已成为黑洞。错误:在此服务器上找不到请求的地址。

mod-rewrite 似乎已激活。任何想法,这可能是什么原因?

4

4 回答 4

7

您的代码没有错误。CakePHP 的安全组件检查隐藏的表单字段以防止最终用户篡改:

默认情况下,SecurityComponent 会阻止用户篡改表单。它通过使用 FormHelper 并跟踪表单中的哪些文件来做到这一点。它还跟踪隐藏输入元素的值。所有这些数据都被组合起来并变成一个散列。提交表单时,SecurityComponent 将使用 POST 数据构建相同的结构并比较哈希。

用于FormHelper::unlockField使字段免除此功能:

$this->Form->unlockField('User.id');
于 2014-02-08T23:24:05.413 回答
1

这意味着您的代码有错误。这是创建隐藏文本框的方法

   echo $this->Form->input('field_name', array('type'=>'hidden'));
于 2014-02-08T23:12:29.607 回答
0

我认为这是因为您使用的是 SecurityComponent。

该组件监视表单完整性,隐藏字段不应从用户更改,因此安全组件“决定”对表单进行了恶意操作,例如 CSRF 攻击并阻止提交。而且我相信您有一些 JavaScript 会出于某种原因更改字段值。

于 2014-02-08T23:28:41.057 回答
-1

蛋糕PHP 3

请不要为任何特定操作解锁字段/禁用 CSRF 安全组件。这对于表单的安全性很重要。

对于那些收到“请求已被黑洞”的人。 , "表单被篡改错误" , "您无权访问该位置。" “POST 数据中的意外字段”。这主要是由于 CSRF 组件按预期工作。

禁用或修改它不是解决方案。请遵循正确的方法,而不是禁用。

正确的方法应该如下:

在表单上,​​添加一个隐藏字段,如下所示。

 <?= $this->Form->text('TPCalls.ID',['label' => false, 'class' => 'hidden']); ?>

在 AJAX 添加字段之前

$("input[name='TPCalls[ID]']").val(event.id);

然后序列化它

var el = $("#xyzForm");

var ajaxTPCalls = el.serializeArray();
  $.ajax({
                            type: el.attr('method'),
                            async: true,
                            url:  el.attr('action'),
                            data: ajaxTPCalls,
                            dataType: "json",
                            cache: false,
                            success: function (data) {

                                toastr.success(data.message, data.title);
                            },
                            error: function (jqXHR) {
                                if (jqXHR.status == 403) {
                                    $("body").html(jqXHR.responseText);
                                }
                            }
                        });

这样您就不会禁用 CSRF 或解锁任何字段。欢迎任何建议。

于 2018-09-20T11:18:50.350 回答