CakePHP 3 上的 POST 数据中出现意外字段“g-recaptcha-response”

Posted

技术标签:

【中文标题】CakePHP 3 上的 POST 数据中出现意外字段“g-recaptcha-response”【英文标题】:Unexpected field 'g-recaptcha-response' in POST data on CakePHP 3 【发布时间】:2018-02-01 21:22:40 【问题描述】:

我使用 Cakephp 3 创建了一个网站。我有一个静态页面,可以通过以下方式联系我们:

在contactus.ctp中:

<?=$this->Form->create(); ?>
        <?=$this->Form->hidden('form_type',['value' => 'contact']) ?>
        <?=$this->Form->input('name',[
            'label' => false,
            'placeholder' => 'Your Full Name',
            'required' => true
        ]); ?>

        <?=$this->Form->input('email',[
            'label' => false,
            'placeholder' => 'Your Email',
            'type' => 'email',
            'require' => true
        ]); ?>

        <?=$this->Form->textarea('message',[
            'placeholder' => 'Your message...'
        ]) ?>

        <?= $this->Recaptcha->display()?> 

        <button>Submit Query!</button>

        <?=$this->Form->end(); ?>

我使用以下链接创建了 Recaptcha:

https://github.com/agiletechvn/Recaptcha

就在提交按钮旁边,我有 Recaptcha。

在 pageController 中我进行了提交检查:

if($this->request->is(['post']) && $this->request->data('form_type') == 'contact')

            $name = $this->request->data('name');
            $email = $this->request->data('email');
            $message = $this->request->data('message');

            if(!$name)
                $this->Flash->set('Please enter a name' . $name,['element' => 'error']);
             elseif (!$email || filter_var($email, FILTER_VALIDATE_EMAIL) === false) 
                $this->Flash->set('The email you entered is invalid',['element' => 'error']);
             elseif(!$message)
                $this->Flash->set('Message cannot be blank',['element' => 'error']);
             else 
                if($this->Recaptcha->verify()) 
                $emailObj = new Email();
                $emailObj
                    ->from(['contactus@mydomain.com' => 'Developer'])
                    ->replyTo([$email => $name])
                    ->to(['contactus@contactus.com'])
                    ->template('pages/contactus')
                    ->viewVars([
                        'quickAction' => [
                            'description' => 'Contact form',
                            'action' => "from: $name"
                        ],
                        'name' => 'contactus@mydomain.com',
                        'senderName' => $name,
                        'email' => $email,
                        'message' => $message
                    ])
                    ->subject('Contact email from ' . $name)
                    ->send();

                $this->Flash->set('Your message has been sent', ['element' => 'success']);
            

            $this->Flash->error(__('Please pass Google Recaptcha first'));
          

如果我点击提交按钮,我会得到:

Unexpected field 'g-recaptcha-response' in POST data 

我将 reCaptcha 代码移到了表单之外。一切正常,但验证码却位于这样的随机位置之外:

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

如果您正在使用 CakePHP 安全组件,并且该组件无法识别您的表单字段之一,则此消息可能会显示。您应该使用以下方法解锁此字段:

$this->Form->unlockField('g-recaptcha-response');

更多信息:CakePHP 3.x Security Component

【讨论】:

感谢您的快速回复。你必须把这个放在哪里?对不起,我对 cake php 完全陌生 把它放在.ctp文件中,在$this-&gt;Form-&gt;end()之前。

以上是关于CakePHP 3 上的 POST 数据中出现意外字段“g-recaptcha-response”的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP 3.4.2 测试 POST 的响应总是返回 NULL

在 Post 方法上获取 401 Unauthorized [前端 - Angular 2 和后端 - Cakephp 3]

CakePhp 1.3 如何处理作为 HTTP post 请求接收的数据?

CakePHP 3 - 保存前的数据关联

CakePHP 3 AJAX POST 不允许并返回 403

CakePHP 3 - 自定义数据源在哪里?