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