自作プラグイン/recaptcha3.inc.php
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
** recaptcha3.inc.php [#g81d06b9]
|RIGHT:100|LEFT:360|c
|~サマリ|Google reCAPTCHA v3 によるスパム対策|
|~リビジョン|1.1|
|~対応バージョン|1.5.3|
|~投稿者|[[M.Taniguchi]]|
|~投稿日|&new{2020-04-25 (土) 02:21:45};|
**概要 [#e3a7bff8]
Google reCAPTCHA v3 によるスパム対策プラグイン。
ページ編集・コメント投稿・ファイル添付など、PukiWiki標準...
reCAPTCHA v3 は不審な送信者を学習により自動判定する不可視...
追加ファイルはこのプラグインコードだけ。PukiWiki本体の変...
が、そのための副作用として、JavaScriptを活用する高度な編...
PukiWikiをほぼ素のままで運用し、手軽にスパム対策したいか...
バージョン1.1より、禁止語句によるスパム判定を追加しました...
PukiWiki 1.5.3/PHP 7.4/UTF-8/主要モダンブラウザーで動...
**導入手順 [#h76b3c6e]
以下の手順に沿ってPukiWikiに導入してください。
+本プラグイン recaptcha3.inc.php を plugin ディレクトリ...
+Google reCAPTCHA サイト(https: //www.google.com/recaptc...
+スキンファイル skin/pukiwiki.skin.php のほぼ末尾、「</bo...
<?php if (exist_plugin_convert('recaptcha3')) echo do_pl...
+ライブラリファイル lib/plugin.php の「function do_plugin...
if (exist_plugin_action('recaptcha3') && ($__v = call_us...
**コード [#h037a1e3]
recaptcha3.inc.php~
(下記のコードをコピーして、plugin ディレクトリに recaptc...
<?php
/**
PukiWiki - Yet another WikiWikiWeb clone.
recaptcha3.inc.php, v1.1 2020 M.Taniguchi
License: GPL v3 or (at your option) any later version
Google reCAPTCHA v3 によるスパム対策プラグイン。
ページ編集・コメント投稿・ファイル添付など、PukiWiki標準...
reCAPTCHA v3 は不審な送信者を学習により自動判定する不可...
追加ファイルはこのプラグインだけ。PukiWiki本体の変更も最...
が、そのための副作用として、JavaScriptを活用する高度な編...
PukiWikiをほぼ素のままで運用し、手軽にスパム対策したいか...
バージョン1.10より、禁止語句によるスパム判定を追加しまし...
【導入手順】
以下の手順に沿ってシステムに導入してください。
1) Google reCAPTCHA サイトでウィキのドメインを「reCAPTCH...
2) ファイル skin/pukiwiki.skin.php のほぼ末尾、「</body>...
<?php if (exist_plugin_convert('recaptcha3')) echo do...
3) ファイル lib/plugin.php の「function do_plugin_action...
if (exist_plugin_action('recaptcha3') && ($__v = call...
【ご注意】
・PukiWiki 1.5.3/PHP 7.4/UTF-8/主要モダンブラウザーで...
・標準プラグイン以外の動作確認はしていません。サードパー...
・JavaScriptが有効でないと動作しません。
・サーバーからreCAPTCHA APIへのアクセスにcURLを使用しま...
・reCAPTCHA v3 について詳しくはGoogleのreCAPTCHAサイトを...
*/
/////////////////////////////////////////////////
// スパム対策プラグイン設定(recaptcha3.inc.php)
if (!defined('PLUGIN_RECAPTCHA3_SITE_KEY')) define(...
if (!defined('PLUGIN_RECAPTCHA3_SECRET_KEY')) define(...
if (!defined('PLUGIN_RECAPTCHA3_SITE_KEY')) define(...
if (!defined('PLUGIN_RECAPTCHA3_HIDE_BADGE')) define(...
if (!defined('PLUGIN_RECAPTCHA3_API_TIMEOUT')) define(...
if (!defined('PLUGIN_RECAPTCHA3_CENSORSHIP')) define(...
if (!defined('PLUGIN_RECAPTCHA3_CHECK_REFERER')) define(...
if (!defined('PLUGIN_RECAPTCHA3_ERR_STATUS')) define(...
if (!defined('PLUGIN_RECAPTCHA3_DISABLED')) define(...
// プラグイン出力
function plugin_recaptcha3_convert() {
// 本プラグインが無効か書き込み禁止なら何もしない
if (PLUGIN_RECAPTCHA3_DISABLED || ((!PLUGIN_RECAPTCHA3_...
// 二重起動禁止
static $included = false;
if ($included) return '';
$included = true;
$enabled = (PLUGIN_RECAPTCHA3_SITE_KEY && PLUGIN_RECAPT...
// reCAPTCHAバッジ非表示なら代替文言設定
$protocol = 'https:';
$badge = (!PLUGIN_RECAPTCHA3_HIDE_BADGE || !$enabled)? ...
// JavaScript
$siteKey = PLUGIN_RECAPTCHA3_SITE_KEY;
$libUrl = '//www.google.com/recaptcha/api.js?render=' ....
$enabled = ($enabled)? 'true' : 'false';
$js = <<<EOT
<script>
'use strict';
window.addEventListener('DOMContentLoaded', function(){
new __PluginRecaptcha3__();
});
var __PluginRecaptcha3__ = function() {
const self = this;
this.timer = null;
this.libLoaded = false;
// 設定
this.update();
// DOMを監視し、もしページ内容が動的に変更されたら再設...
const observer = new MutationObserver(function(mutation...
if (observer) {
const target = document.getElementsByTagName('body')[0];
if (target) observer.observe(target, { childList: true...
}
};
// reCAPTCHAライブラリーロード
__PluginRecaptcha3__.prototype.loadLib = function() {
if (!this.libLoaded) {
this.libLoaded = true;
var scriptElement = document.createElement('script');
scriptElement.src = '${libUrl}';
scriptElement.setAttribute('defer', 'defer');
document.body.appendChild(scriptElement);
}
};
// 設定
__PluginRecaptcha3__.prototype.setup = function() {
const self = this;
// 全form要素を走査
var elements = document.getElementsByTagName('form');
for (var i = elements.length - 1; i >= 0; --i) {
var form = elements[i];
// form内全submitボタンを走査しクリックイベントを設定
var eles = form.querySelectorAll('input[type="submit"]...
if (eles.length > 0) {
for (var j = eles.length - 1; j >= 0; --j) eles[j].ad...
// こちらのタイミングで送信するため、既定の送信イベン...
form.addEventListener('submit', self.stopSubmit, fals...
// reCAPTCHAライブラリーロード
self.loadLib();
}
}
};
// 再設定
__PluginRecaptcha3__.prototype.update = function() {
const self = this;
if (this.timer) clearTimeout(this.timer);
this.timer = setTimeout(function() { self.setup(); self...
};
// 送信防止
__PluginRecaptcha3__.prototype.stopSubmit = function(e) {
e.preventDefault();
e.stopPropagation();
return false;
};
// クリック時送信処理
__PluginRecaptcha3__.prototype.submit = function(e) {
var form;
if (this.closest) {
form = this.closest('form');
} else {
for (form = this.parentNode; form; form = form.parentN...
}
// クリックされたsubmitボタンのname,value属性をhiddenに...
if (form) {
var nameEle = form.querySelector('.__plugin_recaptcha3...
var name = this.getAttribute('name');
if (name) {
var value = this.getAttribute('value');
if (!nameEle) {
form.insertAdjacentHTML('beforeend', '<input type="h...
} else {
nameEle.setAttribute('name', name);
nameEle.setAttribute('value', value);
}
} else
if (nameEle) {
if (nameEle.remove) nameEle.remove();
else nameEle.parentNode.removeChild(nameEle);
}
if (${enabled}) {
// reCAPTCHAトークン取得
grecaptcha.ready(function() {
try {
grecaptcha.execute('${siteKey}').then(function(toke...
// 送信パラメーターにトークンを追加
var ele = form.querySelector('input[name="__plugin...
if (!ele) {
form.insertAdjacentHTML('beforeend', '<input type...
} else {
ele.setAttribute('value', token);
}
// フォーム送信
form.submit();
});
} catch(e) {}
});
} else {
// reCAPTCHA無効なら即フォーム送信
form.submit();
}
}
return false;
};
</script>
EOT;
return $badge . $js;
}
// 受信リクエスト確認
function plugin_recaptcha3_action() {
$result = ''; // 送信者判定結果(許可:空, 拒否:エラー...
// 機能有効かつPOSTメソッド?
if (!PLUGIN_RECAPTCHA3_DISABLED && ((PLUGIN_RECAPTCHA3_...
/* 【対象プラグイン設定テーブル】
reCAPTCHA判定の対象とするプラグインを列挙する配列。
name … プラグイン名
censor … 検閲対象パラメーター名
vars … 併送パラメーター名
*/
$targetPlugins = array(
array('name' => 'article', 'censor' => 'msg'),
array('name' => 'attach'),
array('name' => 'bugtrack', 'censor' => 'body'),
array('name' => 'comment', 'censor' => 'msg'),
array('name' => 'edit', 'censor' => 'msg', 'vars'...
array('name' => 'freeze'),
array('name' => 'insert', 'censor' => 'msg'),
array('name' => 'loginform'),
array('name' => 'memo', 'censor' => 'msg'),
array('name' => 'pcomment', 'censor' => 'msg'),
array('name' => 'rename'),
array('name' => 'template'),
array('name' => 'tracker', 'censor' => 'Messages'),
array('name' => 'unfreeze'),
array('name' => 'vote'),
);
global $vars;
list($name) = func_get_args();
$enabled = (PLUGIN_RECAPTCHA3_SITE_KEY && PLUGIN_RECAP...
foreach ($targetPlugins as $target) {
if ($target['name'] != $name) continue; // プラグイン...
if (!isset($target['vars']) || isset($vars[$target['v...
if ($enabled && (!isset($vars['__plugin_recaptcha3__...
// トークンのない不正要求なら送信者を拒否
$result = 'Rejected by Google reCAPTCHA v3';
} else
if (PLUGIN_RECAPTCHA3_CHECK_REFERER && strpos($_SERV...
// 自サイト以外からのアクセスを拒否
$result = 'Deny access';
} else {
// 検閲対象パラメーターあり?
if (PLUGIN_RECAPTCHA3_CENSORSHIP && isset($target['...
// 投稿禁止語句が含まれていたら受信拒否
if (preg_match(PLUGIN_RECAPTCHA3_CENSORSHIP, $vars...
$result = 'Forbidden word detected';
break;
}
}
// reCAPTCHA API呼び出し
if ($enabled) {
$ch = curl_init('https:'.'//www.google.com/recaptc...
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_qu...
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
if (PLUGIN_RECAPTCHA3_API_TIMEOUT > 0) curl_setopt...
$data = json_decode(curl_exec($ch));
curl_close($ch);
// スコアが閾値未満なら送信者を拒否
if (!$data->success || $data->score < PLUGIN_RECAP...
}
}
break;
}
}
// エラー用のHTTPステータスコードを設定
if ($result && PLUGIN_RECAPTCHA3_ERR_STATUS) http_resp...
}
return array('msg' => 'recaptcha3', 'body' => $result);
}
**ご注意 [#x8fb80a9]
-標準プラグイン以外の動作確認はしていません。サードパーテ...
-JavaScriptが有効でないと動作しません。
-サーバーからreCAPTCHA APIへのアクセスにcURLを使用します。
-reCAPTCHA v3 について詳しくはGoogleのreCAPTCHAサイトをご...
**詳細 [#pe9ff758]
***動作設定 [#ncf0cdef]
コード内の下記の定数で動作を制御することができます。
|~定数名|~値|~既定値|~意味|
|PLUGIN_RECAPTCHA3_SITE_KEY|CENTER:文字列||Google reCAPTC...
|PLUGIN_RECAPTCHA3_SECRET_KEY|CENTER:文字列||Google reCAP...
|PLUGIN_RECAPTCHA3_SCORE_THRESHOLD|CENTER:0.0~1.0|CENTER...
|PLUGIN_RECAPTCHA3_HIDE_BADGE|CENTER:0 or 1|CENTER:1|reCA...
|PLUGIN_RECAPTCHA3_API_TIMEOUT|CENTER:任意の数値|CENTER:0...
|PLUGIN_RECAPTCHA3_CENSORSHIP|CENTER:文字列|CENTER:|投稿...
|PLUGIN_RECAPTCHA3_CHECK_REFERER|CENTER:0 or 1|CENTER:0|1...
|PLUGIN_RECAPTCHA3_ERR_STATUS|CENTER:HTTPステータスコード...
|PLUGIN_RECAPTCHA3_DISABLED|CENTER:0 or 1|CENTER:0|1なら...
***スパム拒否の仕組み [#m18c40ac]
+ブラウザー側において、JavaScriptによってページ内のすべて...
+サーバー側において、受信したリクエストがPOSTメソッドかつ...
++パラメーターにreCAPTCHAトークンが含まれなければ、不正ア...
++reCAPTCHA APIにトークンを送信し、応答スコアが閾値未満な...
++投稿禁止語句が設定されており、かつテキスト投稿を伴うプ...
***高度な設定:対象プラグインの追加 [#k29ab2be]
本プラグインはデフォルトで、PukiWikiに標準添付の編集系プ...
article, attach, bugtrack, comment, edit, freeze, insert,...
スパムボットは標準プラグインを標的にすると考えられるため...
しかし、もし特定のサードパーティ製プラグインを標的として...
ただし上で述べた通り、プラグインの編集・投稿機能がPOSTメ...
**動作確認 [#mecf0290]
本プラグインが正しく導入されていれば、ページ末尾に「This ...
この状態でページ編集やコメント投稿ができていればOKです。
逆に拒否される場合を確認したければ、シークレットキーの値...
その状態でページ編集などを試みると、「Rejected by Google ...
スパムに対する正しいテストケースではありませんが、少なく...
実際のスパム攻撃については、Google reCAPTCHAサイトの管理...
なお、本プラグインが正しく導入されていても、古いブラウザ...
編集ができないだけで、閲覧には支障ないと思います。
閲覧専用(PKWK_READONLY が 1)のウィキにおいては、本プラ...
**ライセンス [#y9d827c1]
GPL v3
**改版履歴 [#history]
-バージョン1.0
--初版
-バージョン1.1
--投稿禁止語句判定を追加
--リファラー判定を追加
--form要素submitボタンのないページではreCAPTCHAライブラリ...
--拒否時に返すHTTPステータスコードの設定を追加
--コマンド呼び出しの返り値を変更。伴い、lib/plugin.phpへ...
終了行:
** recaptcha3.inc.php [#g81d06b9]
|RIGHT:100|LEFT:360|c
|~サマリ|Google reCAPTCHA v3 によるスパム対策|
|~リビジョン|1.1|
|~対応バージョン|1.5.3|
|~投稿者|[[M.Taniguchi]]|
|~投稿日|&new{2020-04-25 (土) 02:21:45};|
**概要 [#e3a7bff8]
Google reCAPTCHA v3 によるスパム対策プラグイン。
ページ編集・コメント投稿・ファイル添付など、PukiWiki標準...
reCAPTCHA v3 は不審な送信者を学習により自動判定する不可視...
追加ファイルはこのプラグインコードだけ。PukiWiki本体の変...
が、そのための副作用として、JavaScriptを活用する高度な編...
PukiWikiをほぼ素のままで運用し、手軽にスパム対策したいか...
バージョン1.1より、禁止語句によるスパム判定を追加しました...
PukiWiki 1.5.3/PHP 7.4/UTF-8/主要モダンブラウザーで動...
**導入手順 [#h76b3c6e]
以下の手順に沿ってPukiWikiに導入してください。
+本プラグイン recaptcha3.inc.php を plugin ディレクトリ...
+Google reCAPTCHA サイト(https: //www.google.com/recaptc...
+スキンファイル skin/pukiwiki.skin.php のほぼ末尾、「</bo...
<?php if (exist_plugin_convert('recaptcha3')) echo do_pl...
+ライブラリファイル lib/plugin.php の「function do_plugin...
if (exist_plugin_action('recaptcha3') && ($__v = call_us...
**コード [#h037a1e3]
recaptcha3.inc.php~
(下記のコードをコピーして、plugin ディレクトリに recaptc...
<?php
/**
PukiWiki - Yet another WikiWikiWeb clone.
recaptcha3.inc.php, v1.1 2020 M.Taniguchi
License: GPL v3 or (at your option) any later version
Google reCAPTCHA v3 によるスパム対策プラグイン。
ページ編集・コメント投稿・ファイル添付など、PukiWiki標準...
reCAPTCHA v3 は不審な送信者を学習により自動判定する不可...
追加ファイルはこのプラグインだけ。PukiWiki本体の変更も最...
が、そのための副作用として、JavaScriptを活用する高度な編...
PukiWikiをほぼ素のままで運用し、手軽にスパム対策したいか...
バージョン1.10より、禁止語句によるスパム判定を追加しまし...
【導入手順】
以下の手順に沿ってシステムに導入してください。
1) Google reCAPTCHA サイトでウィキのドメインを「reCAPTCH...
2) ファイル skin/pukiwiki.skin.php のほぼ末尾、「</body>...
<?php if (exist_plugin_convert('recaptcha3')) echo do...
3) ファイル lib/plugin.php の「function do_plugin_action...
if (exist_plugin_action('recaptcha3') && ($__v = call...
【ご注意】
・PukiWiki 1.5.3/PHP 7.4/UTF-8/主要モダンブラウザーで...
・標準プラグイン以外の動作確認はしていません。サードパー...
・JavaScriptが有効でないと動作しません。
・サーバーからreCAPTCHA APIへのアクセスにcURLを使用しま...
・reCAPTCHA v3 について詳しくはGoogleのreCAPTCHAサイトを...
*/
/////////////////////////////////////////////////
// スパム対策プラグイン設定(recaptcha3.inc.php)
if (!defined('PLUGIN_RECAPTCHA3_SITE_KEY')) define(...
if (!defined('PLUGIN_RECAPTCHA3_SECRET_KEY')) define(...
if (!defined('PLUGIN_RECAPTCHA3_SITE_KEY')) define(...
if (!defined('PLUGIN_RECAPTCHA3_HIDE_BADGE')) define(...
if (!defined('PLUGIN_RECAPTCHA3_API_TIMEOUT')) define(...
if (!defined('PLUGIN_RECAPTCHA3_CENSORSHIP')) define(...
if (!defined('PLUGIN_RECAPTCHA3_CHECK_REFERER')) define(...
if (!defined('PLUGIN_RECAPTCHA3_ERR_STATUS')) define(...
if (!defined('PLUGIN_RECAPTCHA3_DISABLED')) define(...
// プラグイン出力
function plugin_recaptcha3_convert() {
// 本プラグインが無効か書き込み禁止なら何もしない
if (PLUGIN_RECAPTCHA3_DISABLED || ((!PLUGIN_RECAPTCHA3_...
// 二重起動禁止
static $included = false;
if ($included) return '';
$included = true;
$enabled = (PLUGIN_RECAPTCHA3_SITE_KEY && PLUGIN_RECAPT...
// reCAPTCHAバッジ非表示なら代替文言設定
$protocol = 'https:';
$badge = (!PLUGIN_RECAPTCHA3_HIDE_BADGE || !$enabled)? ...
// JavaScript
$siteKey = PLUGIN_RECAPTCHA3_SITE_KEY;
$libUrl = '//www.google.com/recaptcha/api.js?render=' ....
$enabled = ($enabled)? 'true' : 'false';
$js = <<<EOT
<script>
'use strict';
window.addEventListener('DOMContentLoaded', function(){
new __PluginRecaptcha3__();
});
var __PluginRecaptcha3__ = function() {
const self = this;
this.timer = null;
this.libLoaded = false;
// 設定
this.update();
// DOMを監視し、もしページ内容が動的に変更されたら再設...
const observer = new MutationObserver(function(mutation...
if (observer) {
const target = document.getElementsByTagName('body')[0];
if (target) observer.observe(target, { childList: true...
}
};
// reCAPTCHAライブラリーロード
__PluginRecaptcha3__.prototype.loadLib = function() {
if (!this.libLoaded) {
this.libLoaded = true;
var scriptElement = document.createElement('script');
scriptElement.src = '${libUrl}';
scriptElement.setAttribute('defer', 'defer');
document.body.appendChild(scriptElement);
}
};
// 設定
__PluginRecaptcha3__.prototype.setup = function() {
const self = this;
// 全form要素を走査
var elements = document.getElementsByTagName('form');
for (var i = elements.length - 1; i >= 0; --i) {
var form = elements[i];
// form内全submitボタンを走査しクリックイベントを設定
var eles = form.querySelectorAll('input[type="submit"]...
if (eles.length > 0) {
for (var j = eles.length - 1; j >= 0; --j) eles[j].ad...
// こちらのタイミングで送信するため、既定の送信イベン...
form.addEventListener('submit', self.stopSubmit, fals...
// reCAPTCHAライブラリーロード
self.loadLib();
}
}
};
// 再設定
__PluginRecaptcha3__.prototype.update = function() {
const self = this;
if (this.timer) clearTimeout(this.timer);
this.timer = setTimeout(function() { self.setup(); self...
};
// 送信防止
__PluginRecaptcha3__.prototype.stopSubmit = function(e) {
e.preventDefault();
e.stopPropagation();
return false;
};
// クリック時送信処理
__PluginRecaptcha3__.prototype.submit = function(e) {
var form;
if (this.closest) {
form = this.closest('form');
} else {
for (form = this.parentNode; form; form = form.parentN...
}
// クリックされたsubmitボタンのname,value属性をhiddenに...
if (form) {
var nameEle = form.querySelector('.__plugin_recaptcha3...
var name = this.getAttribute('name');
if (name) {
var value = this.getAttribute('value');
if (!nameEle) {
form.insertAdjacentHTML('beforeend', '<input type="h...
} else {
nameEle.setAttribute('name', name);
nameEle.setAttribute('value', value);
}
} else
if (nameEle) {
if (nameEle.remove) nameEle.remove();
else nameEle.parentNode.removeChild(nameEle);
}
if (${enabled}) {
// reCAPTCHAトークン取得
grecaptcha.ready(function() {
try {
grecaptcha.execute('${siteKey}').then(function(toke...
// 送信パラメーターにトークンを追加
var ele = form.querySelector('input[name="__plugin...
if (!ele) {
form.insertAdjacentHTML('beforeend', '<input type...
} else {
ele.setAttribute('value', token);
}
// フォーム送信
form.submit();
});
} catch(e) {}
});
} else {
// reCAPTCHA無効なら即フォーム送信
form.submit();
}
}
return false;
};
</script>
EOT;
return $badge . $js;
}
// 受信リクエスト確認
function plugin_recaptcha3_action() {
$result = ''; // 送信者判定結果(許可:空, 拒否:エラー...
// 機能有効かつPOSTメソッド?
if (!PLUGIN_RECAPTCHA3_DISABLED && ((PLUGIN_RECAPTCHA3_...
/* 【対象プラグイン設定テーブル】
reCAPTCHA判定の対象とするプラグインを列挙する配列。
name … プラグイン名
censor … 検閲対象パラメーター名
vars … 併送パラメーター名
*/
$targetPlugins = array(
array('name' => 'article', 'censor' => 'msg'),
array('name' => 'attach'),
array('name' => 'bugtrack', 'censor' => 'body'),
array('name' => 'comment', 'censor' => 'msg'),
array('name' => 'edit', 'censor' => 'msg', 'vars'...
array('name' => 'freeze'),
array('name' => 'insert', 'censor' => 'msg'),
array('name' => 'loginform'),
array('name' => 'memo', 'censor' => 'msg'),
array('name' => 'pcomment', 'censor' => 'msg'),
array('name' => 'rename'),
array('name' => 'template'),
array('name' => 'tracker', 'censor' => 'Messages'),
array('name' => 'unfreeze'),
array('name' => 'vote'),
);
global $vars;
list($name) = func_get_args();
$enabled = (PLUGIN_RECAPTCHA3_SITE_KEY && PLUGIN_RECAP...
foreach ($targetPlugins as $target) {
if ($target['name'] != $name) continue; // プラグイン...
if (!isset($target['vars']) || isset($vars[$target['v...
if ($enabled && (!isset($vars['__plugin_recaptcha3__...
// トークンのない不正要求なら送信者を拒否
$result = 'Rejected by Google reCAPTCHA v3';
} else
if (PLUGIN_RECAPTCHA3_CHECK_REFERER && strpos($_SERV...
// 自サイト以外からのアクセスを拒否
$result = 'Deny access';
} else {
// 検閲対象パラメーターあり?
if (PLUGIN_RECAPTCHA3_CENSORSHIP && isset($target['...
// 投稿禁止語句が含まれていたら受信拒否
if (preg_match(PLUGIN_RECAPTCHA3_CENSORSHIP, $vars...
$result = 'Forbidden word detected';
break;
}
}
// reCAPTCHA API呼び出し
if ($enabled) {
$ch = curl_init('https:'.'//www.google.com/recaptc...
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_qu...
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
if (PLUGIN_RECAPTCHA3_API_TIMEOUT > 0) curl_setopt...
$data = json_decode(curl_exec($ch));
curl_close($ch);
// スコアが閾値未満なら送信者を拒否
if (!$data->success || $data->score < PLUGIN_RECAP...
}
}
break;
}
}
// エラー用のHTTPステータスコードを設定
if ($result && PLUGIN_RECAPTCHA3_ERR_STATUS) http_resp...
}
return array('msg' => 'recaptcha3', 'body' => $result);
}
**ご注意 [#x8fb80a9]
-標準プラグイン以外の動作確認はしていません。サードパーテ...
-JavaScriptが有効でないと動作しません。
-サーバーからreCAPTCHA APIへのアクセスにcURLを使用します。
-reCAPTCHA v3 について詳しくはGoogleのreCAPTCHAサイトをご...
**詳細 [#pe9ff758]
***動作設定 [#ncf0cdef]
コード内の下記の定数で動作を制御することができます。
|~定数名|~値|~既定値|~意味|
|PLUGIN_RECAPTCHA3_SITE_KEY|CENTER:文字列||Google reCAPTC...
|PLUGIN_RECAPTCHA3_SECRET_KEY|CENTER:文字列||Google reCAP...
|PLUGIN_RECAPTCHA3_SCORE_THRESHOLD|CENTER:0.0~1.0|CENTER...
|PLUGIN_RECAPTCHA3_HIDE_BADGE|CENTER:0 or 1|CENTER:1|reCA...
|PLUGIN_RECAPTCHA3_API_TIMEOUT|CENTER:任意の数値|CENTER:0...
|PLUGIN_RECAPTCHA3_CENSORSHIP|CENTER:文字列|CENTER:|投稿...
|PLUGIN_RECAPTCHA3_CHECK_REFERER|CENTER:0 or 1|CENTER:0|1...
|PLUGIN_RECAPTCHA3_ERR_STATUS|CENTER:HTTPステータスコード...
|PLUGIN_RECAPTCHA3_DISABLED|CENTER:0 or 1|CENTER:0|1なら...
***スパム拒否の仕組み [#m18c40ac]
+ブラウザー側において、JavaScriptによってページ内のすべて...
+サーバー側において、受信したリクエストがPOSTメソッドかつ...
++パラメーターにreCAPTCHAトークンが含まれなければ、不正ア...
++reCAPTCHA APIにトークンを送信し、応答スコアが閾値未満な...
++投稿禁止語句が設定されており、かつテキスト投稿を伴うプ...
***高度な設定:対象プラグインの追加 [#k29ab2be]
本プラグインはデフォルトで、PukiWikiに標準添付の編集系プ...
article, attach, bugtrack, comment, edit, freeze, insert,...
スパムボットは標準プラグインを標的にすると考えられるため...
しかし、もし特定のサードパーティ製プラグインを標的として...
ただし上で述べた通り、プラグインの編集・投稿機能がPOSTメ...
**動作確認 [#mecf0290]
本プラグインが正しく導入されていれば、ページ末尾に「This ...
この状態でページ編集やコメント投稿ができていればOKです。
逆に拒否される場合を確認したければ、シークレットキーの値...
その状態でページ編集などを試みると、「Rejected by Google ...
スパムに対する正しいテストケースではありませんが、少なく...
実際のスパム攻撃については、Google reCAPTCHAサイトの管理...
なお、本プラグインが正しく導入されていても、古いブラウザ...
編集ができないだけで、閲覧には支障ないと思います。
閲覧専用(PKWK_READONLY が 1)のウィキにおいては、本プラ...
**ライセンス [#y9d827c1]
GPL v3
**改版履歴 [#history]
-バージョン1.0
--初版
-バージョン1.1
--投稿禁止語句判定を追加
--リファラー判定を追加
--form要素submitボタンのないページではreCAPTCHAライブラリ...
--拒否時に返すHTTPステータスコードの設定を追加
--コマンド呼び出しの返り値を変更。伴い、lib/plugin.phpへ...
ページ名: