我有一个表格,决定将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!');
}
}
}
答案 0 :(得分:0)
此答案来自phpbuilder.com 原来,我需要在白名单中添加“ g-recaptcha-response ”。希望这对其他面临此问题的人有所帮助。