gpt4 book ai didi

php - ReCaptcha 在 iPhone 上无法正常工作

转载 作者:IT王子 更新时间:2023-10-29 00:56:22 25 4
gpt4 key购买 nike

我有一个带有简单联系表格的网站。验证有点少,因为它不进入数据库;只是一封电子邮件。表单的工作方式如下:

有 5 个字段 - 其中 4 个是必需的。提交被禁用,直到4个字段都有效,然后您可以提交。然后再次在服务器上验证所有内容,包括recaptcha(我的客户端未验证)。整个过程用ajax完成,有多个测试必须在服务端通过或者返回4**个headers,调用fail回调handler。

在桌面上的 Chrome 上,一切都像 gangbusters(我没有尝试过其他浏览器,但我无法想象为什么它们会有所不同),但在 iPhone 上,即使我不检查,reCaptcha 也会始终验证测试用的盒子。

换句话说:我仍然必须正确填写四个值才能提交,但如果我不选中 reCaptcha 框,请求仍然成功。

如果有人认为这会有所帮助,我可以发布一些代码,但似乎问题出在设备而不是代码上。有人对此有任何见解吗?


注意:如果有帮助,服务器端是 PHP/Apache。


更新:2015 年 5 月 28 日:

我仍在调试它,但似乎 Mobile Safari 忽略了我在 iPhone 上的响应 header 。当我将响应输出到页面时,我在桌面上得到的 (data,status,xhr) 是:

  1. data:我的回应,此时只是说错误或成功 -> error

  2. 状态:错误

  3. xhr: {'error',400,'error'}

在移动 Safari 上:

  1. 数据:错误

  2. 状态:成功

  3. xhr: {'error',200,'success'}

所以 - 它似乎只是忽略了我的响应标题。我尝试明确设置 {"headers":{"cache-control":"no-cache"}} 但无济于事。


更新:2015 年 6 月 3 日

每个请求,这里是代码。这几乎肯定超出了您的需要。由于我为尝试修复它所做的更改,它也变得更加迟钝。另请注意,虽然看起来有些变量尚未定义,但它们(应该)已在其他文件中定义。

客户端

 $('#submit').on('click', function(e) {

$(this).parents('form').find('input').each(function() {
$(this).trigger('blur');
})
var $btn = $(this);
$btn = $btn.button('loading');
var dfr = $.Deferred();

if ($(this).attr('disabled') || $(this).hasClass('disabled')) {

e.preventDefault();
e.stopImmediatePropagation();
dfr.reject();
return false;

} else {

var input = $('form').serializeArray();
var obj = {},
j;

$.each(input, function(i, a) {

if (a.name === 'person-name') {

obj.name = a.value;

} else if (a.name === 'company-name') {

obj.company_name = a.value;

} else {

j = a.name.replace(/(g-)(.*)(-response)/g, '$2');
obj[j] = a.value;

}

});

obj.action = 'recaptcha-js';
obj.remoteIp = rc.remoteiP;
rc.data = obj;

var request = $.ajax({

url: rc.ajaxurl,
type: 'post',
data: obj,

headers: {
'cache-control': 'no-cache'
}

});

var success = function(data) {

$btn.data('loadingText', 'Success');
$btn.button('reset');
$('#submit').addClass('btn-success').removeClass('btn-default');
$btn.button('loading');
dfr.resolve(data);


};
var fail = function(data) {

var reason = JSON.parse(data.responseText).reason;
$btn.delay(1000).button('reset');
switch (reason) {

case 'Recaptcha Failed':
case 'Recaptcha Not Checked':
case 'One Or more validator fields not valid or not filled out':
case 'One Or more validator fields is invalid':

// reset recaptcha

if ($('#submit').data('tries')) {

$('#submit').remove();
$('.g-recaptcha').parent().addBack().remove();

myPopover('Your request is invalid. Please reload the page to try again.');

} else {

$('#submit').data('tries', 1);
grecaptcha.reset();

myPopover('One or more of your entries are invalid. Please make corrections and try again.');
}


break;

default:

// reset page
$('#submit').remove();
$('.g-recaptcha').remove();


myPopover('There was a problem with your request. Please reload the page and try again.');

break;
}
dfr.reject(data);

};

request.done(success);
request.fail(fail);



}

服务器:

function _send_email(){

$recaptcha=false;
/* * */
if(isset($_POST['recaptcha'])):

$gRecaptchaResponse=$_POST['recaptcha'];
$remoteIp=isset($_POST['remoteIp']) ? $_POST['remoteIp'] : false;

/* ** */
if(!$remoteIp):

$response=array('status_code'=>'409','reason'=>'remoteIP not set');
echo json_encode($response);
http_response_code(409);

exit();

endif;
/* ** */

/* ** */
if($gRecaptchaResponse==''):

$response=array('status_code'=>'400','reason'=>'Recaptcha Failed');
echo json_encode($response);
http_response_code(400);
exit();

endif;
/* ** */

if($recaptcha=recaptcha_test($gRecaptchaResponse,$remoteIp)):

$recaptcha=true;

/* ** */
else:

$response=array('status_code'=>'400','reason'=>'Recaptcha Failed');
echo json_encode($response);
http_response_code(400);
exit();

endif;
/* ** */

/* * */
else:

$response=array('status_code'=>'400','reason'=>'Recaptcha Not Checked');
echo json_encode($response);
http_response_code(400);
exit();

endif;
/* * */

/* * */
if($recaptcha==1):

$name=isset($_POST['name']) ? $_POST['name'] : false;
$company_name=isset($_POST['company_name']) ? $_POST['company_name'] : false;
$phone=isset($_POST['phone']) ? $_POST['phone'] : false;
$email=isset($_POST['email']) ? $_POST['email'] : false;

/* ** */
if(isset($_POST['questions'])):

$questions=$_POST['questions']=='' ? 1 : $_POST['questions'];

/* *** */

if(!$questions=filter_var($questions,FILTER_SANITIZE_SPECIAL_CHARS)):

$response=array('status_code'=>'400','reason'=>'$questions could not be sanitized');
echo json_encode($response);
http_response_code(400);
exit();

endif;
/* *** */

/* ** */
else:

$questions=true;

endif;
/* ** */

/* ** */
if( count( array_filter( array( $name,$company_name,$phone,$email ),"filter_false" ) ) !=4 ):

$response=array('status_code'=>'400','reason'=>'One Or more validator fields not valid or not filled out');
echo json_encode($response);
http_response_code(400);
exit();

endif;
/* ** */

$company_name=filter_var($company_name,FILTER_SANITIZE_SPECIAL_CHARS);
$name=filter_var($name,FILTER_SANITIZE_SPECIAL_CHARS);
$phone=preg_replace('/[^0-9+-]/', '', $phone);
$email=filter_var($email,FILTER_VALIDATE_EMAIL);

/* ** */
if($company_name && $recaptcha && $name && $phone && $email && $questions):

$phone_str='Phone: ' . $phone;
$company_str='Company: ' . $company_name;
$email_str='Email String: ' . $email;
$name_str='Name: '.$name;
$questions=$questions==1 ? '' : $questions;
$body="$name_str\r\n\r\n$company_str\r\n\r\n$email_str\r\n\r\n$phone_str\r\n\r\n____________________\r\n\r\n$questions";


$mymail='fake@fake.com';
$headers = array();
$headers[] = "MIME-Version: 1.0";
$headers[] = "Content-type: text/plain; charset=\"utf-8\"";
$headers[] = "From: $email";
$headers[] = "X-Mailer: PHP/" . phpversion();

/* *** */
if(mail('$mymail', 'Information Request from: ' . $name,$body,implode("\r\n",$headers))):

$response=array('status_code'=>'200','reason'=>'Sent !');
echo json_encode($response);
http_response_code(200);
exit();

/* *** */
else:

$response=array('status_code'=>'400','reason'=>'One Or more validator fields is invalid');
echo json_encode($response);
http_response_code(400);
exit();

endif;
/* *** */

endif;
/* ** */

endif;
/* * */

$response=array('status_code'=>'412','reason'=>'There was an unknown error');
echo json_encode($response);
http_response_code(412);
exit();
}


function recaptcha_test($gRecaptchaResponse,$remoteIp){

$secret=$itsasecret; //removed for security;

require TEMPLATE_DIR . '/includes/lib/recaptcha/src/autoload.php';
$recaptcha = new \ReCaptcha\ReCaptcha($secret);
$resp = $recaptcha->verify($gRecaptchaResponse, $remoteIp);

if ($resp->isSuccess()) {
return true;
// verified!
} else {
$errors = $resp->getErrorCodes();
return false;
}
}

最佳答案

喜欢这个问题iOS: Authentication using XMLHttpRequest - Handling 401 reponse解决这个问题的最简单方法是忽略自然 header 验证,并在回调成功时使用一些标志进行验证。

我见过一些这样的情况,但从来没有好闻的。

关于php - ReCaptcha 在 iPhone 上无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30483703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com