Throws SPAM Away - Version 2.3.3

Version Description

= 2.0 = IP IP

= 1.4 =

NG

= 1.3 =

= 1.2.1 =

= 1.2 = 1

= 1.1 =

= 1.0 =

Download this release

Release Info

Developer tsato
Plugin Icon wp plugin Throws SPAM Away
Version 2.3.3
Comparing to
See all releases

Code changes from version 2.2 to 2.3.3

Files changed (4) hide show
  1. hostbyip.php +45 -0
  2. readme.txt +30 -1
  3. throws_spam_away.php +684 -480
  4. uninstall.php +7 -3
hostbyip.php ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * ホスト検索
4
+ */
5
+ $spam_ip = htmlspecialchars($_GET['ip']);
6
+ ?>
7
+ <!DOCTYPE html>
8
+ <!--[if IE 8]>
9
+ <html xmlns="http://www.w3.org/1999/xhtml" class="ie8 wp-toolbar" lang="ja" prefix="og: http://ogp.me/ns#" >
10
+ <![endif]-->
11
+ <!--[if !(IE 8) ]><!-->
12
+ <html xmlns="http://www.w3.org/1999/xhtml" class="wp-toolbar" lang="ja" >
13
+ <!--<![endif]-->
14
+ <head>
15
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
16
+ <title>Throws SPAM Away | Hostbyip[<?php echo htmlspecialchars($_GET['ip']); ?>]</title>
17
+ <script type="text/javascript">
18
+ window.onblur=function(){
19
+ window.close();
20
+ }
21
+ </script>
22
+ </head>
23
+ <body>
24
+ <div style="textalign: center;">
25
+ <?php
26
+ $spam_host = gethostbyaddr(htmlspecialchars($spam_ip));
27
+ if ($spam_host != $spam_ip) {
28
+ ?>
29
+ 特定のホスト情報が見つかりました。<br />
30
+ ↓↓↓<br />
31
+
32
+ <h4><?php echo $spam_host; ?></h4>
33
+ Whois: <a href="http://whois.arin.net/rest/ip/<?php echo $spam_ip; ?>" target="_blank"><?php echo $spam_ip; ?></a>
34
+ <?php
35
+ } else {
36
+ ?>
37
+ 特定のホスト情報は見つかりませんでした。
38
+ <?php
39
+ }
40
+ ?>
41
+
42
+ <a href="javascript:void(0);" onclick="window.close();">閉じる</a>
43
+ </div>
44
+ </body>
45
+ </html>
readme.txt CHANGED
@@ -4,7 +4,7 @@ Donate link: http://gti.jp/
4
  Tags: comments, spam
5
  Requires at least: 3.1
6
  Tested up to: 3.5.1
7
- Stable tag: 2.2
8
 
9
  コメントに日本語が使用されていないものや任意のIPアドレスからの投稿を無視するプラグイン
10
 
@@ -28,6 +28,18 @@ Stable tag: 2.2
28
  IPアドレスの指定は「,(半角カンマ)」区切りで複数入力できますが、「192.168.1.0/24」のようにIPアドレスの範囲指定も可能です。
29
  ※例:192.168.0.1,192.168.1.0/24,69.208.0.0/16 と指定した場合
30
   [192.168.0.1]と[192.168.1.0 ~ 192.168.1.255]と[69.208.0.0 ~ 69.208.255.255]のIPアドレスを拒否対象とします。
 
 
 
 
 
 
 
 
 
 
 
 
31
 
32
  ・バージョン2.2 'http'を許容数(初期設定 3)を超えて包含する場合にエラーとする機能を付けました。
33
   導入後すぐに機能しはじめます。制限数の増減も行えます。
@@ -76,6 +88,23 @@ e.g.
76
  == Screenshots ==
77
 
78
  == Changelog ==
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
  = 2.2 =
80
  URL文字列(単純に'http'文字列)が許容数(初期設定3つまで)を超えて包含される場合エラーとする機能を追加
81
  制限するかどうかと許容数の設定及びエラー文言を設定可能。
4
  Tags: comments, spam
5
  Requires at least: 3.1
6
  Tested up to: 3.5.1
7
+ Stable tag: 2.3.2
8
 
9
  コメントに日本語が使用されていないものや任意のIPアドレスからの投稿を無視するプラグイン
10
 
28
  IPアドレスの指定は「,(半角カンマ)」区切りで複数入力できますが、「192.168.1.0/24」のようにIPアドレスの範囲指定も可能です。
29
  ※例:192.168.0.1,192.168.1.0/24,69.208.0.0/16 と指定した場合
30
   [192.168.0.1]と[192.168.1.0 ~ 192.168.1.255]と[69.208.0.0 ~ 69.208.255.255]のIPアドレスを拒否対象とします。
31
+ ・バージョン2.3.1, 2.3.2 不具合修正 仕様は2.3のままです。
32
+ ・バージョン2.3スパムコメント数を保持出来るようにしました。設定を変更しないと機能しませんのでご注意ください。
33
+  保持データは下記の通り
34
+ ○投稿日時
35
+ ○投稿された記事ID
36
+ ○投稿元IPアドレス
37
+ となります。
38
+ 作成されるテーブル名は wp_tsa_spam(wp_の部分は設定されたもの) となります。
39
+
40
+ 現在は スパム投稿したIPの件数(ユニーク) と スパム投稿総数 のみ表示中・・・・StatPressのような表示にしました。
41
+ また、現在まで「NGワード」に設定したものが 投稿者の「名前」に存在していた場合でも通っていましたが、「名前」にも効くようにしました。
42
+ (トラックバックでも同様に名前もNGワード対象に追加しています。)
43
 
44
  ・バージョン2.2 'http'を許容数(初期設定 3)を超えて包含する場合にエラーとする機能を付けました。
45
   導入後すぐに機能しはじめます。制限数の増減も行えます。
88
  == Screenshots ==
89
 
90
  == Changelog ==
91
+ = 2.3.1, 2.3.2, 2.3.3 =
92
+ 不具合の修正をしました。ご迷惑をおかけいたしまして申し訳ありません。
93
+ テーブルに書き込まれない不具合、テーブル読み込みの不具合を修正しました。
94
+
95
+ = 2.3 =
96
+ スパムコメント数を保持出来るようにしました。設定を変更しないと機能しませんのでご注意ください。
97
+  保持データは下記の通り
98
+ ○投稿日時
99
+ ○投稿された記事ID
100
+ ○投稿元IPアドレス
101
+ となります。
102
+ 作成されるテーブル名は wp_tsa_spam(wp_の部分は設定されたもの) となります。
103
+
104
+ 現在は スパム投稿したIPの件数(ユニーク) と スパム投稿総数 のみ表示中・・・・StatPressのような表示にしました。
105
+ また、現在まで「NGワード」に設定したものが 投稿者の「名前」に存在していた場合でも通っていましたが、「名前」にも効くようにしました。
106
+ (トラックバックでも同様に名前もNGワード対象に追加しています。)
107
+
108
  = 2.2 =
109
  URL文字列(単純に'http'文字列)が許容数(初期設定3つまで)を超えて包含される場合エラーとする機能を追加
110
  制限するかどうかと許容数の設定及びエラー文言を設定可能。
throws_spam_away.php CHANGED
@@ -4,10 +4,13 @@
4
  Plugin URI: http://gti.jp/tsa/
5
  Description: コメント内に日本語の記述が存在しない場合はあたかも受け付けたように振る舞いながらも捨ててしまうプラグイン
6
  Author: 株式会社ジーティーアイ さとう たけし
7
- Version: 2.2
8
  Author URI: http://gti.jp/
9
  */
10
 
 
 
 
11
  /** 初期設定 */
12
  // エラー種別
13
  $error_type = "";
@@ -28,33 +31,33 @@ $default_block_ip_address_error_msg = "";
28
  // URL数制限値オーバーのエラー文言(初期設定)
29
  $default_url_count_over_error_msg = "";
30
  // URL数の制限をするか
31
- $default_url_count_check_flg = "1"; // 1:する
32
  // URL数の制限数
33
- $default_ok_url_count = 3; // 3つまで許容
34
  /** オプションキー */
35
- // 日本語が存在しない時エラーとするかフラグ [tsa_on_flg] 1:する 2:しない
36
- // 日本語文字列含有数 (入力値以下ならエラー) [tsa_japanese_string_min_count] 数値型
37
- // 元の記事に戻ってくる時間(秒) [tsa_back_second] 数値型
38
- // コメント欄の下に表示される注意文言 [tsa_caution_message] 文字列型
39
  // 日本語文字列規定値未満エラー時に表示される文言(元の記事に戻ってくる時間の間のみ表示)
40
- // [tsa_error_message] 文字列型
41
  // その他NGキーワード(日本語でも英語(その他)でもNGとしたいキーワードを半角カンマ区切りで複数設定できます。挙動は同じです。NGキーワードだけでも使用できます。)
42
- // [tsa_ng_keywords] 文字列型(半角カンマ区切り文字列)
43
  // NGキーワードエラー時に表示される文言(元の記事に戻ってくる時間の間のみ表示)
44
- // [tsa_ng_key_error_message] 文字列型
45
  // 必須キーワード(日本語でも英語(その他)でも必須としたいキーワードを半角カンマ区切りで複数設定できます。指定文字列を含まない場合はエラーとなります。※複数の方が厳しくなります。必須キーワードだけでも使用できます。)
46
- // [tsa_must_keywords] 文字列型(半角カンマ区切り文字列)
47
  // 必須キーワードエラー時に表示される文言(元の記事に戻ってくる時間の間のみ表示)
