前提
メールフォームプロCGIを使用していますが、Google reCAPTCHA v3のサーバー側の設定方法で行き詰まっています。
※当方、html・cssが分かる程度の知識です。
実現したいこと
- サーバー認証処理をメールプログラムに手を入れずに実装
- スコアの値が一定値以下の場合メールを送信させない
試したこと1
・過去の質問に書かれていた方法を試す
・html側ではv3のアイコンが表示されており、Google reCAPTCHA側でもリクエスト数などが確認できる状態
・下記の記述をmailformpro/config.cgiの1行目に入れてみる
※階層
folder/address/index.html ←お問い合わせフォーム
folder/cgi-bin/mailformpro/config.cgi ←サーバー側の設定を行ったファイル
#!/usr/bin/perl use strict; use CGI; use LWP::UserAgent; use JSON::Parse; my $secret_key = '[*************************]'; my $url = 'https://www.google.com/recaptcha/api/siteverify'; my $cgi = CGI->new(); my $ua = LWP::UserAgent->new(); my $recaptcha_response = $cgi->param('g-recaptcha-response'); my $remote_ip = $ENV{REMOTE_ADDR}; my $response = $ua->post( $url, { remoteip => $remote_ip, response => $recaptcha_response, secret => $secret_key, }, ); if ( $response->is_success() ) { my $json = $response->decoded_content(); my $out = parse_json($json); if ( $out->{success} ) { # 正常処理 } }
試したこと1_エラーメッセージ
上記の記述を入れてメールの送信を行うと、エラーメッセージが出ました
Software error: Can't locate JSON/Parse.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at ./config.cgi line 6. BEGIN failed--compilation aborted at ./config.cgi line 6. For help, please send mail to the webmaster (root@localhost), giving this error message and the time and date of the error. Software error: [Tue Sep 28 15:18:27 2021] mailformpro.cgi: Can't locate JSON/Parse.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at ./config.cgi line 6. [Tue Sep 28 15:18:27 2021] mailformpro.cgi: BEGIN failed--compilation aborted at ./config.cgi line 6. Compilation failed in require at /var/www/html/*********/folder/cgi-bin/mailformpro/mailformpro.cgi line 6. For help, please send mail to the webmaster (root@localhost), giving this error message and the time and date of the error.
以下、DeepL 翻訳ツールで翻訳した文です。
ソフトウェアエラーです。
Can't locate JSON/Parse.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 ...) at ./config.cgi line 6.
BEGIN failed--コンパイルは./config.cgiの6行目で中断されました。
ヘルプが必要な場合は、このエラーメッセージとエラーが発生した日時をウェブマスター(root@localhost)にメールで送ってください。
ソフトウェアのエラーです。
[Tue Sep 28 15:18:27 2021] mailformpro.cgi: Can't locate JSON/Parse.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at ./config.cgi 6行目です。
[Tue Sep 28 15:18:27 2021] mailformpro.cgi: BEGIN failed--compilation aborted at ./config.cgi line 6.
var/www/html/*********/folder/cgi-bin/mailformpro/mailformpro.cgiの6行目のrequireでコンパイルが失敗しました。
助けを求める場合は、このエラーメッセージとエラーが発生した日時をウェブマスター(root@localhost)にメールで送ってください。
「JSON::Parse;」というモジュールが無くてエラーが起きているようですが、モジュールを入れる方法を調べてもコマンドやビルド、パッケージなどの説明がわからず、この方法で導入するのを断念しました…。
試したこと2
メールプログラムを編集せずに設定できないか探したところ、以下の記事を見つけました。
・フォームにreCAPTCHA v3を導入する手順 – Ajax版
この方法なら実装できるのではと思い、試してみました。
※階層
folder/address/index.html ←お問い合わせフォーム
folder/address/recaptchaTokenCheck.php ←phpファイル
folder/js/recaptcha_token_check.js ←JavaScriptファイル
index.html(一部メールフォームプロ用に改編しています)
<script src="https://www.google.com/recaptcha/api.js?render={サイトキー}"></script> <script src="https://code.jquery.com/jquery-1.12.4.min.js" integrity="sha256-ZosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ=" crossorigin="anonymous"></script> <script src="../js/recaptcha_token_check.js"></script> <form id="mailformpro" action="../cgi-bin/mailformpro/mailformpro.cgi" method="post"> ... <button id="submit_button" type="submit" value="確認画面">入力内容の確認画面へ</button> </form>
recaptcha_token_check.js(一部メールフォームプロ用に改編しています)
$(function(){ $('#mailformpro #submit_button').click(function(e){ // recaptchaスパムチェック $.when(recaptchaTokenCheck(e)).done(function(result){ if(result !== 'OK') { return false; } else { if(!$('#mailformpro')[0].reportValidity()) { return false; } $('#mailformpro').submit(); } }); }); function recaptchaTokenCheck(e) { var siteKey = 'サイトキー'; var deferred = new $.Deferred(); e.preventDefault(); grecaptcha.ready(function() { grecaptcha.execute(siteKey, {action: 'submit'}).then(function(token) { var result = 'NG'; $.ajax({ type: 'POST', url: '../address/recaptchaTokenCheck.php', data: {recaptchaToken: token}, dataType: 'text' }).done(function(res) { if(res === 'OK') { result = 'OK'; } }).fail(function(){ console.log('error!!'); }).always(function(){ deferred.resolve(result); }); }); }); return deferred.promise(); } });
recaptchaTokenCheck.php
<?php header("Content-type: text/plain; charset=UTF-8"); if($_SERVER['REQUEST_METHOD'] == 'POST') { $secretKey = 'シークレットキー'; $url = 'https://www.google.com/recaptcha/api/siteverify'; $verifyResult = file_get_contents($url.'?secret='.$secretKey.'&response='.$_POST['recaptchaToken']); $verifyResult = json_decode($verifyResult); if($verifyResult->success == false) { // スパム判定されたとき echo "NG"; } else { echo "OK"; } }
試したこと2_不明な点
上記の設定でメール送信を行ったところ、特にエラーもなくメールを送信できます。
しかし、設置したJavaScriptとphpが正しくreCAPCHAとやりとりできているのか確かめる方法がわかりません。
Googleの検証を使い確認してもそれらしいエラーなどは見つけられませんでした。
また、「スコアの値が一定値以下の場合メールを送信させない」という方法もわからないままです。
調べ方・確認のやり方等、ご教示の程、宜しくお願い致します。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/05 04:32