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