48
- // [tsa_must_key_error_message] 文字列型
49
- // この設定をトラックバック記事にも採用するか [tsa_tb_on_flg] 1:する 2:しない
50
  // トラックバック記事にも採用する場合、ついでにこちらのURLが含まれているか判断するか
51
- // [tsa_tb_url_flg] 1:する 2:しない
52
  // WordPressのcommentsテーブルで「spam」判定されたことがあるIPアドレスからの投稿を無視するか
53
- // [tsa_ip_block_from_spam_chk_flg] 1:する その他:しない
54
  // ブロックしたいIPアドレスを任意で入力(半角カンマ区切りで複数設定できます。)
55
- // [tsa_block_ip_addresses] 文字列型
56
  // ブロック対象IPアドレスからの投稿時に表示される文言(元の記事に戻ってくる時間の間のみ表示)
57
- // [tsa_block_ip_address_error_message] 文字列型
58
  // URL(単純に'http'文字列のチェックのみ)文字列数を制限するか [tsa_url_count_on_flg] 1:する その他:しない
59
  // URL(単純に'http'文字列のチェックのみ)文字列の許容数 [tsa_ok_url_count] 数値型
60
  // URL(単純に'http'文字列のチェックのみ)文字列許容数オーバー時に表示される文言(元の記事に戻ってくる時間の間のみ表示)
@@ -76,249 +79,323 @@ add_action('pre_comment_on_post', array(&$newThrowsSpamAway, "comment_post"), 1)
76
  *
77
  */
