先日amazonの人間確認でサイコロの上面合計が○になる画像を10回もクリックさせられてやになったので、自分のサイト利用者がそんなことにならないように楽な方法を探した。
10回は異常、さすがにやりすぎ感が半端なかったです。
ちょうど最近話題のCloudflareのTurnstileが良さそうなので変更する。
CloudflareダッシュボードのTurnstileに行ってサイトを追加する。
ここまでは難なく済んだけれど、responseの取得方法が不明のままあれこれしてたら、なんと!!api.jsを読み込んだページから送信したformデータの中に自動で入ってた…
マニュアルのどっかに書いてあるのかもしれないけど、なんか英語って読み飛ばしてしまうじゃない?
私はいじくってる方が早いと思って、結局遠回りするタイプです。
と言うことで、日本語サイトで見つけられなかったので、簡単なコードを参考にのせておきます。
そのままturnstile.phpとかして実行したらテストできることでしょう。
コメントアウトしてあるところをどけたら返事がみられます。
お判りでしょうけど$skeyにはシークレットキーで$okeyにはサイトキーです。
$_POSTをそのまま送ってるけど、Cloudflareさんなので大丈夫でしょ:D
あとはOKのところにしたいこと書いたり、フラグたてて他で処理したりしたらよいです。
OK判断が不安であればchallenge_tsなど成功したときに出てくる値もチェックすると安心ですね!
curl_errorの下りは不要な気もしないでもない… if5行はなくても本来の動作に影響ないです。
今年はおそらく最後の投稿かな?
お体に気を付けてください。
<?php
$skey = '0x******';
$okey = '0x****';
if (isset($_POST['cf-turnstile-response'])) {
$query = ['secret' => $skey, 'response' => $_POST['cf-turnstile-response']];
$curl = curl_init('https://challenges.cloudflare.com/turnstile/v0/siteverify');
curl_setopt_array($curl, [CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => http_build_query($query, '', '&')]);
$res = curl_exec($curl);
curl_close($curl);
if (curl_error($curl)) {
echo 'Turnstile Error';
// echo curl_error($curl);
exit;
}
$success = json_decode($res, true)['success'] ?? null;
if (empty($success)) {
echo 'Your Turnstile Error';
// echo $res;
exit;
}else{
echo 'OK';
exit;
}
}
?>
<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Turnstile Test</title>
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async></script>
</head>
<body>
<p>Turnstile Test</p>
<form method="POST">
<input type="submit" value="送信" />
<div class="cf-turnstile" data-sitekey="<?php echo $okey; ?>"></div>
</form>
</body>
</html>
2023/12/8
--------------------------------