質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

1回答

4227閲覧

reCAPTCHA v3のサーバー認証処理について

rightbrain

総合スコア3

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2021/09/29 00:35

前提

メールフォームプロCGIを使用していますが、Google reCAPTCHA v3のサーバー側の設定方法で行き詰まっています。
※当方、html・cssが分かる程度の知識です。

実現したいこと

  1. サーバー認証処理をメールプログラムに手を入れずに実装
  2. スコアの値が一定値以下の場合メールを送信させない

試したこと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の検証を使い確認してもそれらしいエラーなどは見つけられませんでした。

また、「スコアの値が一定値以下の場合メールを送信させない」という方法もわからないままです。

調べ方・確認のやり方等、ご教示の程、宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

「JSON::Parse;」というモジュールが無くてエラーが起きているようですが、モジュールを入れる方法を調べてもコマンドやビルド、パッケージなどの説明がわからず、

単にJSON::Parseモジュールをインストールできれば解決できる問題であれば、ルートになって

# cpan JSON::Parse

でOKですよ。

投稿2021/09/29 10:52

KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rightbrain

2021/10/05 04:32

ご回答いただきありがとうございます。 「ルートになる」という状態を調べてみましたが、現在契約しているサーバーの都合やPCの関係上、モジュールを入れる方法が難しいことがわかりました。 私自身がコマンドプロンプト(ターミナル)等の扱いを理解しきれていないのも原因ですが…。 ご回答いただいたのに活かせず申し訳ございません。 他の方法で実現できないか、また探してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問