78
  class ThrowsSpamAway {
79
- // version
80
- var $version = '2.2';
81
-
82
- public function __construct() {
83
- add_action( 'admin_menu', array( $this, 'admin_menu' ) );
84
- }
85
-
86
- function comment_form() {
87
- global $default_caution_msg;
88
- // 注意文言表示
89
- $caution_msg = get_option('tsa_caution_message');
90
- echo '<div id="throwsSpamAway">';
91
- echo ($caution_msg != NULL? $caution_msg : $default_caution_msg);
92
- echo '</div>';
93
- return TRUE;
94
- }
95
-
96
- function comment_post($id) {
97
- global $newThrowsSpamAway;
98
- global $user_ID;
99
- global $default_back_second;
100
- global $default_error_msg;
101
- global $default_ng_key_error_msg;
102
- global $default_must_key_error_msg;
103
- global $default_block_ip_address_error_msg;
104
- global $default_url_count_over_error_msg;
105
- global $error_type;
106
-
107
- if( $user_ID ) {
108
- return $id;
109
- }
110
-
111
- $comment = $_POST["comment"];
112
- // IP系の検査
113
- $ip = $_SERVER['REMOTE_ADDR'];
114
- if (!$newThrowsSpamAway->ip_check($ip)) {
115
- // アウト!
116
- } else
117
- // コメント検査
118
- if ($newThrowsSpamAway->validation($comment)) {
119
- return $id;
120
- }
121
- $error_msg = "";
122
- switch ($error_type) {
123
- case "must_word" :
124
- $error_msg = get_option('tsa_must_key_error_message', $default_must_key_error_msg);
125
- break;
126
- case "ng_word" :
127
- $error_msg = get_option('tsa_ng_key_error_message', $default_ng_key_error_msg);
128
- break;
129
- case "block_ip" :
130
- $error_msg = get_option('tsa_block_ip_address_error_message', $default_block_ip_address_error_msg);
131
- break;
132
- case "url_count_over" :
133
- $error_msg = get_option('tsa_url_count_over_error_message', $default_url_count_over_error_msg);
134
- break;
135
- default :
136
- $error_msg = get_option('tsa_error_message', $default_error_msg);
137
- }
138
- // 元画面へ戻るタイム計算
139
- $back_time = ((int)get_option('tsa_back_second', $default_back_second)) * 1000;
140
- // タイム値が0なら元画面へそのままリダイレクト
141
- if ($back_time == 0) {
142
- header("Location:".$_SERVER['HTTP_REFERER']);
143
- die;
144
- } else {
145
- wp_die( __(($error_msg != NULL? $error_msg : "")."<script type=\"text/javascript\">window.setTimeout(location.href='".$_SERVER['HTTP_REFERER']."', ".$back_time.");</script>", 'throws-spam-away'));
146
- }
147
- }
148
-
149
- /**
150
- * IPアドレスのチェックメソッド
151
- * @param string $target_ip
152
- */
153
- function ip_check($target_ip) {
154
- global $wpdb; // WordPress DBアクセス
155
- global $newThrowsSpamAway;
156
- global $error_type;
157
- // IP制御 WordPressのスパムチェックにてスパム扱いしている投稿のIPをブロックするか
158
- $ip_block_from_spam_chk_flg = get_option('tsa_ip_block_from_spam_chk_flg');
159
-
160
- if ($ip_block_from_spam_chk_flg === "1") {
161
- // wp_commentsの comment_approved カラムが「spam」のIP_ADDRESSからの投稿は無視する
162
- $results = $wpdb->get_results("SELECT DISTINCT comment_author_IP FROM $wpdb->comments WHERE comment_approved = 'spam' ORDER BY comment_author_IP ASC ");
163
- foreach ($results as $item) {
164
- if (trim($item->comment_author_IP) == trim($target_ip)) {
165
- // ブロックしたいIP
166
- $error_type = "block_ip";
167
- return FALSE;
168
- }
169
- }
170
- }
171
- // IP制御 任意のIPアドレスをあればブロックする
172
- $block_ip_addresses = get_option('tsa_block_ip_addresses', "");
173
- if ($block_ip_addresses != NULL && $block_ip_addresses != "") {
174
- $ip_list = mb_split(",", $block_ip_addresses);
175
- foreach ($ip_list as $ip) {
176
- // 指定IPが範囲指定の場合 例:192.168.1.0/24
177
- if ( strpos( $ip, "/" ) != FALSE ) {
178
- if ( $this->inCIDR( $target_ip, $ip ) ) {
179
- // ブロックしたいIP
180
- $error_type = "block_ip";
181
- return FALSE;
182
- }
183
- } elseif (trim($ip) == trim($target_ip)) {
184
- // ブロックしたいIP
185
- $error_type = "block_ip";
186
- return FALSE;
187
- } else {
188
- // セーフIP
189
- }
190
- }
191
- }
192
- return TRUE;
193
- }
194
-
195
- /**
196
- * CIDRチェック
197
- * @param string $ip
198
- * @param string $cidr
199
- * @return boolean
200
- */
201
- function inCIDR($ip, $cidr) {
202
- list($network, $mask_bit_len) = explode('/', $cidr);
203
- if ( !is_nan($mask_bit_len) && $mask_bit_len <= 32) {
204
- $host = 32 - $mask_bit_len;
205
- $net = ip2long($network) >> $host << $host; // 11000000101010000000000000000000
206
- $ip_net = ip2long($ip) >> $host << $host; // 11000000101010000000000000000000
207
- return $net === $ip_net;
208
- } else {
209
- // 形式が不正ならば無視するためFALSE
210
- return FALSE;
211
- }
212
- }
213
-
214
- /**
215
- * 日本語が含まれているかチェックメソッド
216
- * @param string $comment
217
- */
218
- function validation($comment) {
219
- global $newThrowsSpamAway;
220
- global $error_type;
221
- global $default_url_count_check_flg; // URL数を制御するか初期設定値
222
- global $default_ok_url_count; // 制限する場合のURL数初期設定値
223
- global $default_japanese_string_min_count; // 日本語文字最小含有数
224
- // まずはシングルバイトだけならエラー
225
- if (get_option('tsa_on_flg') != "2" && strlen(bin2hex($comment)) / 2 == mb_strlen($comment)) {
226
- return FALSE;
227
- } else {
228
- // OKフラグ
229
- $flg = FALSE;
230
- // マルチバイト文字が含まれている場合は日本語が含まれていればOK
231
- if (get_option('tsa_on_flg') != "2") {
232
- $count_flg = 0;
233
- mb_regex_encoding('UTF-8');
234
- $com_split = $newThrowsSpamAway->mb_str_split($comment);
235
- foreach ($com_split as $it) {
236
- if (preg_match('/[一-龠]+/u', $it)){ $count_flg += 1; }
237
- if (preg_match('/[ァ-ヶー]+/u', $it)){ $count_flg += 1; }
238
- if (preg_match('/[ぁ-ん]+/u', $it)){ $count_flg += 1; }
239
- }
240
- $flg = (intval(get_option('tsa_japanese_string_min_count', $default_japanese_string_min_count)) < $count_flg);
241
- if ($flg == FALSE) {
242
- return FALSE;
243
- }
244
- }
245
- // 日本語文字列チェック抜けたらキーワードチェックを行う
246
- // キーワード文字列群
247
- $ng_keywords = get_option('tsa_ng_keywords');
248
- if ($ng_keywords != NULL && $ng_keywords != "") {
249
- $keyword_list = mb_split(",", $ng_keywords);
250
- foreach ($keyword_list as $key) {
251
- if (preg_match('/'.trim($key)."/u", $comment)) {
252
- $error_type = "ng_word";
253
- return FALSE;
254
- }
255
- }
256
- }
257
- // キーワードチェック(ブラックリスト)を抜けたら必須キーワードチェックを行う
258
- // キーワード文字列群 ※ブラックリストと重複するものはブラックリストのほうが優先です。
259
- $must_keywords = get_option('tsa_must_keywords', "");
260
- if ($must_keywords != NULL && $must_keywords != "") {
261
- $keyword_list = mb_split(",", $must_keywords);
262
- foreach ($keyword_list as $key) {
263
- if (preg_match('/'.trim($key)."/u", $comment)) {
264
- // OK
265
- } else {
266
- // 必須ワードがなかったためエラー
267
- $error_type = "must_word";
268
- return FALSE;
269
- }
270
- }
271
- }
272
- // URL数チェック
273
- $url_count_check = get_option('tsa_url_count_on_flg', $default_url_count_check_flg);
274
- // 許容URL数設定値
275
- $ok_url_count = intval(get_option('tsa_ok_url_count', $default_ok_url_count)); // デフォルト値3(3つまで許容)
276
- if ( $url_count_check != "2" ) {
277
- if ( substr_count( strtolower( $comment ), 'http') > $ok_url_count) {
278
- // URL文字列(httpの数)が多いエラー
279
- $error_type = "url_count_over";
280
- return FALSE;
281
- }
282
- }
283
-
284
- return TRUE;
285
- }
286
- }
287
-
288
- function mb_str_split( $string ) {
289
- return preg_split('/(?<!^)(?!$)/u', $string );
290
- }
291
-
292
- /**
293
- * Callback admin_menu
294
- */
295
- function admin_menu() {
296
- if ( function_exists( 'add_options_page' ) AND current_user_can( 'manage_options' ) ) {
297
- // add options page
298
- $page = add_options_page( __( 'Throws SPAM Away', $this->domain ), __( 'Throws SPAM Away', $this->domain ),
299
- 'manage_options', __FILE__, array( $this, 'options_page' ) );
300
- }
301
- }
302
-
303
- /**
304
- * Admin options page
305
- */
306
- function options_page() {
307
- global $wpdb; // WordPress DBアクセス
308
- global $default_japanese_string_min_count;
309
- global $default_caution_msg;
310
- global $default_back_second;
311
- global $default_error_msg;
312
- global $default_ng_key_error_msg;
313
- global $default_must_key_error_msg;
314
- global $default_block_ip_address_error_msg;
315
- global $default_url_count_over_error_msg;
316
- global $default_ok_url_count;
317
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
318
  <style>
319
  table.form-table { }
320
  table.form-table th {
321
- width : 200px;
322
  }
323
  </style>
324
  <script type="text/Javascript">
@@ -332,234 +409,361 @@ var isDuplicate = function(ary, str) {
332
  return false;
333
  };
334
  function addIpAddresses(newAddressStr) {
335
- var str = document.getElementById('tsa_block_ip_addresses').value;
336
- if (str.length > 0) { str += ","; }
337
- str += newAddressStr;
338
- var ary = str.split(",");
339
- var newAry = new Array;
340
- var ret = "";
341
-
342
- for( var i=0 ; i < ary.length ; i++ ) {
343
- if( !isDuplicate(newAry, ary[i]) ){
344
- newAry.push(ary[i]);
345
- }
346
- }
347
- document.getElementById('tsa_block_ip_addresses').value = newAry.join(',');
348
- return false;
349
  }
350
  </script>
351
  <div class="wrap">
352
- <h2>Throws SPAM Away. Setting</h2>
353
- <form method="post" action="options.php">
354
- <h3>スパム対策機能 設定</h3>
355
- <?php wp_nonce_field('update-options'); ?>
356
- <table class="form-table">
357
- <tr valign="top">
358
- <th scope="row">日本語が存在しない場合、無視対象とする<br />(日本語文字列が存在しない場合無視対象となります。)</th>
359
- <td><?php
360
- $chk_1 = "";
361
- $chk_2 = "";
362
- if (get_option('tsa_on_flg', "1") == "2") {
363
- $chk_2 = " checked=\"checked\"";
364
- } else {
365
- $chk_1 = " checked=\"checked\"";
366
- }
367
- ?>
368
- <label><input type="radio" name="tsa_on_flg" value="1"<?php echo $chk_1;?>/>&nbsp;する</label>&nbsp;
369
- <label><input type="radio" name="tsa_on_flg" value="2"<?php echo $chk_2;?>/>&nbsp;しない</label>
370
- </td>
371
- </tr>
372
- <tr valign="top">
373
- <th scope="row">日本語文字列含有数<br />(この文字列に達していない場合無視対象となります。)</th>
374
- <td><input type="text" name="tsa_japanese_string_min_count"
375
- value="<?php echo get_option('tsa_japanese_string_min_count', $default_japanese_string_min_count); ?>" />
376
- </td>
377
- </tr>
378
- <tr valign="top">
379
- <th scope="row">元の記事に戻ってくる時間<br />(秒)※0の場合エラー画面表示しません。</th>
380
- <td><input type="text" name="tsa_back_second"
381
- value="<?php echo get_option('tsa_back_second', $default_back_second);?>" /></td>
382
- </tr>
383
- <tr valign="top">
384
- <th scope="row">コメント欄の下に表示される注意文言</th>
385
- <td><input type="text" name="tsa_caution_message" size="80"
386
- value="<?php echo get_option('tsa_caution_message', $default_caution_msg);?>" /><br />(初期設定:<?php echo $default_caution_msg;?>)</td>
387
- </tr>
388
- <tr valign="top">
389
- <th scope="row">日本語文字列規定値未満エラー時に表示される文言<br />(元の記事に戻ってくる時間の間のみ表示)</th>
390
- <td><input type="text" name="tsa_error_message" size="80"
391
- value="<?php echo get_option('tsa_error_message', $default_error_msg);?>" /><br />(初期設定:<?php echo $default_error_msg;?>)</td>
392
- </tr>
393
- </table>
394
- <h3>URL文字列除外 設定</h3>
395
- <table class="form-table">
396
- <tr valign="top">
397
- <th scope="row">URLらしき文字列が混入している場合エラーとするか</th>
398
- <td><?php
399
- $chk_1 = "";
400
- $chk_2 = "";
401
- if (get_option('tsa_url_count_on_flg', "1") == "2") {
402
- $chk_2 = " checked=\"checked\"";
403
- } else {
404
- $chk_1 = " checked=\"checked\"";
405
- }
406
- ?>
407
- <label><input type="radio" name="tsa_url_count_on_flg" value="1"<?php echo $chk_1;?>/>&nbsp;する</label>&nbsp;
408
- <label><input type="radio" name="tsa_url_count_on_flg" value="2"<?php echo $chk_2;?>/>&nbsp;しない</label><br />
409
- する場合の制限数(入力数値まで許容):<input type="text" name="tsa_ok_url_count" size="2"
410
- value="<?php echo get_option('tsa_ok_url_count', $default_ok_url_count);?>" />
411
- </td>
412
- </tr>
413
- <tr valign="top">
414
- <th scope="row">URLらしき文字列混入数オーバーエラー時に表示される文言
415
  (元の記事に戻ってくる時間の間のみ表示)</th>
416
- <td><input type="text" name="tsa_url_count_over_error_message" size="80"
417
- value="<?php echo get_option('tsa_url_count_over_error_message', $default_url_count_over_error_msg);?>" /><br />(初期設定:<?php echo $default_url_count_over_error_msg;?>)</td>
418
- </tr>
419
- </table>
420
- <h3>NGキーワード / 必須キーワード 制御設定</h3>
421
- <table class="form-table">
422
- <tr valign="top">
423
- <th scope="row">その他NGキーワード<br />(日本語でも英語(その他)でもNGとしたいキーワードを半角カンマ区切りで複数設定できます。<br />挙動は同じです。NGキーワードだけでも使用できます。)</th>
424
- <td><input type="text" name="tsa_ng_keywords" size="80"
425
- value="<?php echo get_option('tsa_ng_keywords', "");?>" /></td>
426
- </tr>
427
- <tr valign="top">
428
- <th scope="row">NGキーワードエラー時に表示される文言<br />(元の記事に戻ってくる時間の間のみ表示)</th>
429
- <td><input type="text" name="tsa_ng_key_error_message" size="80"
430
- value="<?php echo get_option('tsa_ng_key_error_message', $default_ng_key_error_msg);?>" /><br />(初期設定:<?php echo $default_ng_key_error_msg;?>)</td>
431
- </tr>
432
- <tr valign="top">
433
- <th scope="row">その上での必須キーワード<br />(日本語でも英語(その他)でも必須としたいキーワードを半角カンマ区切りで複数設定できます。<br />指定文字列を含まない場合はエラーとなります。※複数の方が厳しくなります。<br />必須キーワードだけでも使用できます。)</th>
434
- <td><input type="text" name="tsa_must_keywords" size="80"
435
- value="<?php echo get_option('tsa_must_keywords', "");?>" /></td>
436
- </tr>
437
- <tr valign="top">
438
- <th scope="row">必須キーワードエラー時に表示される文言<br />(元の記事に戻ってくる時間の間のみ表示)</th>
439
- <td><input type="text" name="tsa_must_key_error_message" size="80"
440
- value="<?php echo get_option('tsa_must_key_error_message', $default_must_key_error_msg);?>" /><br />(初期設定:<?php echo $default_must_key_error_msg;?>)</td>
441
- </tr>
442
- </table>
443
- <h3>トラックバックへの対応設定</h3>
444
- <table class="form-table">
445
- <tr valign="top">
446
- <th scope="row">上記設定をトラックバック記事にも採用する</th>
447
- <td><?php
448
- $chk_1 = "";
449
- $chk_2 = "";
450
- if (get_option('tsa_tb_on_flg', "2") == "2") {
451
- $chk_2 = " checked=\"checked\"";
452
- } else {
453
- $chk_1 = " checked=\"checked\"";
454
- }
455
- ?>
456
- <label><input type="radio" name="tsa_tb_on_flg" value="1"<?php echo $chk_1;?>/>&nbsp;する</label>&nbsp;
457
- <label><input type="radio" name="tsa_tb_on_flg" value="2"<?php echo $chk_2;?>/>&nbsp;しない</label>
458
- </td>
459
- </tr>
460
- <tr valign="top">
461
- <th scope="row">トラックバック記事にも採用する場合、ついでにこちらのURLが含まれているか判断する<br />(初期設定:「しない」)</th>
462
- <td><?php
463
- $chk_1 = "";
464
- $chk_2 = "";
465
- if (get_option('tsa_tb_url_flg', "2") == "2") {
466
- $chk_2 = " checked=\"checked\"";
467
- } else {
468
- $chk_1 = " checked=\"checked\"";
469
- }
470
- ?>
471
- <label><input type="radio" name="tsa_tb_url_flg" value="1"<?php echo $chk_1;?>/>&nbsp;する</label>&nbsp;
472
- <label><input type="radio" name="tsa_tb_url_flg" value="2"<?php echo $chk_2;?>/>&nbsp;しない</label>
473
- </td>
474
- </tr>
475
- </table>
476
- <h3>投稿IPアドレスによる制御設定</h3>
477
- <table class="form-table">
478
- <tr valign="top">
479
- <th scope="row">WordPressのコメントで「スパム」にしたIPからの投稿にも採用する</th>
480
- <td><?php
481
- $chk = "";
482
- if (get_option('tsa_ip_block_from_spam_chk_flg', "") == "1") {
483
- $chk = "checked=\"checked\"";
484
- } else {
485
- $chk = "";
486
- }
487
- ?>
488
- <label><input type="checkbox" name="tsa_ip_block_from_spam_chk_flg" value="1"<?php echo $chk; ?>/>&nbsp;スパム投稿設定したIPアドレスからの投稿も無視する</label><br />
489
  <?php
490
- // wp_commentsの comment_approved カラムが「spam」のIP_ADDRESSからの投稿は無視する
491
- $results = $wpdb->get_results("SELECT DISTINCT comment_author_IP FROM $wpdb->comments WHERE comment_approved = 'spam' ORDER BY comment_author_IP ASC ");
492
- ?>現在「spam」フラグが付いているIPアドレス:<?php
493
- $add_ip_addresses = "";
494
- foreach ($results as $item) {
495
- $spam_ip = $item->comment_author_IP;
496
- // ブロックしたいIP
497
- if ( strlen( $add_ip_addresses ) > 0 ) {
498
- $add_ip_addresses .= ",";
499
- }
500
- $add_ip_addresses .= $spam_ip;
501
  ?><b><?php echo $spam_ip; ?></b><br /><?php
502
- }
503
- ?>&nbsp;<input type="button" onclick="javascript:addIpAddresses('<?php echo $add_ip_addresses; ?>');" value="これらのIPアドレスを任意のブロック対象IPアドレスにコピーする" />
504
- </td>
505
- </tr>
506
- <tr valign="top">
507
- <th scope="row">任意のIPアドレスからの投稿も無視したい場合、対象となるIPアドレスを記述してください。<br />カンマ区切りで複数設定できます。(半角数字とドットのみ)</th>
508
- <td><input type="text" name="tsa_block_ip_addresses" id="tsa_block_ip_addresses" size="80"
509
- value="<?php echo get_option('tsa_block_ip_addresses', "");?>" /></td>
510
- </tr>
511
- <tr valign="top">
512
- <th scope="row">ブロック対象のIPアドレスからの投稿時に表示される文言<br />(元の記事に戻ってくる時間の間のみ表示)</th>
513
- <td><input type="text" name="tsa_block_ip_address_error_message" size="80"
514
- value="<?php echo get_option('tsa_block_ip_address_error_message', $default_block_ip_address_error_msg);?>" /><br />(初期設定:<?php echo $default_block_ip_address_error_msg; ?>)</td>
515
- </table>
516
- <input type="hidden" name="action" value="update" /> <input
517
- type="hidden" name="page_options"
518
- value="tsa_on_flg,tsa_japanese_string_min_count,tsa_back_second,tsa_caution_message,tsa_error_message,tsa_ng_keywords,tsa_ng_key_error_message,tsa_must_keywords,tsa_must_key_error_message,tsa_tb_on_flg,tsa_tb_url_flg,tsa_block_ip_addresses,tsa_ip_block_from_spam_chk_flg,tsa_block_ip_address_error_message,tsa_url_count_on_flg,tsa_ok_url_count,tsa_url_count_over_error_message" />
519
- <p class="submit">
520
- <input type="submit" class="button-primary"
521
- value="<?php _e('Save Changes') ?>" />
522
- </p>
523
- </form>
524
- <div class="clear"></div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
525
  </div>
526
- <?php
527
- }
528
-
529
- function trackback_spam_away($tb) {
530
- global $newThrowsSpamAway;
531
-
532
- $tsa_tb_on_flg = get_option('tsa_tb_on_flg');
533
- $tsa_tb_url_flg = get_option('tsa_tb_url_flg');
534
- $siteurl = get_option('siteurl');
535
- // トラックバック OR ピンバック時にフィルタ発動
536
- if ($tsa_tb_on_flg == "2" || ($tb['comment_type'] != 'trackback' && $tb['comment_type'] != 'pingback')) return $tb;
537
-
538
- // SPAMかどうかフラグ
539
- $tb_val['is_spam'] = FALSE;
540
-
541
- // コメント判定
542
- $comment = $tb['comment_content'];
543
-
544
- // IP系の検査
545
- $ip = $_SERVER['REMOTE_ADDR'];
546
- if (!$newThrowsSpamAway->ip_check($ip)) {
547
- $tb_val['is_spam'] = TRUE;
548
- } else
549
- // 検査します!
550
- if (!$newThrowsSpamAway->validation($comment)) {
551
- $tb_val['is_spam'] = TRUE;
552
- } else
553
- // URL検索する場合、URL包含検査 (このブログのURLを含んでない場合エラー
554
- if ($tsa_tb_url_flg == "1" && stripos($comment, $siteurl) == FALSE) {
555
- $tb_val['is_spam'] = TRUE; // スパム扱い
556
- }
557
- // トラックバックスパムがなければ返却・あったら捨てちゃう
558
- if (!$tb_val['is_spam']) {
559
- // トラックバック内に日本語存在(または禁止語句混入なし)
560
- return $tb;
561
- } else {
562
- die('Your Trackback Throws Away.');
563
- }
564
- }
 
565
  }
