diff --git a/.env.example b/.env.example index 267cb6d..633c6be 100644 --- a/.env.example +++ b/.env.example @@ -42,3 +42,7 @@ CRM_TOKEN= PROJECT_UUID= # Google Analytics ANALYTICS_GOOGLE_ID= +# Google Recaptcha +GOOGLE_RECAPTCHA_PUBLIC= +GOOGLE_RECAPTCHA_PRIVATE= +GOOGLE_RECAPTCHA_VERSION= diff --git a/app/Http/Middleware/SecureHeaders.php b/app/Http/Middleware/SecureHeaders.php index fa93e23..b463066 100644 --- a/app/Http/Middleware/SecureHeaders.php +++ b/app/Http/Middleware/SecureHeaders.php @@ -53,7 +53,11 @@ class SecureHeaders 'https://use.fontawesome.com', 'https://fonts.googleapis.com' ]) . ';', - "script-src 'self' $jsDev " . \implode(' ', [ + 'frame-src ' . implode(' ', [ + 'https://www.google.com/recaptcha/', + 'https://recaptcha.google.com/recaptcha/', + ]), + "script-src 'self' {$jsDev} " . \implode(' ', [ 'https://www.googletagmanager.com', 'https://cdnjs.cloudflare.com', "$scheme://www.google-analytics.com", diff --git a/app/Http/Requests/Fo/ContactFormRequest.php b/app/Http/Requests/Fo/ContactFormRequest.php index 2d571af..8ed3c8c 100644 --- a/app/Http/Requests/Fo/ContactFormRequest.php +++ b/app/Http/Requests/Fo/ContactFormRequest.php @@ -2,6 +2,7 @@ namespace App\Http\Requests\Fo; +use App\Lib\Helpers\ToolboxHelper; use Illuminate\Foundation\Http\FormRequest; class ContactFormRequest extends FormRequest @@ -23,6 +24,7 @@ class ContactFormRequest extends FormRequest */ public function rules() { + ToolboxHelper::validateRecaptcha($this, \config('services.google.recaptcha.version')); return [ 'firstname' => 'required|min:2|max:255', 'lastname' => 'required|min:2|max:255', diff --git a/app/Lib/Helpers/ToolboxHelper.php b/app/Lib/Helpers/ToolboxHelper.php index e5d3e4e..95133be 100644 --- a/app/Lib/Helpers/ToolboxHelper.php +++ b/app/Lib/Helpers/ToolboxHelper.php @@ -4,6 +4,8 @@ namespace App\Lib\Helpers; use App\Models\Product; use Illuminate\Http\Request; +use Illuminate\Support\Carbon; +use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Validator; use Illuminate\Support\Str; @@ -251,4 +253,58 @@ class ToolboxHelper throw new \RuntimeException('cannot handle $input of type ' . \gettype($input)); } } + + /** + * Validate recaptcha + * + * @param Request $request + * @param boolean $isV3 + * @return void + */ + public static function validateRecaptcha(Request $request, bool $isV3 = true) + { + Validator::validate($request->all(), [ + 'g-recaptcha-response' => [ + 'required', 'string', + // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed, Generic.CodeAnalysis.UnusedFunctionParameter.FoundBeforeLastUsed + function ($attribute, $value, $fail) use ($isV3) { + try { + $response = Http::asForm()->post('https://www.google.com/recaptcha/api/siteverify', [ + 'secret' => config('services.google.recaptcha.private'), + 'response' => \strval($value), + 'remoteip' => app('clientIp') + ]); + if ($e = $response->toException()) { + throw $e; + } + if ($isV3) { + if ( + !$response->json('success') or + !$response->json('challenge_ts') or + Carbon::parse($response->json('challenge_ts'))->lessThan(\now('utc')->subMinutes(5)) or + $response->json('hostname') !== \parse_url(config('app.url'), \PHP_URL_HOST) or + !$response->json('score') + ) { + throw new \RuntimeException(); + } + if (\floatval($response->json('score')) < 0.8) { + $fail("Vous n'avez pas obtenu un score assez élevé lors de la validation du recaptcha"); + } + return; + } + if ( + !$response->json('success') or + !$response->json('challenge_ts') or + Carbon::parse($response->json('challenge_ts'))->lessThan(\now('utc')->subMinutes(5)) or + $response->json('hostname') !== \parse_url(config('app.url'), \PHP_URL_HOST) + ) { + throw new \RuntimeException(); + } + } catch (\Exception $e) { + $fail('Erreur lors de la validation du formulaire veuillez réssayer'); + } //end try + } + ] + ], [], ['g-recaptcha-response' => 'reCaptcha']); + } } diff --git a/config/ldcweb-cookies.php b/config/ldcweb-cookies.php index b0d0322..9038880 100644 --- a/config/ldcweb-cookies.php +++ b/config/ldcweb-cookies.php @@ -2,7 +2,7 @@ /** * LDC Service Web Cookies - * Version 2.1.1 + * Version 2.1.2 */ return [ diff --git a/config/services.php b/config/services.php index 915dfe7..49ff704 100644 --- a/config/services.php +++ b/config/services.php @@ -30,4 +30,13 @@ return [ 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), ], + 'google' => [ + 'recaptcha' => [ + 'public' => env('GOOGLE_RECAPTCHA_PUBLIC'), + 'private' => env('GOOGLE_RECAPTCHA_PRIVATE'), + 'version' => env('GOOGLE_RECAPTCHA_VERSION', "3") === "3" ? true : false + ] + ], + + ]; diff --git a/resources/theme b/resources/theme index a6c9aac..060f8cb 160000 --- a/resources/theme +++ b/resources/theme @@ -1 +1 @@ -Subproject commit a6c9aac5aa48090a17ec88918924deb3cbc95cd4 +Subproject commit 060f8cb4093875ef391890984567b7d2a8490beb