我在名为 add.ctp 的视图中的输入字段存在问题。当输入类型设置为“文本”时,程序顺序正常。但是当我将输入类型更改为“隐藏”时,会显示以下错误:
该请求已成为黑洞。错误:在此服务器上找不到请求的地址。
mod-rewrite 似乎已激活。任何想法,这可能是什么原因?
我在名为 add.ctp 的视图中的输入字段存在问题。当输入类型设置为“文本”时,程序顺序正常。但是当我将输入类型更改为“隐藏”时,会显示以下错误:
该请求已成为黑洞。错误:在此服务器上找不到请求的地址。
mod-rewrite 似乎已激活。任何想法,这可能是什么原因?
您的代码没有错误。CakePHP 的安全组件检查隐藏的表单字段以防止最终用户篡改:
默认情况下,SecurityComponent 会阻止用户篡改表单。它通过使用 FormHelper 并跟踪表单中的哪些文件来做到这一点。它还跟踪隐藏输入元素的值。所有这些数据都被组合起来并变成一个散列。提交表单时,SecurityComponent 将使用 POST 数据构建相同的结构并比较哈希。
用于FormHelper::unlockField
使字段免除此功能:
$this->Form->unlockField('User.id');
这意味着您的代码有错误。这是创建隐藏文本框的方法
echo $this->Form->input('field_name', array('type'=>'hidden'));
我认为这是因为您使用的是 SecurityComponent。
该组件监视表单完整性,隐藏字段不应从用户更改,因此安全组件“决定”对表单进行了恶意操作,例如 CSRF 攻击并阻止提交。而且我相信您有一些 JavaScript 会出于某种原因更改字段值。
蛋糕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 或解锁任何字段。欢迎任何建议。