目次
はじめに
最近クライアントのお問い合わせに迷惑メールbotが永遠とメールを送り続けるという話が増えていました。
当然ながら完了ページでF5連打してメールを送り続けるという手法ではなく、botが入力ページから入力して送るという手順を踏んでいるようで(CSRF対策も無駄)、完全にお手上げ状態でした。
そこで、前から存在は知っていたものの、実装の勉強が面倒臭いというので放置していたGoogle reCAPTCHAを実装してみることにしました。
手順
最初のページ
まず下記のURLにアクセスする。
https://www.google.com/recaptcha/intro/v3.html
右上のボタンをクリックする。
新規作成ページ
初回作成の場合は、すぐにreCAPTCHAの新規作成ページに移動する。
1つでも作成している場合は、ダッシュボードに移動する。
以下が新規作成ページのURL
https://www.google.com/recaptcha/admin/create
ここからは、V3とV2で分岐して解説します。
reCAPTCHA V3 向け手順
reCAPTCHA V3 のキーを取得
reCAPTCHA V3を利用する場合は、以下の手順になる。
まずreCAPTCHAの種類で「reCAPTCHA V3」を選択する。
その後に該当の入力項目を入力する。
すべてを入力して、「送信」ボタンをクリックすると「reCAPTCHAのキー」が作成される。
このキー2つは後々利用するので、ページを残しておきます。
もし閉じてしまっても、今回作成したreCAPTCHAの編集ページで再度確認することが可能です。
reCAPTCHA V3 を実装する
ひとまず動かして確認したい人向けにサンプルのソースコードを準備しました。
以下を利用してください。
<?php
// サイトキーを入力
$key = '';
// シークレット キーを入力
$secretKey = '';
if (isset($_POST['name']) && isset($_POST['password']))
{
$Response = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.$secretKey.'&response='.$_POST['g-recaptcha-response']);
$result = json_decode($Response);
if ($result->success)
{
$message = 'success';
$status = 'success';
}
else
{
$message = $result->{'error-codes'}[0];
$status = 'danger';
}
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<script src="https://www.google.com/recaptcha/api.js?render=<?php echo $key ?>"></script>
<script>
grecaptcha.ready(function() {
grecaptcha.execute('<?php echo $key ?>', {action: 'login'}).then(function(token) {
var reCAPTCHA = document.getElementById('recaptcha');
reCAPTCHA.value = token;
});
});
</script>
</head>
<body>
<div class="content">
<div class="col-sm-5">
<?php echo isset($message) ? sprintf('<div class="alert alert-%s" role="alert">%s</div>',$status,$message):'' ?>
<form class="form" method="post">
<div class="form-group">
<label for="formGroupExampleInput">name</label>
<input type="text" class="form-control" id="formGroupExampleInput" placeholder="name input" name="name">
</div>
<div class="form-group">
<label for="formGroupExampleInput2">password</label>
<input type="password" class="form-control" id="formGroupExampleInput2" placeholder="password input" name="password">
</div>
<input type="hidden" name="g-recaptcha-response" id="recaptcha" />
<button type="submit" class="btn btn-primary">送信</button>
</form>
</div>
</div>
</body>
</html>
reCAPTCHA V2 向け手順
reCAPTCHA V2 のキーを取得
reCAPTCHA V2を利用する場合は、以下の手順になる。
まずreCAPTCHAの種類で「reCAPTCHA V2」を選択する。
その後に該当の入力項目を入力する。
すべてを入力して、「送信」ボタンをクリックすると「reCAPTCHAのキー」が作成される。
このキー2つは後々利用するので、ページを残しておきます。
もし閉じてしまっても、今回作成したreCAPTCHAの編集ページで再度確認することが可能です。
reCAPTCHA V2 を実装する
ひとまず動かして確認したい人向けにサンプルのソースコードを準備しました。
以下を利用してください。
<?php
// サイトキーを入力
$key = '';
// シークレット キーを入力
$secretKey = '';
if (isset($_POST['name']) && isset($_POST['password']))
{
$Response = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.$secretKey.'&response='.$_POST['g-recaptcha-response']);
$result = json_decode($Response);
if ($result->success)
{
$message = 'success';
$status = 'success';
}
else
{
$message = $result->{'error-codes'}[0];
$status = 'danger';
}
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<script type="text/javascript">
var onloadCallback = function() {
grecaptcha.render('html_element', {
'sitekey' : '<?php echo $key ?>'
});
};
</script>
<script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit" async defer></script>
</head>
<body>
<div class="content">
<div class="col-sm-5">
<?php echo isset($message) ? sprintf('<div class="alert alert-%s" role="alert">%s</div>',$status,$message):'' ?>
<form class="form" method="post">
<div class="form-group">
<label for="formGroupExampleInput">name</label>
<input type="text" class="form-control" id="formGroupExampleInput" placeholder="name input" name="name">
</div>
<div class="form-group">
<label for="formGroupExampleInput2">password</label>
<input type="password" class="form-control" id="formGroupExampleInput2" placeholder="password input" name="password">
</div>
<div class="form-group">
<div id="html_element"></div>
</div>
<button type="submit" class="btn btn-primary">送信</button>
</form>
</div>
</div>
</body>
さいごに
reCAPTCHA の設定手順でした。
ドキュメントを読むだけで、簡単に実装できてしまい拍子抜けしてしまいました。
V3の方がユーザーに負担が少ないけれど、5分間という制限があるので、ケースバイケースでV2を使うのもありかなと思いました。
今日はこの辺でー