4
  Plugin URI: http://gti.jp/tsa/
5
  Description: コメント内に日本語の記述が存在しない場合はあたかも受け付けたように振る舞いながらも捨ててしまうプラグイン
6
  Author: 株式会社ジーティーアイ さとう たけし
7
+ Version: 2.3.3
8
  Author URI: http://gti.jp/
9
  */
10
 
11
+ // スパムデータベースバージョン
12
+ $tsa_db_version = 2.3;
13
+
14
  /** 初期設定 */
15
  // エラー種別
16
  $error_type = "";
31
  // URL数制限値オーバーのエラー文言(初期設定)
32
  $default_url_count_over_error_msg = "";
33
  // URL数の制限をするか
34
+ $default_url_count_check_flg = "1"; // 1:する
35
  // URL数の制限数
36
+ $default_ok_url_count = 3; // 3つまで許容
37
  /** オプションキー */
38
+ // 日本語が存在しない時エラーとするかフラグ [tsa_on_flg] 1:する 2:しない
39
+ // 日本語文字列含有数 (入力値以下ならエラー) [tsa_japanese_string_min_count] 数値型
40
+ // 元の記事に戻ってくる時間(秒) [tsa_back_second] 数値型
41
+ // コメント欄の下に表示される注意文言 [tsa_caution_message] 文字列型
42
  // 日本語文字列規定値未満エラー時に表示される文言(元の記事に戻ってくる時間の間のみ表示)
43
+ // [tsa_error_message] 文字列型
44
  // その他NGキーワード(日本語でも英語(その他)でもNGとしたいキーワードを半角カンマ区切りで複数設定できます。挙動は同じです。NGキーワードだけでも使用できます。)
45
+ // [tsa_ng_keywords] 文字列型(半角カンマ区切り文字列)
46
  // NGキーワードエラー時に表示される文言(元の記事に戻ってくる時間の間のみ表示)
47
+ // [tsa_ng_key_error_message] 文字列型
48
  // 必須キーワード(日本語でも英語(その他)でも必須としたいキーワードを半角カンマ区切りで複数設定できます。指定文字列を含まない場合はエラーとなります。※複数の方が厳しくなります。必須キーワードだけでも使用できます。)
49
+ // [tsa_must_keywords] 文字列型(半角カンマ区切り文字列)
50
  // 必須キーワードエラー時に表示される文言(元の記事に戻ってくる時間の間のみ表示)
51
+ // [tsa_must_key_error_message] 文字列型
52
+ // この設定をトラックバック記事にも採用するか [tsa_tb_on_flg] 1:する 2:しない
53
  // トラックバック記事にも採用する場合、ついでにこちらのURLが含まれているか判断するか
54
+ // [tsa_tb_url_flg] 1:する 2:しない
55
  // WordPressのcommentsテーブルで「spam」判定されたことがあるIPアドレスからの投稿を無視するか
56
+ // [tsa_ip_block_from_spam_chk_flg] 1:する その他:しない
57
  // ブロックしたいIPアドレスを任意で入力(半角カンマ区切りで複数設定できます。)
58
+ // [tsa_block_ip_addresses] 文字列型
59
  // ブロック対象IPアドレスからの投稿時に表示される文言(元の記事に戻ってくる時間の間のみ表示)
