cakephp隐藏字段问题

时间:2014-02-08 22:52:47

标签: cakephp input-field

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

  

请求已经黑了。错误:在此服务器上找不到请求的地址。

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

4 个答案:

答案 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或解锁任何字段。任何建议欢迎。