如何在表单输入的PHP白名单中包含Google RECAPTCHA 2

时间:2018-09-27 00:45:24

标签: php html forms recaptcha

我有一个表格,决定将Google Recaptcha包含在内,以增加安全性。 当我添加Recaptcha时,由于Recaptcha未列入白名单,因此会触发错误。 我读到HTML5不允许将name属性分配给div。即<div name="myName"></div>. 按照惯例,我尝试将名称属性添加到recaptcha div并将该名称添加到白名单。这种方法失败了。 recaptcha div中存在一个具有name属性的iframe。我尝试在白名单中使用iframe名称。这种方法也失败了。 有一个具有id =“ recaptcha-token”的隐藏输入。我在白名单中添加了“验证码令牌”。这种方法也失败了。 隐藏的输入是由recaptcha api生成的,因此我认为我没有办法为该输入分配name属性。 有人有解决方法或建议吗?

注意:在添加Recaptcha之前,表单验证和白名单均按预期工作。

如果我取消了表单输入的白名单,则验证码将按预期工作。

这是表单中的div。

<div class="row">
  <div class="col-md-12">
    <div class="g-recaptcha" data-sitekey="<?php print $public_key;?>"></div>
  </div>
</div>

表单中有一个包含令牌的隐藏输入。此输入和令牌与Google Recaptcha完全分开。但是,必须先验证此令牌,然后才能将表单输入与$ whitelist进行比较。

以下是代码块:

function verifyFormToken($form) {
    if(!isset($_SESSION[$form.'_token'])) { 
        $errors[]= "Session not set and no token";
        return false;
    }else{
        //echo 'Session token is set.'.'</br>';
    }   

    if(!isset($_POST['token'])) {
        $errors[]= 'No form token was sent!'.'</br>';
        return false;
    }

    if ($_SESSION[$form.'_token'] !== $_POST['token']) {
        $errors[]= 'tokens don\'t match!'.'</br>';
        return false;
        die();
    }else{
        //echo 'Tokens match. Good to go.'.'</br>';
        return true;
    }   
}

    // VERIFY LEGITIMACY OF TOKEN
if (verifyFormToken('form1')) {
    // Build a whitelist of form inputs
    $whitelist = array('token','req-fName','req-lName','req-email','req-phone','req-address','req-city','req-   state','req-zip','req-message','req_method','req-dateDepart','req-dateReturn','recaptcha-token','submit');

    foreach ($_POST as $key=>$item) {
        if (!in_array($key, $whitelist)) {
            writeLog('Unknown form fields');
            die('Hack-Attempt detected. Only the fields originally included in the form are allowed!');
        }
    } 
}

1 个答案:

答案 0 :(得分:0)

此答案来自phpbuilder.com 原来,我需要在白名单中添加“ g-recaptcha-response ”。希望这对其他面临此问题的人有所帮助。