60
+ // [tsa_block_ip_address_error_message] 文字列型
61
  // URL(単純に'http'文字列のチェックのみ)文字列数を制限するか [tsa_url_count_on_flg] 1:する その他:しない
62
  // URL(単純に'http'文字列のチェックのみ)文字列の許容数 [tsa_ok_url_count] 数値型
63
  // URL(単純に'http'文字列のチェックのみ)文字列許容数オーバー時に表示される文言(元の記事に戻ってくる時間の間のみ表示)
79
  *
80
  */
81
  class ThrowsSpamAway {
82
+
83
+ // version
84
+ var $version = '2.3.2';
85
+ var $table_name = "";
86
+
87
+ public function __construct() {
88
+ global $default_spam_data_save;
89
+ add_action( 'admin_menu', array( $this, 'admin_menu' ) );
90
+ global $wpdb;
91
+ // 接頭辞(wp_)を付けてテーブル名を設定
92
+ $this->table_name = $wpdb->prefix . 'tsa_spam';
93
+ }
94
+
95
+ /**
96
+ * スパム投稿テーブル作成
97
+ * $flg がTRUEなら強制的にテーブル作成
98
+ */
99
+ function tsa_createTbl() {
100
+ global $wpdb;
101
+ global $tsa_db_version;
102
+
103
+ // テーブル作成要フラグ
104
+ $flg = FALSE;
105
+ if($wpdb->get_var("SHOW TABLES LIKE '$this->table_name'") != $this->table_name) {
106
+ // テーブルが存在しないため作成する
107
+ $flg = TRUE;
108
+ }
109
+
110
+ //DBのバージョン
111
+ //$tsa_db_version
112
+ //現在のDBバージョン取得
113
+ $installed_ver = get_option( 'tsa_meta_version', 0 );
114
+ // DBバージョンが低い または テーブルが存在しない場合は作成
115
+ if( $installed_ver < $tsa_db_version || $flg == TRUE) {
116
+ // DBバージョンは 2.3未満が存在しないためSQLはCREATE文のみ
117
+ $sql = "CREATE TABLE " . $this->table_name . " (
118
+ meta_id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
119
+ post_id bigint(20) UNSIGNED DEFAULT '0' NOT NULL,
120
+ ip_address text,
121
+ post_date timestamp,
122
+ UNIQUE KEY meta_id (meta_id)
123
+ )
124
+ CHARACTER SET 'utf8';";
125
+ require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
126
+ dbDelta( $sql );
127
+ //オプションにDBバージョン保存
128
+ update_option( 'tsa_meta_version', $tsa_db_version );
129
+ }
130
+ }
131
+
132
+ /**
133
+ * スパム投稿の記録
134
+ * @param string $post_id
135
+ * @param string $ip_address
136
+ */
137
+ function save_post_meta( $post_id, $ip_address ) {
138
+ if ( get_option('tsa_spam_data_save', $default_spam_data_save) != "1" ) return;
139
+
140
+ global $wpdb;
141
+
142
+ //保存するために配列にする
143
+ $set_arr = array(
144
+ 'post_id' => $post_id,
145
+ 'ip_address' => $ip_address
146
+ );
147
+
148
+ //レコード新規追加
149
+ $wpdb->insert( $this->table_name, $set_arr );
150
+ $wpdb->show_errors();
151
+ return;
152
+ }
153
+
154
+ function comment_form() {
155
+ global $default_caution_msg;
156
+ // 注意文言表示
157
+ $caution_msg = get_option( 'tsa_caution_message', $default_caution_msg );
158
+ echo '<div id="throwsSpamAway">'.$caution_msg.'</div>';
159
+ return TRUE;
160
+ }
161
+
162
+ function comment_post( $id ) {
163
+ global $newThrowsSpamAway;
164
+ global $user_ID;
165
+ global $default_back_second;
166
+ global $default_error_msg;
167
+ global $default_ng_key_error_msg;
168
+ global $default_must_key_error_msg;
169
+ global $default_block_ip_address_error_msg;
170
+ global $default_url_count_over_error_msg;
171
+ global $error_type;
172
+
173
+ if( $user_ID ) {
174
+ return $id;
175
+ }
176
+ // コメント(comment)及び名前(author)の中も検査
177
+ $author = $_POST["author"];
178
+ $comment = $_POST["comment"];
179
+ // IP系の検査
180
+ $ip = $_SERVER['REMOTE_ADDR'];
181
+ if ( !$newThrowsSpamAway->ip_check( $ip ) ) {
182
+ // アウト!
183
+ } else
184
+ // コメント検査
185
+ if ( $newThrowsSpamAway->validation( $comment, $author ) ) {
186
+ return $id;
187
+ }
188
+ $error_msg = "";
189
+ switch ( $error_type ) {
190
+ case "must_word" :
191
+ $error_msg = get_option( 'tsa_must_key_error_message', $default_must_key_error_msg );
192
+ break;
193
+ case "ng_word" :
194
+ $error_msg = get_option( 'tsa_ng_key_error_message', $default_ng_key_error_msg );
195
+ break;
196
+ case "block_ip" :
197
+ $error_msg = get_option( 'tsa_block_ip_address_error_message', $default_block_ip_address_error_msg );
198
+ break;
199
+ case "url_count_over" :
200
+ $error_msg = get_option( 'tsa_url_count_over_error_message', $default_url_count_over_error_msg );
201
+ break;
202
+ default :
203
+ $error_msg = get_option( 'tsa_error_message', $default_error_msg );
204
+ }
205
+ // 記録する場合はDB記録
206
+ if ( get_option( 'tsa_spam_data_save', $default_spam_data_save ) == "1" ) $this->save_post_meta( $id, $ip );
207
+ // 元画面へ戻るタイム計算
208
+ $back_time = ( (int) get_option( 'tsa_back_second', $default_back_second ) ) * 1000;
209
+ // タイム値が0なら元画面へそのままリダイレクト
210
+ if ( $back_time == 0 ) {
211
+ header( "Location:".$_SERVER['HTTP_REFERER'] );
212
+ die;
213
+ } else {
214
+ wp_die( __($error_msg."<script type=\"text/javascript\">window.setTimeout(location.href='".$_SERVER['HTTP_REFERER']."', ".$back_time.");</script>", 'throws-spam-away'));
215
+ }
216
+ }
217
+
218
+ /**
219
+ * IPアドレスのチェックメソッド
220
+ * @param string $target_ip
221
+ */
222
+ function ip_check( $target_ip ) {
223
+ global $wpdb; // WordPress DBアクセス
224
+ global $newThrowsSpamAway;
225
+ global $error_type;
226
+ // IP制御 WordPressのスパムチェックにてスパム扱いしている投稿のIPをブロックするか
227
+ $ip_block_from_spam_chk_flg = get_option( 'tsa_ip_block_from_spam_chk_flg' );
228
+
229
+ if ($ip_block_from_spam_chk_flg === "1") {
230
+ // wp_commentsの comment_approved カラムが「spam」のIP_ADDRESSからの投稿は無視する
231
+ $results = $wpdb->get_results( "SELECT DISTINCT comment_author_IP FROM $wpdb->comments WHERE comment_approved = 'spam' ORDER BY comment_author_IP ASC " );
232
+ foreach ( $results as $item ) {
233
+ if ( trim( $item->comment_author_IP ) == trim( $target_ip ) ) {
234
+ // ブロックしたいIP
235
+ $error_type = "block_ip";
236
+ return FALSE;
237
+ }
238
+ }
239
+ }
240
+ // IP制御 任意のIPアドレスをあればブロックする
241
+ $block_ip_addresses = get_option( 'tsa_block_ip_addresses', "" );
242
+ if ( $block_ip_addresses != NULL && $block_ip_addresses != "" ) {
243
+ $ip_list = mb_split( ",", $block_ip_addresses );
244
+ foreach ( $ip_list as $ip ) {
245
+ // 指定IPが範囲指定の場合 例:192.168.1.0/24
246
+ if ( strpos( $ip, "/" ) != FALSE ) {
247
+ if ( $this->inCIDR( $target_ip, $ip ) ) {
248
+ // ブロックしたいIP
249
+ $error_type = "block_ip";
250
+ return FALSE;
251
+ }
252
+ } elseif ( trim( $ip ) == trim( $target_ip ) ) {
253
+ // ブロックしたいIP
254
+ $error_type = "block_ip";
255
+ return FALSE;
256
+ } else {
257
+ // セーフIP
258
+ }
259
+ }
260
+ }
261
+ return TRUE;
262
+ }
263
+
264
+ /**
265
+ * CIDRチェック
266
+ * @param string $ip
267
+ * @param string $cidr
268
+ * @return boolean
269
+ */
270
+ function inCIDR($ip, $cidr) {
271
+ list($network, $mask_bit_len) = explode('/', $cidr);
272
+ if ( !is_nan($mask_bit_len) && $mask_bit_len <= 32) {
273
+ $host = 32 - $mask_bit_len;
274
+ $net = ip2long($network) >> $host << $host; // 11000000101010000000000000000000
275
+ $ip_net = ip2long($ip) >> $host << $host; // 11000000101010000000000000000000
276
+ return $net === $ip_net;
277
+ } else {
278
+ // 形式が不正ならば無視するためFALSE
279
+ return FALSE;
280
+ }
281
+ }
282
+
283
+ /**
284
+ * 日本語が含まれているかチェックメソッド
285
+ * @param string $comment
286
+ * @param string $author
287
+ */
288
+ function validation( $comment, $author ) {
289
+ global $newThrowsSpamAway;
290
+ global $error_type;
291
+ global $default_url_count_check_flg; // URL数を制御するか初期設定値
292
+ global $default_ok_url_count; // 制限する場合のURL数初期設定値
293
+ global $default_japanese_string_min_count; // 日本語文字最小含有数
294
+ // まずはシングルバイトだけならエラー
295
+ if (get_option('tsa_on_flg') != "2" && strlen(bin2hex($comment)) / 2 == mb_strlen($comment)) {
296
+ return FALSE;
297
+ } else {
298
+ // OKフラグ
299
+ $flg = FALSE;
300
+ // マルチバイト文字が含まれている場合は日本語が含まれていればOK
301
+ if (get_option('tsa_on_flg') != "2") {
302
+ $count_flg = 0;
303
+ mb_regex_encoding('UTF-8');
304
+ $com_split = $newThrowsSpamAway->mb_str_split($comment);
305
+ foreach ($com_split as $it) {
306
+ if (preg_match('/[一-龠]+/u', $it)){ $count_flg += 1; }
307
+ if (preg_match('/[ァ-ヶー]+/u', $it)){ $count_flg += 1; }
308
+ if (preg_match('/[ぁ-ん]+/u', $it)){ $count_flg += 1; }
309
+ }
310
+ $flg = (intval(get_option('tsa_japanese_string_min_count', $default_japanese_string_min_count)) < $count_flg);
311
+ if ($flg == FALSE) {
312
+ return FALSE;
313
+ }
314
+ }
315
+ // 日本語文字列チェック抜けたらキーワードチェックを行う
316
+ // キーワード文字列群
317
+ $ng_keywords = get_option('tsa_ng_keywords');
318
+ if ($ng_keywords != NULL && $ng_keywords != "") {
319
+ $keyword_list = mb_split(",", $ng_keywords);
320
+ foreach ($keyword_list as $key) {
321
+ if (preg_match('/'.trim($key)."/u", $author.$comment)) {
322
+ $error_type = "ng_word";
323
+ return FALSE;
324
+ }
325
+ }
326
+ }
327
+ // キーワードチェック(ブラックリスト)を抜けたら必須キーワードチェックを行う
328
+ // キーワード文字列群 ※ブラックリストと重複するものはブラックリストのほうが優先です。
329
+ $must_keywords = get_option('tsa_must_keywords', "");
330
+ if ($must_keywords != NULL && $must_keywords != "") {
331
+ $keyword_list = mb_split(",", $must_keywords);
332
+ foreach ($keyword_list as $key) {
333
+ if (preg_match('/'.trim($key)."/u", $author.$comment)) {
334
+ // OK
335
+ } else {
336
+ // 必須ワードがなかったためエラー
337
+ $error_type = "must_word";
338
+ return FALSE;
339
+ }
340
+ }
341
+ }
342
+ // URL数チェック
343
+ $url_count_check = get_option('tsa_url_count_on_flg', $default_url_count_check_flg);
344
+ // 許容URL数設定値
345
+ $ok_url_count = intval(get_option('tsa_ok_url_count', $default_ok_url_count)); // デフォルト値3(3つまで許容)
346
+ if ( $url_count_check != "2" ) {
347
+ if ( substr_count( strtolower( $author.$comment ), 'http') > $ok_url_count) {
348
+ // URL文字列(httpの数)が多いエラー
349
+ $error_type = "url_count_over";
350
+ return FALSE;
351
+ }
352
+ }
353
+
354
+ return TRUE;
355
+ }
356
+ }
357
+
358
+ function mb_str_split( $string ) {
359
+ return preg_split('/(?<!^)(?!$)/u', $string );
360
+ }
361
+
362
+ /**
363
+ * Callback admin_menu
364
+ */
365
+ function admin_menu() {
366
+ $mincap="level_8";
367
+ add_menu_page(__( 'Throws SPAM Away', $this->domain ), __( 'Throws SPAM Away', $this->domain ), $mincap, __FILE__, array( $this, 'options_page' ) );
368
+
369
+ // 従来通りスパムデータ保存しない場合はスルーする
370
+ if ( get_option( 'tsa_spam_data_save' ) != 1 ) {
371
+ // N/A
372
+ } else {
373
+ // プラグインアップデート時もチェックするため常に・・・
374
+ $this->tsa_createTbl(TRUE);
375
+ }
376
+
377
+ }
378
+
379
+ /**
380
+ * Admin options page
381
+ */
382
+ function options_page() {
383
+ global $wpdb; // WordPress DBアクセス
384
+ global $default_japanese_string_min_count;
385
+ global $default_caution_msg;
386
+ global $default_back_second;
387
+ global $default_error_msg;
388
+ global $default_ng_key_error_msg;
389
+ global $default_must_key_error_msg;
390
+ global $default_block_ip_address_error_msg;
391
+ global $default_url_count_over_error_msg;
392
+ global $default_ok_url_count;
393
+ global $default_spam_data_save;
394
+ ?>
395
  <style>
396
  table.form-table { }
397
  table.form-table th {
398
+ width : 200px;
399
  }
400
  </style>
401
  <script type="text/Javascript">
409
  return false;
410
  };
