Nucleus(JP)フォーラム

NucleusCMS日本語版ユーザーのためのサポートフォーラムです。疑問が生じたらまずは記事検索をご利用ください。

ログインしていません。

#1 2007-01-19 01:06:41

shizuki
Administrator
From: 西播磨
登録日: 2006-03-23
投稿: 900
ウェブサイト

Re: NP_RejectASCIIComment

実験的に日本語が含まれていないコメントやトラックバックがあったときにスパム判定するプラグイン作ってみました
コメントの場合は『処理しました』とログに残るだけでコメント自体はデータベースに登録されません
トラックバックの場合はスパム判定だけつけてそのまま返します
コメントもどこかテーブル作って残した方がいいかとも思ったんですが、英語スパムいちいちチェックするのがいやになったんでログだけです

<?php

/**
  * REJECT 'ONLY ASCII' COMMENT AND TRACKBACK PLUGIN FOR NucleusCMS
  * PHP versions 4 and 5
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
  * as published by the Free Software Foundation; either version 2
  * of the License, or (at your option) any later version.
  * (see nucleus/documentation/index.html#license for more info)
  * 
  * 
  * @author     shizuki
  * @copyright  2006-2007 shizuki
  * @license    http://www.gnu.org/licenses/gpl.txt
  *             GNU GENERAL PUBLIC LICENSE Version 2, June 1991
  * @version    0.3
  * @link       http://shizuki.kinezumi.net
  *
  * 0.3  Release version
  * 0.2  supports SpamCheck API 2
  *      supports NP_TrackBack
  * 0.1  initial
  *
  **/

class NP_RejectASCIIComment extends NucleusPlugin
{

	// name of plugin
	function getName()
	{
		$retData = 'Reject ASCII Comment and TrackBack';
		return $retData;
	}

	// author of plugin
	function getAuthor()
	{
		$retData = 'shizuki';
		return $retData;
	}

	// an URL to the plugin website
	function getURL()
	{
		$retData = 'http://shizuki.kinezumi.net';
		return $retData;
	}

	// version of the plugin
	function getVersion()
	{
		$retData = '0.3';
		return $retData;
	}

	// a description to be shown on the installed plugins listing
	function getDescription()
	{
		$retData = _REJECT_ASCII_DESCRIPTION;
		if (_CHARSET != 'UTF-8') {
			mb_convert_encoding($retData, _CHARSET, 'UTF-8');
		}
		return $retData;
	}

	function getEventList()
	{
		return array(
					 'SpamCheck',
					 'ValidateForm'
					);
	}

	function install()
	{
		$optionData = _REJECT_ASCII_OPTION;
		if (_CHARSET != 'UTF-8') {
			mb_convert_encoding($optionData, _CHARSET, 'UTF-8');
		}
		$this->createBlogOption('hook', $optionData, 'yesno', 'no');
	}

	function supportsFeature ($what)
	{
		switch ($what)
		{
			case 'SqlTablePrefix':
				return 1;
			default:
				return 0;
		}
	}

	function init()
	{
		global $admin;
		$langFile = $this->getDirectory() . 'japanese.php';
		if (file_exists($langFile)) {
			include_once($langFile);
		}
	}

	function event_SpamCheck(&$data)
	{
		global $DIR_PLUGINS, $member;

		$spamCheck = $data['spamcheck'];
		if ($spamCheck['result'] == TRUE) {
			return FALSE;
		}

		if ($member->isLoggedIn()) {
			return FALSE;
		}

		$type     = (!empty($spamCheck['type'])) ? $spamCheck['type'] : 'post';
		$encoding = $this->_detect_encoding($excerpt);
		switch ($type) {
			case 'comment':
				$checkData = $spamCheck['body'];
				$item_id   = intval($spamCheck['id']);
				break;
			case 'trackback':
				$checkData = $spamCheck['excerpt'] . $spamCheck['title'] . $spamCheck['blogname'];
				$item_id   = intval($spamCheck['id']);
				break;
			default:
		}
		$bid       = intval(getBlogIDFromItemID($item_id));
		$bname     = getBlogNameFromID($bid);
		$inque     = 'SELECT ititle as result FROM %s WHERE inumber = %d';
		$inque     = sprintf($inque, sql_table('item'), $item_id);
		$iname     = quickQuery($inque);
		$checkData = str_replace($bname, '', $checkData);
		$checkData = str_replace($iname, '', $checkData);
		$checkData = ereg_replace("\r|\n","",$checkData);
		$checkData = mb_convert_encoding($checkData, 'UTF-8', $encoding);
		if ($checkData && !preg_match('/[\x80-\xff]/', $checkData)) {
			$checkType = array(
							   'comment'   => _REJECT_ASCII_COMMENT,
							   'trackback' => _REJECT_ASCII_TRACKBACK,
							  );
			$info      = _REJECT_ASCII_INFOHEAD . $item_id . $checkType[$type];
			if (_CHARSET != 'UTF-8') {
				mb_convert_encoding($info, _CHARSET, 'UTF-8');
			}
			ACTIONLOG :: add(INFO, 'RejectASCII: ' . $info . shorten(strip_tags($checkData), 50, '...') . ')');
			$data['spamcheck']['result'] = TRUE;
			return TRUE;
		} else {
			return FALSE;
		}
	}

	function event_ValidateForm(&$data) {
		global $DIR_PLUGINS, $member;
		if (getNucleusVersion() >= '330' || $data['type'] != 'comment') {
			return TRUE;
		}
		$item_id = intval($data['comment']['itemid']);
		$blog_id = intval(getBlogIDFromItemID($item_id));

		if ($this->getBlogOption($blog_id, 'hook') == 'no') {
			return TRUE;
		}

		if ($member->isLoggedIn()) {
			return TRUE;
		}

		$spamcheck = array(
						   'type' => 'comment',
						   'id'   => $item_id,
						   'user' => $data['comment']['user'],
						   'body' => $data['comment']['body'],
						  );

		$param     = array(
						   'spamcheck' => &$spamcheck
						  );
		$this->event_SpamCheck($param);

		if (isset($spamcheck['result']) && $spamcheck['result'] == TRUE) {
			$data['error'] = -1;
			header("Location: " . createItemLink($item_id));
			exit();
		}

		return true;
	}

	function _detect_encoding($string)
	{
		if (preg_match("/;\s*charset=([^\n]+)/is", serverVar("CONTENT_TYPE"), $regs)) {
			$encoding =  strtoupper(trim($regs[1]));
		} else {
			$encoding = '';
		}
		$mbstrInput = strtolower(ini_get("mbstring.http_input"));
		if (!empty($encoding) && (mb_http_input('P') == '' || $mbstrInput == 'pass')) {
			return $encoding;
		} else {
			if (_CHARSET == 'UTF-8') {
				$encChars = 'UTF-8,EUC-JP,SJIS,ISO-8859-1,ASCII,JIS';
			} else {
				$encChars = 'EUC-JP,UTF-8,SJIS,ISO-8859-1,ASCII,JIS';
			}
			$encoding = mb_detect_encoding($string, $encChars);
		}
		return ($encoding) ? $encoding : 'ISO-8859-1';
	}

}

コピペして『NP_RejectASCIIComment.php』の名前で保存、管理画面からインストールするだけです
EUC版での動作報告とかあるとうれしいです

オフライン

#2 2007-01-19 19:01:57

藤咲
Administrator
From: 広島
登録日: 2003-11-17
投稿: 1,210
ウェブサイト

Re: NP_RejectASCIIComment

shizuki さんの発言:

コメントの場合は『処理しました』とログに残るだけでコメント自体はデータベースに登録されません
トラックバックの場合はスパム判定だけつけてそのまま返します
コメントもどこかテーブル作って残した方がいいかとも思ったんですが、英語スパムいちいちチェックするのがいやになったんでログだけです

私のところはコメントよりTBの方が多いんで、できたらトラックバックの場合もデータベース登録せずに削除するオプションが欲しいです。
BlackListのログ見て削除、TBも見て削除、を3日に一回はやらないと10ページ以上を見ないといけなくなる状況なので…。
正直、TBでブロックされて、それが英語だったら正しいかどうかは見ていないので…。
#見てもわからないから(^^;


藤咲
備忘録とかもろもろ
http://fjsk.tk/

オフライン

#3 2007-01-19 21:35:15

shizuki
Administrator
From: 西播磨
登録日: 2006-03-23
投稿: 900
ウェブサイト

Re: NP_RejectASCIIComment

TBを登録せずに削除する方法って、NP_TrackBack を改造しないでやろうとするとすごく強引になっちゃいますけどいいです?
一応オプションでオン・オフできるようにしました
一旦削除・再インストールでお願いします


Attachments:
zip NP_RejectASCIIComment.zip, Size: 2.74 KiB, Downloads: 267

オフライン

#4 2007-01-21 21:40:19

藤咲
Administrator
From: 広島
登録日: 2003-11-17
投稿: 1,210
ウェブサイト

Re: NP_RejectASCIIComment

shizuki さんの発言:

一応オプションでオン・オフできるようにしました
一旦削除・再インストールでお願いします

すみません、ダウンロードしてみたのですが、ソースをアップしている物と同じになってます… wink


藤咲
備忘録とかもろもろ
http://fjsk.tk/

オフライン

#5 2007-01-21 21:51:37

shizuki
Administrator
From: 西播磨
登録日: 2006-03-23
投稿: 900
ウェブサイト

Re: NP_RejectASCIIComment

あれれ?と思って確かめてみましたが、新しいのになってました
バージョン番号書き換え忘れてました、ごめんなさい
オプションは全てブログごとの設定になってますんで、ブログの設定画面からお願いします
トラックバックをスパム判定した時は、何もせずにexitです

オフライン

#6 2007-01-21 22:44:38

藤咲
Administrator
From: 広島
登録日: 2003-11-17
投稿: 1,210
ウェブサイト

Re: NP_RejectASCIIComment

shizuki さんの発言:

オプションは全てブログごとの設定になってますんで、ブログの設定画面からお願いします
トラックバックをスパム判定した時は、何もせずにexitです

失礼しました :oops:
ブログごとの設定なんですね。とりあえず2つのブログのうち、片方だけでONにして様子を見てみます。


藤咲
備忘録とかもろもろ
http://fjsk.tk/

オフライン

#7 2007-01-22 02:52:16

yama
Administrator
登録日: 2005-07-07
投稿: 1,269
ウェブサイト

Re: NP_RejectASCIIComment

EUC環境で実験中です。NP_BlackListが先に実行されるようにしています。
NP_BlackListがいい仕事してるおかげでNP_RejectASCIIComment の出番が
なかったのですが、さっき見たら100件近くのNP_BlackList処理から漏れた1件を
NP_RejectASCIICommentがナイスキャッチしてくれてました。よしよし。 8)

オフライン

#8 2007-01-26 17:08:58

藤咲
Administrator
From: 広島
登録日: 2003-11-17
投稿: 1,210
ウェブサイト

Re: NP_RejectASCIIComment

BlackListより先に実行されるようにし、思い切って全ブログで対象にしてみました。
5日間でTrackBackのスパム判定に残ってたのが1件、BlackListに捕らえれたのが5件。
あとはすべてNP_RejectASCIICommentにて弾けています。

かなり管理が楽になりました 8)
日本語しか想定していないブログではオススメです。


藤咲
備忘録とかもろもろ
http://fjsk.tk/

オフライン

Board footer