From 32cf4871287aa316c4f3f15e24c7a8945e0e8fc1 Mon Sep 17 00:00:00 2001 From: slawkens Date: Wed, 31 Aug 2022 11:16:48 +0200 Subject: [PATCH 01/11] Feature/recaptcha v3 plus login (#202) * [WIP] New GoogleReCAPTCHA code Support for v3 v2-invisible doesn't work yet * Add some notice about recaptchas versions * Lets support only ReCaptcha v3 Too much mess ;) * Fixes --- config.php | 6 +- system/libs/GoogleReCAPTCHA.php | 79 +++++++++++++++++++++ system/login.php | 8 +++ system/pages/createaccount.php | 13 ++-- system/templates/account.create.html.twig | 20 ++---- system/templates/account.login.html.twig | 7 ++ system/templates/google_recaptcha.html.twig | 11 +++ system/templates/templates.header.html.twig | 4 +- templates/tibiacom/account.login.html.twig | 7 ++ 9 files changed, 129 insertions(+), 26 deletions(-) create mode 100644 system/libs/GoogleReCAPTCHA.php create mode 100644 system/templates/google_recaptcha.html.twig diff --git a/config.php b/config.php index a4fa1ac3..36eda984 100644 --- a/config.php +++ b/config.php @@ -135,11 +135,13 @@ $config = array( 'smtp_secure' => '', // What kind of encryption to use on the SMTP connection. Options: '', 'ssl' (GMail) or 'tls' (Microsoft Outlook) 'smtp_debug' => false, // set true to debug (you will see more info in error.log) - // reCAPTCHA (prevent spam bots) + // Google reCAPTCHA v3 (prevent spam bots) 'recaptcha_enabled' => false, // enable recaptcha verification code 'recaptcha_site_key' => '', // get your own site and secret keys at https://www.google.com/recaptcha 'recaptcha_secret_key' => '', - 'recaptcha_theme' => 'light', // light, dark + // min score for validation, between 0 - 1.0 + // https://developers.google.com/recaptcha/docs/v3#interpreting_the_score + 'recaptcha_min_score' => 0.5, // 'generate_new_reckey' => true, // let player generate new recovery key, he will receive e-mail with new rec key (not display on page, hacker can't generate rec key) diff --git a/system/libs/GoogleReCAPTCHA.php b/system/libs/GoogleReCAPTCHA.php new file mode 100644 index 00000000..fe4bda0a --- /dev/null +++ b/system/libs/GoogleReCAPTCHA.php @@ -0,0 +1,79 @@ +score . ', action:' . $json->action); + if (!isset($json->action) || $json->action !== $action) { + self::$errorType = self::ERROR_INVALID_ACTION; + self::$errorMessage = 'Google ReCaptcha returned invalid action.'; + return false; + } + + if (!isset($json->score) || $json->score < config('recaptcha_min_score')) { + self::$errorType = self::ERROR_LOW_SCORE; + self::$errorMessage = 'Your Google ReCaptcha score was too low.'; + return false; + } + + if (!isset($json->success) || !$json->success) { + self::$errorType = self::ERROR_NO_SUCCESS; + self::$errorMessage = "Please confirm that you're not a robot."; + return false; + } + + return true; + } + + /** + * @return string + */ + public static function getErrorMessage() { + return self::$errorMessage; + } + + /** + * @return int + */ + public static function getErrorType() { + return self::$errorType; + } +} diff --git a/system/login.php b/system/login.php index cf33d04b..e820f4c8 100644 --- a/system/login.php +++ b/system/login.php @@ -84,6 +84,14 @@ else $t = isset($tmp[$ip]) ? $tmp[$ip] : NULL; } + if(config('recaptcha_enabled')) + { + require LIBS . 'GoogleReCAPTCHA.php'; + if (!GoogleReCAPTCHA::verify('login')) { + $errors[] = GoogleReCAPTCHA::getErrorMessage(); + } + } + $account_logged = new OTS_Account(); if (config('account_login_by_email')) { $account_logged->findByEMail($login_account); diff --git a/system/pages/createaccount.php b/system/pages/createaccount.php index 06f5f414..6a7a218d 100644 --- a/system/pages/createaccount.php +++ b/system/pages/createaccount.php @@ -72,17 +72,12 @@ if($save) $errors['country'] = 'Country is invalid.'; } - if($config['recaptcha_enabled']) + if(config('recaptcha_enabled')) { - if(isset($_POST['g-recaptcha-response']) && !empty($_POST['g-recaptcha-response'])) - { - $verifyResponse = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.$config['recaptcha_secret_key'].'&response='.$_POST['g-recaptcha-response']); - $responseData = json_decode($verifyResponse); - if(!$responseData->success) - $errors['verification'] = "Please confirm that you're not a robot."; + require LIBS . 'GoogleReCAPTCHA.php'; + if (!GoogleReCAPTCHA::verify('register')) { + $errors['verification'] = GoogleReCAPTCHA::getErrorMessage(); } - else - $errors['verification'] = "Please confirm that you're not a robot."; } // password diff --git a/system/templates/account.create.html.twig b/system/templates/account.create.html.twig index cb89d4b3..84be3ac6 100644 --- a/system/templates/account.create.html.twig +++ b/system/templates/account.create.html.twig @@ -109,19 +109,9 @@ {{ hook('HOOK_ACCOUNT_CREATE_AFTER_PASSWORDS') }} - {% if config.recaptcha_enabled %} - - - Verification: - - -
- - - {% if errors.verification is defined %} - {{ errors.verification }} - {% endif %} - {% endif %} + {% if config.recaptcha_enabled %} + + {% endif %} {{ hook('HOOK_ACCOUNT_CREATE_AFTER_RECAPTCHA') }} @@ -339,6 +329,10 @@ {{ hook('HOOK_ACCOUNT_CREATE_AFTER_FORM') }} +{% if config.recaptcha_enabled %} + {% set action = 'register' %} + {{ include('google_recaptcha.html.twig') }} +{% endif %}