#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();
                     });
                 });
             });
         });
     });
 });


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS