- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2021-02-07T13:17:45+00:00","","")
* SPAM Filterについて [#y347e413]
基本的には[[ここ:https://dajya-ranger.com/sdm_downloads/spam-filter-library-pkwk153/]]のです。
導入にあたって、一部直しています。
**lib/spam_filter.php [#v2303f38]
reCAPTCHA v2 と reCAPTCHA v3 が逆になっている気がしたので、修正。
あとはAkismetを無効にしてブラックリストを有効に。
--- lib/spam_filter.php.orig 2021-02-07 21:44:46.000000000 +0900
+++ lib/spam_filter.php 2021-02-07 21:31:11.000000000 +0900
@@ -61,7 +61,8 @@
//define('SPAM_FILTER_COND', ''#useragent() or #filename() or #atag() or (#onlyeng() and #urlnum()) or #urlnsbl() or (#onlyeng() and #url() and #akismet()) or #recaptcha()');
// ※デフォルトでempty(空)入力チェック・Akismet・reCAPTCHAフィルタをセット
-define('SPAM_FILTER_COND', '#ngempty() or #akismet() or #recaptcha()');
+//define('SPAM_FILTER_COND', '#ngempty() or #akismet() or #recaptcha()');
+define('SPAM_FILTER_COND', '#ngempty() or #recaptcha() or #urlnsbl()');
//// CAPTCHAでのチェックをする条件を指定する
// ※SPAM_FILTER_CONDで明示的に「#recaptcha()」を指定することにより廃止
@@ -849,10 +850,10 @@
$secret_key = SPAM_FILTER_RECAPTCHA_SECRETKEY;
- if (SPAM_FILTER_RECAPTCHA_CHECK =='v2') {
+ if (SPAM_FILTER_RECAPTCHA_CHECK =='v3') {
// reCAPTCHA v2
$response=file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret={$secret_key}&response={$_POST['g-recaptcha-response']}");
- } elseif (SPAM_FILTER_RECAPTCHA_CHECK =='v3') {
+ } elseif (SPAM_FILTER_RECAPTCHA_CHECK =='v2') {
// reCAPTCHA v3
$response=file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret={$secret_key}&response={$_POST['recaptchaResponse']}");
} else {
**plugin/edit.inc.php [#db0ff2a7]
reCAPTCHA 関係のJS読み込みを追加。
--- plugin/edit.inc.php.orig 2021-02-07 22:05:14.000000000 +0900
+++ plugin/edit.inc.php 2021-02-07 22:05:43.000000000 +0900
@@ -13,6 +13,8 @@
{
global $vars, $_title_edit;
+ plugin_edit_insert_recaptcha_script_tag();
+
if (PKWK_READONLY) die_message('PKWK_READONLY prohibits editing');
// Create initial pages
@@ -288,3 +290,12 @@
init_autoalias_def_page();
}
}
+
+function plugin_edit_insert_recaptcha_script_tag() {
+ global $head_tags;
+
+ $head_tags[] = '<!-- reCAPTHA -->';
+ $head_tags[] = sprintf('<script src="https://www.google.com/recaptcha/api.js?render=%s"></script>', SPAM_FILTER_RECAPTCHA_SITEKEY);
+ $head_tags[] = sprintf('<script>const RECAPTCHA_SITEKEY = "%s"</script>', SPAM_FILTER_RECAPTCHA_SITEKEY);
+ $head_tags[] = '<script src="./skin/recaptcha.js"></script>';
+}
**skin/recaptcha.js [#p29a4fa9]
もうIE対応は必要ないよね、ということで雑に実装。
プレビューボタンと更新ボタンにイベントハンドラを設定して、
reCAPTCHA実行後に、hidden を追加して、submit。
なんだけど、これだとページ遷移時にダイアログが出てしまう。
そのうち、もうちょっと真面目な実装に切り替えるかもしれない。
window.addEventListener('DOMContentLoaded', function() {
function getForm(node) {
if (node === null || node.tagName === 'FORM') {
return node;
}
return getForm(node.parentNode);
}
['preview', 'write'].forEach(function(action) {
document.getElementsByName(action).forEach(function(element) {
const form = getForm(element);
const name = element.name;
const value = element.value;
element.addEventListener('click', function(e) {
e.preventDefault();
grecaptcha.ready(function() {
grecaptcha.execute(RECAPTCHA_SITEKEY, { action: 'submit' }).then(function(token) {
const submit = document.createElement('input');
submit.type = 'hidden';
submit.name = name;
submit.value = value;
form.appendChild(submit);
const tokenElement = document.createElement('input');
tokenElement.type = 'hidden';
tokenElement.name = 'g-recaptcha-response';
tokenElement.value = token;
form.appendChild(tokenElement);
window.onbeforeunload = null;
form.submit();
});
});
});
});
});
});