【问题标题】:cakephp hidden field issuecakephp隐藏字段问题
【发布时间】:2014-02-08 22:52:46
【问题描述】:

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

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

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

【问题讨论】:

    标签: cakephp input-field


    【解决方案1】:

    您的代码没有错误。 CakePHP's Security component 检查隐藏的表单字段以防止最终用户篡改:

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

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

    $this->Form->unlockField('User.id');
    

    【讨论】:

    • @jacob 我们不应该使用表单解锁方法。这会导致安全问题。
    【解决方案2】:

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

       echo $this->Form->input('field_name', array('type'=>'hidden'));
    

    【讨论】:

    • 这是处理Cakephp 3“表单临时”和“意外字段”错误的正确方法
    【解决方案3】:

    我认为这是因为您正在使用 SecurityComponent。

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 这对我来说看起来过于复杂了。解锁要在页面提供后更改的字段没有任何问题。因此,要么解锁给定字段,要么将其转换为 CSS 隐藏的 type="text" 输入应该没问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多