411
  function addIpAddresses(newAddressStr) {
412
+ var str = document.getElementById('tsa_block_ip_addresses').value;
413
+ if (str.length > 0) { str += ","; }
414
+ str += newAddressStr;
415
+ var ary = str.split(",");
416
+ var newAry = new Array;
417
+ var ret = "";
418
+
419
+ for( var i=0 ; i < ary.length ; i++ ) {
420
+ if( !isDuplicate(newAry, ary[i]) ){
421
+ newAry.push(ary[i]);
422
+ }
423
+ }
424
+ document.getElementById('tsa_block_ip_addresses').value = newAry.join(',');
425
+ return false;
426
  }
427
  </script>
428
  <div class="wrap">
429
+ <h2>Throws SPAM Away設定</h2>
430
+ <form method="post" action="options.php">
431
+ <h3>スパム対策機能 設定</h3>
432
+ <?php wp_nonce_field('update-options'); ?>
433
+ <table class="form-table">
434
+ <tr valign="top">
435
+ <th scope="row">日本語が存在しない場合、無視対象とする<br />(日本語文字列が存在しない場合無視対象となります。)</th>
436
+ <td><?php
437
+ $chk_1 = "";
438
+ $chk_2 = "";
439
+ if (get_option('tsa_on_flg', "1") == "2") {
440
+ $chk_2 = " checked=\"checked\"";
441
+ } else {
442
+ $chk_1 = " checked=\"checked\"";
443
+ }
444
+ ?>
445
+ <label><input type="radio" name="tsa_on_flg" value="1"<?php echo $chk_1;?>/>&nbsp;する</label>&nbsp;
446
+ <label><input type="radio" name="tsa_on_flg" value="2"<?php echo $chk_2;?>/>&nbsp;しない</label>
447
+ </td>
448
+ </tr>
449
+ <tr valign="top">
450
+ <th scope="row">日本語文字列含有数<br />(この文字列に達していない場合無視対象となります。)</th>
451
+ <td><input type="text" name="tsa_japanese_string_min_count"
452
+ value="<?php echo get_option('tsa_japanese_string_min_count', $default_japanese_string_min_count); ?>" />
453
+ </td>
454
+ </tr>
455
+ <tr valign="top">
456
+ <th scope="row">元の記事に戻ってくる時間<br />(秒)※0の場合エラー画面表示しません。</th>
457
+ <td><input type="text" name="tsa_back_second"
458
+ value="<?php echo get_option('tsa_back_second', $default_back_second);?>" /></td>
459
+ </tr>
460
+ <tr valign="top">
461
+ <th scope="row">コメント欄の下に表示される注意文言</th>
462
+ <td><input type="text" name="tsa_caution_message" size="80"
463
+ value="<?php echo get_option('tsa_caution_message', $default_caution_msg);?>" /><br />(初期設定:<?php echo $default_caution_msg;?>)</td>
464
+ </tr>
465
+ <tr valign="top">
466
+ <th scope="row">日本語文字列規定値未満エラー時に表示される文言<br />(元の記事に戻ってくる時間の間のみ表示)</th>
467
+ <td><input type="text" name="tsa_error_message" size="80"
468
+ value="<?php echo get_option('tsa_error_message', $default_error_msg);?>" /><br />(初期設定:<?php echo $default_error_msg;?>)</td>
469
+ </tr>
470
+ </table>
471
+ <h3>URL文字列除外 設定</h3>
472
+ <table class="form-table">
473
+ <tr valign="top">
474
+ <th scope="row">URLらしき文字列が混入している場合エラーとするか</th>
475
+ <td><?php
476
+ $chk_1 = "";
477
+ $chk_2 = "";
478
+ if (get_option('tsa_url_count_on_flg', "1") == "2") {
479
+ $chk_2 = " checked=\"checked\"";
480
+ } else {
481
+ $chk_1 = " checked=\"checked\"";
482
+ }
483
+ ?>
484
+ <label><input type="radio" name="tsa_url_count_on_flg" value="1"<?php echo $chk_1;?>/>&nbsp;する</label>&nbsp;
485
+ <label><input type="radio" name="tsa_url_count_on_flg" value="2"<?php echo $chk_2;?>/>&nbsp;しない</label><br />
486
+ する場合の制限数(入力数値まで許容):<input type="text" name="tsa_ok_url_count" size="2"
487
+ value="<?php echo get_option('tsa_ok_url_count', $default_ok_url_count);?>" />
488
+ </td>
489
+ </tr>
490
+ <tr valign="top">
491
+ <th scope="row">URLらしき文字列混入数オーバーエラー時に表示される文言
492
  (元の記事に戻ってくる時間の間のみ表示)</th>
493
+ <td><input type="text" name="tsa_url_count_over_error_message" size="80"
494
+ value="<?php echo get_option('tsa_url_count_over_error_message', $default_url_count_over_error_msg);?>" /><br />(初期設定:<?php echo $default_url_count_over_error_msg;?>)</td>
495
+ </tr>
496
+ </table>
497
+ <h3>NGキーワード / 必須キーワード 制御設定</h3>
498
+ <table class="form-table">
499
+ <tr valign="top">
500
+ <th scope="row">その他NGキーワード<br />(日本語でも英語(その他)でもNGとしたいキーワードを半角カンマ区切りで複数設定できます。<br />挙動は同じです。NGキーワードだけでも使用できます。)</th>
501
+ <td><input type="text" name="tsa_ng_keywords" size="80"
502
+ value="<?php echo get_option('tsa_ng_keywords', "");?>" /></td>
503
+ </tr>
504
+ <tr valign="top">
505
+ <th scope="row">NGキーワードエラー時に表示される文言<br />(元の記事に戻ってくる時間の間のみ表示)</th>
506
+ <td><input type="text" name="tsa_ng_key_error_message" size="80"
507
+ value="<?php echo get_option('tsa_ng_key_error_message', $default_ng_key_error_msg);?>" /><br />(初期設定:<?php echo $default_ng_key_error_msg;?>)</td>
508
+ </tr>
509
+ <tr valign="top">
510
+ <th scope="row">その上での必須キーワード<br />(日本語でも英語(その他)でも必須としたいキーワードを半角カンマ区切りで複数設定できます。<br />指定文字列を含まない場合はエラーとなります。※複数の方が厳しくなります。<br />必須キーワードだけでも使用できます。)</th>
511
+ <td><input type="text" name="tsa_must_keywords" size="80"
512
+ value="<?php echo get_option('tsa_must_keywords', "");?>" /></td>
513
+ </tr>
514
+ <tr valign="top">
515
+ <th scope="row">必須キーワードエラー時に表示される文言<br />(元の記事に戻ってくる時間の間のみ表示)</th>
516
+ <td><input type="text" name="tsa_must_key_error_message" size="80"
517
+ value="<?php echo get_option('tsa_must_key_error_message', $default_must_key_error_msg);?>" /><br />(初期設定:<?php echo $default_must_key_error_msg;?>)</td>
518
+ </tr>
519
+ </table>
520
+ <h3>トラックバックへの対応設定</h3>
521
+ <table class="form-table">
522
+ <tr valign="top">
523
+ <th scope="row">上記設定をトラックバック記事にも採用する</th>
524
+ <td><?php
525
+ $chk_1 = "";
526
+ $chk_2 = "";
527
+ if (get_option('tsa_tb_on_flg', "2") == "2") {
528
+ $chk_2 = " checked=\"checked\"";
529
+ } else {
530
+ $chk_1 = " checked=\"checked\"";
531
+ }
532
+ ?>
533
+ <label><input type="radio" name="tsa_tb_on_flg" value="1"<?php echo $chk_1;?>/>&nbsp;する</label>&nbsp;
534
+ <label><input type="radio" name="tsa_tb_on_flg" value="2"<?php echo $chk_2;?>/>&nbsp;しない</label>
535
+ </td>
536
+ </tr>
537
+ <tr valign="top">
538
+ <th scope="row">トラックバック記事にも採用する場合、ついでにこちらのURLが含まれているか判断する<br />(初期設定:「しない」)</th>
539
+ <td><?php
540
+ $chk_1 = "";
541
+ $chk_2 = "";
542
+ if (get_option('tsa_tb_url_flg', "2") == "2") {
543
+ $chk_2 = " checked=\"checked\"";
544
+ } else {
545
+ $chk_1 = " checked=\"checked\"";
546
+ }
547
+ ?>
548
+ <label><input type="radio" name="tsa_tb_url_flg" value="1"<?php echo $chk_1;?>/>&nbsp;する</label>&nbsp;
549
+ <label><input type="radio" name="tsa_tb_url_flg" value="2"<?php echo $chk_2;?>/>&nbsp;しない</label>
550
+ </td>
551
+ </tr>
552
+ </table>
553
+ <h3>投稿IPアドレスによる制御設定</h3>
554
+ <table class="form-table">
555
+ <tr valign="top">
556
+ <th scope="row">WordPressのコメントで「スパム」にしたIPからの投稿にも採用する</th>
557
+ <td><?php
558
+ $chk = "";
559
+ if (get_option('tsa_ip_block_from_spam_chk_flg', "") == "1") {
560
+ $chk = "checked=\"checked\"";
561
+ } else {
562
+ $chk = "";
563
+ }
564
+ ?>
565
+ <label><input type="checkbox" name="tsa_ip_block_from_spam_chk_flg" value="1"<?php echo $chk; ?>/>&nbsp;スパム投稿設定したIPアドレスからの投稿も無視する</label><br />
566
  <?php
567
+ // wp_commentsの comment_approved カラムが「spam」のIP_ADDRESSからの投稿は無視する
568
+ $results = $wpdb->get_results("SELECT DISTINCT comment_author_IP FROM $wpdb->comments WHERE comment_approved = 'spam' ORDER BY comment_author_IP ASC ");
569
+ ?>現在「spam」フラグが付いているIPアドレス:<br /><blockquote><?php
570
+ $add_ip_addresses = "";
571
+ foreach ($results as $item) {
572
+ $spam_ip = $item->comment_author_IP;
573
+ // ブロックしたいIP
574
+ if ( strlen( $add_ip_addresses ) > 0 ) {
575
+ $add_ip_addresses .= ",";
576
+ }
577
+ $add_ip_addresses .= $spam_ip;
578
  ?><b><?php echo $spam_ip; ?></b><br /><?php
579
+ }
580
+ ?>&nbsp;<input type="button" onclick="javascript:addIpAddresses('<?php echo $add_ip_addresses; ?>');" value="これらのIPアドレスを任意のブロック対象IPアドレスにコピーする" /><br />
581
+ </blockquote>
582
+ </td>
583
+ </tr>
584
+ <tr valign="top">
585
+ <th scope="row">任意のIPアドレスからの投稿も無視したい場合、対象となるIPアドレスを記述してください。<br />カンマ区切りで複数設定できます。(半角数字とドットのみ)</th>
586
+ <td><input type="text" name="tsa_block_ip_addresses" id="tsa_block_ip_addresses" size="80"
587
+ value="<?php echo get_option('tsa_block_ip_addresses', "");?>" /></td>
588
+ </tr>
589
+ <tr valign="top">
590
+ <th scope="row">ブロック対象のIPアドレスからの投稿時に表示される文言<br />(元の記事に戻ってくる時間の間のみ表示)</th>
591
+ <td><input type="text" name="tsa_block_ip_address_error_message" size="80"
592
+ value="<?php echo get_option('tsa_block_ip_address_error_message', $default_block_ip_address_error_msg);?>" /><br />(初期設定:<?php echo $default_block_ip_address_error_msg; ?>)</td>
593
+ </tr>
594
+ </table>
595
+ <h3>スパムデータベース</h3>
596
+ <table class="form-table">
597
+ <tr valign="top">
598
+ <th scope="row">スパムコメント投稿情報を保存しますか?</th>
599
+ <td><?php
600
+ $chk = "";
601
+ if (get_option('tsa_spam_data_save', "") == "1") {
602
+ $chk = "checked=\"checked\"";
603
+ } else {
604
+ $chk = "";
605
+ }
606
+ ?>
607
+ <label><input type="checkbox" name="tsa_spam_data_save" value="1"<?php echo $chk; ?>/>&nbsp;スパムコメント情報を保存する</label><br />※Throws SPAM Away設定画面表示時に時間がかかることがあります。<br />※「保存する」を解除した場合でもテーブルは残りますので30日以内の取得データは表示されます。
608
+ </td>
609
+ </tr>
610
+ </table>
611
+
612
+ <input type="hidden" name="action" value="update" /> <input
613
+ type="hidden" name="page_options"
614
+ value="tsa_on_flg,tsa_japanese_string_min_count,tsa_back_second,tsa_caution_message,tsa_error_message,tsa_ng_keywords,tsa_ng_key_error_message,tsa_must_keywords,tsa_must_key_error_message,tsa_tb_on_flg,tsa_tb_url_flg,tsa_block_ip_addresses,tsa_ip_block_from_spam_chk_flg,tsa_block_ip_address_error_message,tsa_url_count_on_flg,tsa_ok_url_count,tsa_url_count_over_error_message,tsa_spam_data_save" />
615
+ <p class="submit">
616
+ <input type="submit" class="button-primary"
617
+ value="<?php _e('Save Changes') ?>" />
618
+ </p>
619
+
620
+ <?php
621
+ if ( get_option( 'tsa_spam_data_save' ) == "1" ) {
622
+ // 日数
623
+ $gdays = 30;
624
+ // 表カラー
625
+ $unique_color="#114477";
626
+ $web_color="#3377B6";
627
+
628
+ $results = $wpdb->get_results("SELECT SUBSTRING(post_date,1,10) AS spam_date,COUNT(*) as spam_count FROM `".$this->table_name."` group by spam_date order by spam_date asc");
629
+ ?>
630
+ <h3>スパム投稿30日間の推移</h3>
631
+ <?php
632
+ foreach ($results as $item) {
633
+ echo $item->spam_date .":". $item->spam_count."件<br />";
634
+ }
635
+ ?>
636
+ <div class="clear"></div>
637
+
638
+ <div class="clear" style="background-color:#efefef;">
639
+ <table style="width:100%;border:none;"><tr>
640
+ <?php
641
+ $total_qry = "
642
+ SELECT count(ppd) as pageview, ppd
643
+ FROM (select ip_address, SUBSTRING(post_date,1,10) as ppd from $this->table_name) as A
644
+ GROUP BY ppd HAVING ppd >= '".gmdate('Y-m-d', current_time('timestamp')-86400*$gdays)."'
645
+ ORDER BY pageview DESC
646
+ LIMIT 1
647
+ ";
648
+ $qry = $wpdb->get_row($total_qry);
649
+ $maxxday=$qry->pageview;
650
+
651
+ $total_vis = "
652
+ SELECT count(distinct ip_address) as vis, ppd
653
+ FROM (select ip_address, SUBSTRING(post_date,1,10) as ppd from $this->table_name) as B
654
+ GROUP BY ppd HAVING ppd >= '".gmdate('Y-m-d', current_time('timestamp')-86400*$gdays)."'
655
+ ORDER BY vis DESC
656
+ LIMIT 1
657
+ ";
658
+ $qry_vis = $wpdb->get_row($total_vis);
659
+ $maxxday += $qry_vis->vis;
660
+
661
+ if($maxxday == 0) { $maxxday = 1; }
662
+
663
+ # Y
664
+ $gd=(100/$gdays).'%';
665
+ for($gg=$gdays-1;$gg>=0;$gg--)
666
+ {
667
+ #TOTAL VISITORS
668
+ $visitor_qry = "
669
+ SELECT count(DISTINCT ip_address) AS total
670
+ FROM (select ip_address, SUBSTRING(post_date,1,10) as ppd from $this->table_name) as B
671
+ WHERE ppd = '".gmdate('Y-m-d', current_time('timestamp')-86400*$gg)."'
672
+ ";
673
+ $qry_visitors = $wpdb->get_row($visitor_qry);
674
+ $px_visitors = round($qry_visitors->total*100/$maxxday);
675
+ #TOTAL PAGEVIEWS (we do not delete the uniques, this is falsing the info.. uniques are not different visitors!)
676
+ $pageview_qry = "
677
+ SELECT count(ppd) as total
678
+ FROM (select ip_address, SUBSTRING(post_date,1,10) as ppd from $this->table_name) as C
679
+ WHERE ppd = '".gmdate('Y-m-d', current_time('timestamp')-86400*$gg)."'
680
+ ";
681
+ $qry_pageviews = $wpdb->get_row($pageview_qry);
682
+ $px_pageviews = round($qry_pageviews->total*100/$maxxday);
683
+ $px_white = 100 - $px_pageviews - $px_visitors;
684
+ if ($px_white < 0) { $px_white = 0; }
685
+
686
+ print '<td width="'.$gd.'" valign="bottom"';
687
+ if($start_of_week == gmdate('w',current_time('timestamp')-86400*$gg)) { print ' style="border-left:2px dotted gray;"'; } # week-cut
688
+ print "><div style='float:left;width:100%;font-family:Helvetica;font-size:7pt;text-align:center;border-right:1px solid white;color:black;'>
689
+ <div style='background:#ffffff;width:100%;height:".$px_white."px;'></div>
690
+ <div style='background:$unique_color;width:100%;height:".$px_visitors."px;' title='".$qry_visitors->total." ip_addresses'></div>
691
+ <div style='background:$web_color;width:100%;height:".$px_pageviews."px;' title='".$qry_pageviews->total." spam comments'></div>
692
+ <div style='background:gray;width:100%;height:1px;'></div>
693
+ <br />".gmdate('d', current_time('timestamp')-86400*$gg) . ' ' . gmdate('M', current_time('timestamp')-86400*$gg) . "<br clear=\"all\" /></div></td>\n";
694
+ }
695
+ ?>
696
+ </tr></table>
697
+ </div>
698
+ &nbsp;<br />
699
+ <div class="clear">
700
+ <?php
701
+ // wp_tsa_spam の ip_address カラムに存在するIP_ADDRESS投稿は無視するか
702
+ $results = $wpdb->get_results(
703
+ "SELECT count(ip_address) as cnt,ip_address FROM (select ip_address, SUBSTRING(post_date,1,10) as ppd from $this->table_name) as D
704
+ WHERE ppd >= '".gmdate('Y-m-d', current_time('timestamp')-86400*$gdays)."'
705
+ GROUP BY ip_address
706
+ ORDER BY cnt DESC"
707
+ );
708
+ ?><h4>過去30日間に無視投稿されたIPアドレス</h4>
709
+ <p>※「このIPアドレスを任意のブロック対象IPアドレスにコピーする」ボタンを押した場合は上の<b>「変更を保存」</b>をクリックし内容を保存してください。</p>
710
+ <p>※IPアドレスをクリックすると特定のホストが存在するか確認し存在する場合は表示されます。</p>
711
+ <?php if ( count( $results ) > 0 ) { ?>
712
+ <div style="height: 500px; overflow:auto;"><blockquote>
713
+ <table style="width:100%;border:1px #cccccc solid;border-collapse: collapse;"><?php
714
+ foreach ($results as $item) {
715
+ $spam_ip = $item->ip_address;
716
+ $spam_cnt = $item->cnt;
717
+ $p_url = WP_PLUGIN_URL.'/'.str_replace(basename( __FILE__),"",plugin_basename(__FILE__));
718
+ ?><tr style="border:1px #cccccc solid;border-collapse: collapse;"><td><b><a href="javascript:void(0);" onclick="window.open('<?php echo $p_url; ?>hostbyip.php?ip=<?php echo $spam_ip; ?>', 'hostbyip', 'width=350,height=250,scrollbars=no,location=no,menubar=no,toolbar=no,directories=no,status=no');"><?php echo $spam_ip; ?></a></b></td><td><?php echo $spam_cnt; ?>回</td><td>&nbsp;<input type="button" onclick="javascript:addIpAddresses('<?php echo $spam_ip; ?>');" value="このIPアドレスを任意のブロック対象IPアドレスにコピーする" /></td></tr><?php
719
+ }
720
+ ?></table></blockquote></div>
721
+ <?php } ?>
722
+ </div>
723
+ <?php } ?>
724
+ </form>
725
+ <p>スパム投稿IPアドレスを参考にアクセス禁止対策を行なってください。</p>
726
+ <div class="clear"></div>
727
+
728
  </div>
729
+
730
+ <?php
731
+ }
732
+
733
+ function trackback_spam_away($tb) {
734
+ global $newThrowsSpamAway;
735
+
736
+ $tsa_tb_on_flg = get_option( 'tsa_tb_on_flg' );
737
+ $tsa_tb_url_flg = get_option( 'tsa_tb_url_flg' );
738
+ $siteurl = get_option('siteurl');
739
+ // トラックバック OR ピンバック時にフィルタ発動
740
+ if ( $tsa_tb_on_flg == "2" || ( $tb['comment_type'] != 'trackback' && $tb['comment_type'] != 'pingback' ) ) return $tb;
741
+
742
+ // SPAMかどうかフラグ
743
+ $tb_val['is_spam'] = FALSE;
744
+
745
+ // コメント判定
746
+ $author = $tb["comment_author"];
747
+ $comment = $tb["comment_content"];
748
+ // IP系の検査
749
+ $ip = $_SERVER['REMOTE_ADDR'];
750
+ if ( !$newThrowsSpamAway->ip_check( $ip ) ) {
751
+ $tb_val['is_spam'] = TRUE;
752
+ } else
753
+ // 検査します!
754
+ if ( !$newThrowsSpamAway->validation( $comment, $author ) ) {
755
+ $tb_val['is_spam'] = TRUE;
756
+ } else
757
+ // URL検索する場合、URL包含検査 (このブログのURLを含んでない場合エラー
758
+ if ( $tsa_tb_url_flg == "1" && stripos( $comment, $siteurl ) == FALSE ) {
759
+ $tb_val['is_spam'] = TRUE; // スパム扱い
760
+ }
761
+ // トラックバックスパムがなければ返却・あったら捨てちゃう
762
+ if ( !$tb_val['is_spam'] ) {
763
+ // トラックバック内に日本語存在(または禁止語句混入なし)
764
+ return $tb;
765
+ } else {
766
+ die( 'Your Trackback Throws Away.' );
767
+ }
768
+ }
769
  }
uninstall.php CHANGED
@@ -1,6 +1,7 @@
1
  <?php
2
  /*
3
  Throws SPAM Awayプラグインアンインストール
 
4
  */
5
 
6
  if(!defined('ABSPATH') && !defined('WP_UNINSTALL_PLUGIN')) { exit(); }
@@ -22,7 +23,10 @@ delete_option('tsa_ip_block_from_spam_chk_flg');
22
  delete_option('tsa_block_ip_addresses');
23
  delete_option('tsa_block_ip_address_error_message');
24
  // ver.2.2
25
- delete_option('tsa_url_count_on_flg');
26
- delete_option('tsa_ok_url_count');
27
- delete_option('tsa_url_count_over_error_message');
 
 
 
28
  ?>
1
  <?php
2
  /*
3
  Throws SPAM Awayプラグインアンインストール
4
+ 2.3追加
5
  */
6
 
7
  if(!defined('ABSPATH') && !defined('WP_UNINSTALL_PLUGIN')) { exit(); }
23
  delete_option('tsa_block_ip_addresses');
24
  delete_option('tsa_block_ip_address_error_message');
25
  // ver.2.2
26
+ delete_option('tsa_url_count_on_flg');
27
+ delete_option('tsa_ok_url_count');
28
+ delete_option('tsa_url_count_over_error_message');
29
+ // ver.2.3
30
+ delete_option('tsa_meta_version');
31
+ delete_option('tsa_spam_data_save');
32
  ?>