投稿日:2019/07/11
更新日:2022/05/31
reCaptcha v3をPHPでできた問い合わせフォームに導入する方法。
参考サイト:https://stevencotterill.com/articles/adding-google-recaptcha-v3-to-a-php-form 今回は入力画面→確認画面に設置する
※
※
参考サイト:https://stevencotterill.com/articles/adding-google-recaptcha-v3-to-a-php-form 今回は入力画面→確認画面に設置する
recaptcha.jsファイルを作成する
設置場所
assets/js/
直下
ファイル内容
"use strict";
var site_key;
function set_site_key(key) {
site_key = key;
}
var form = document.querySelector('form.inquiry');
form.addEventListener('submit', function (event) {
event.preventDefault();
grecaptcha.ready(function () {
try {
grecaptcha.execute(site_key, {
action: 'inquiry'
}).then(function (token) {
//トークン取得が成功した場合
var input = document.createElement('input');
input.type = 'hidden';
input.name = 'recaptcha_token';
input.value = token;
form.appendChild(input);
form.submit();
}, function (reson) {
//トークン取得が失敗した場合
console.log("reCaptchaトークン取得に失敗しました。");
});
} catch (error) {
console.log("reCaptchaの処理に失敗しました。");
}
});
});
view/footer.phpを編集する
main.js
の記述の直下に下記を追記※
RECAPTCHA_SITE_KEY
はサイトキーで置き換える(2箇所)
<script src="https://www.google.com/recaptcha/api.js?render=RECAPTCHA_SITE_KEY"></script>
<script src="../assets/js/recaptcha.js"></script>
<script>set_site_key('RECAPTCHA_SITE_KEY');</script>
src/confirm_controller.phpを編集する
最下部に下記を追記※
RECAPTCHA_SECRET_KEY
はシークレットキーで置き換える
if ($_SERVER['REQUEST_METHOD'] === 'POST'
&& isset($_POST['recaptcha_token'])) {
$url = 'https://www.google.com/recaptcha/api/siteverify';
$url .= '?secret=';
$url .= 'RECAPTCHA_SECRET_KEY';
$url .= '&response=';
$url .= $recaptcha_token;
$recaptcha = file_get_contents($url);
if ($recaptcha === false) {
// Googleとの通信に失敗
header('HTTP', true, 500);
}
$recaptcha = json_decode($recaptcha);
$_SESSION["score"] = $recaptcha->score;
if ($recaptcha === null) {
// Googleからの応答が有効なJSONではない
header('HTTP', true, 500);
}
if ($recaptcha->success === false) {
// リキャプチャの検証にGoogle側が失敗
header('HTTP', true, 500);
}
if ($recaptcha->score < 0.29) {
header('HTTP', true, 403);
}
}
src/submit_controller.phpを編集する
メール送信処理(52行目付近)の直前に下記を記述
/*--------------------------------------*/
//スパムメール対策
/*--------------------------------------*/
//スパムメールを受信した場合、処理を終了させる
if (empty($_SESSION["score"])) {
exit("スパムメールを受信したため、プログラムを終了します。");
}