Throws SPAM Away - Version 2.6.2

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.6.2
Comparing to
See all releases

Code changes from version 2.6.1 to 2.6.2

hostbyip.php CHANGED
@@ -16,7 +16,7 @@ $last_spam_comment_result = $newThrowsSpamAway->get_last_spam_comment($spam_ip);
16
  $last_comment_date = $last_spam_comment_result->post_date;
17
  $last_comment_post = get_permalink($last_spam_comment_result->post_id);
18
  $last_comment_post_title = get_the_title(get_post($last_spam_comment_result->post_id));
19
- $is_spam_champuru = ( $newThrowsSpamAway->rejectSpamIP($spam_ip) ? FALSE : TRUE );
20
  ?><!DOCTYPE html>
21
  <!--[if IE 8]>
22
  <html xmlns="http://www.w3.org/1999/xhtml" class="ie8 wp-toolbar" lang="ja" prefix="og: http://ogp.me/ns#" >
16
  $last_comment_date = $last_spam_comment_result->post_date;
17
  $last_comment_post = get_permalink($last_spam_comment_result->post_id);
18
  $last_comment_post_title = get_the_title(get_post($last_spam_comment_result->post_id));
19
+ $is_spam_champuru = ( $newThrowsSpamAway->reject_spam_ip( $spam_ip ) ? FALSE : TRUE );
20
  ?><!DOCTYPE html>
21
  <!--[if IE 8]>
22
  <html xmlns="http://www.w3.org/1999/xhtml" class="ie8 wp-toolbar" lang="ja" prefix="og: http://ogp.me/ns#" >
js/tsa_params.js CHANGED
@@ -3,6 +3,9 @@
3
  * WordPress's Plugin
4
  * @author Takeshi Satoh@GTI Inc. 2014
5
  * @since version2.6
 
 
 
6
  */
7
 
8
  jQuery(function($){
@@ -10,18 +13,21 @@ jQuery(function($){
10
  $('.tsa_param_field_tsa_2 input#tsa_param_field_tsa_3').val( $('.tsa_param_field_tsa_ input').val() ); // copy
11
 
12
  var date = new Date();
13
- var iso = date.toISOString().match(/(\d{4}\-\d{2}\-\d{2})T(\d{2}:\d{2}:\d{2})/);
14
- current_date = iso[1] + ' ' + iso[2];
15
- if ( $('#comments form input#tsa_param_field_tsa_3').length == 0 ) {
16
- $('#comments form').append('<input type="hidden" name="tsa_param_field_tsa_3" id="tsa_param_field_tsa_3" value="'+current_date+'" />'); // add to comment form
17
- }
 
 
18
 
19
- if ( $('#respond form input#tsa_param_field_tsa_3').length == 0 ) {
20
- $('#respond form').append('<input type="hidden" name="tsa_param_field_tsa_3" id="tsa_param_field_tsa_3" value="'+current_date+'" />'); // add to comment form
21
- }
22
 
23
- if ( $('form#commentform input#tsa_param_field_tsa_3').length == 0 ) {
24
- $('form#commentform').append('<input type="hidden" name="tsa_param_field_tsa_3" id="tsa_param_field_tsa_3" value="'+current_date+'" />'); // add to comment form
 
25
  }
26
 
27
  });
3
  * WordPress's Plugin
4
  * @author Takeshi Satoh@GTI Inc. 2014
5
  * @since version2.6
6
+ *
7
+ * -- updated --
8
+ * 2014/05/10 debug for IE8
9
  */
10
 
11
  jQuery(function($){
13
  $('.tsa_param_field_tsa_2 input#tsa_param_field_tsa_3').val( $('.tsa_param_field_tsa_ input').val() ); // copy
14
 
15
  var date = new Date();
16
+ var iso = null;
17
+ if ( typeof date.toISOString != 'undefined' ) {
18
+ iso = date.toISOString().match(/(\d{4}\-\d{2}\-\d{2})T(\d{2}:\d{2}:\d{2})/);
19
+ current_date = iso[1] + ' ' + iso[2];
20
+ if ( $('#comments form input#tsa_param_field_tsa_3').length == 0 ) {
21
+ $('#comments form').append('<input type="hidden" name="tsa_param_field_tsa_3" id="tsa_param_field_tsa_3" value="'+current_date+'" />'); // add to comment form
22
+ }
23
 
24
+ if ( $('#respond form input#tsa_param_field_tsa_3').length == 0 ) {
25
+ $('#respond form').append('<input type="hidden" name="tsa_param_field_tsa_3" id="tsa_param_field_tsa_3" value="'+current_date+'" />'); // add to comment form
26
+ }
27
 
28
+ if ( $('form#commentform input#tsa_param_field_tsa_3').length == 0 ) {
29
+ $('form#commentform').append('<input type="hidden" name="tsa_param_field_tsa_3" id="tsa_param_field_tsa_3" value="'+current_date+'" />'); // add to comment form
30
+ }
31
  }
32
 
33
  });
js/tsa_params.min.js ADDED
@@ -0,0 +1 @@
 
1
+ jQuery(function(a){a(".tsa_param_field_tsa_2").hide();a(".tsa_param_field_tsa_2 input#tsa_param_field_tsa_3").val(a(".tsa_param_field_tsa_ input").val());var b=new Date();var c=null;if(typeof b.toISOString!="undefined"){c=b.toISOString().match(/(\d{4}\-\d{2}\-\d{2})T(\d{2}:\d{2}:\d{2})/);current_date=c[1]+" "+c[2];if(a("#comments form input#tsa_param_field_tsa_3").length==0){a("#comments form").append('<input type="hidden" name="tsa_param_field_tsa_3" id="tsa_param_field_tsa_3" value="'+current_date+'" />')}if(a("#respond form input#tsa_param_field_tsa_3").length==0){a("#respond form").append('<input type="hidden" name="tsa_param_field_tsa_3" id="tsa_param_field_tsa_3" value="'+current_date+'" />')}if(a("form#commentform input#tsa_param_field_tsa_3").length==0){a("form#commentform").append('<input type="hidden" name="tsa_param_field_tsa_3" id="tsa_param_field_tsa_3" value="'+current_date+'" />')}}});
readme.txt CHANGED
@@ -3,8 +3,8 @@ Contributors: taman777
3
  Donate link: http://gti.jp/tsa
4
  Tags: comments, spam
5
  Requires at least: 3.1
6
- Tested up to: 3.8
7
- Stable tag: 2.6.1
8
 
9
  コメントに日本語が使用されていないものや任意のIPアドレスからの投稿を無視するプラグイン
10
 
@@ -46,6 +46,11 @@ IPアドレスの指定「ブロックリスト」「ホワイトリスト」共
46
  ※例:192.168.0.1,192.168.1.0/24,69.208.0.0/16 と指定した場合
47
   [192.168.0.1]と[192.168.1.0 ~ 192.168.1.255]と[69.208.0.0 ~ 69.208.255.255]のIPアドレスを拒否(または優先通過)対象とします。
48
 
 
 
 
 
 
49
  ・バージョン2.6.1
50
   スパムデータベースの表示に時間がかかるため「設定」部分と「スパムデータ」表示画面の2メニュー構成に変更しました。
51
   すぱむチャンプルーによる捕捉の場合にエラータイプが正しく表示されていない不具合を修正しました。
3
  Donate link: http://gti.jp/tsa
4
  Tags: comments, spam
5
  Requires at least: 3.1
6
+ Tested up to: 3.9.1
7
+ Stable tag: 2.6.2
8
 
9
  コメントに日本語が使用されていないものや任意のIPアドレスからの投稿を無視するプラグイン
10
 
46
  ※例:192.168.0.1,192.168.1.0/24,69.208.0.0/16 と指定した場合
47
   [192.168.0.1]と[192.168.1.0 ~ 192.168.1.255]と[69.208.0.0 ~ 69.208.255.255]のIPアドレスを拒否(または優先通過)対象とします。
48
 
49
+ ・バージョン2.6.2
50
+  スパム対策設定の初期値を長年の研究の末の「最適」であろう設定値にしました。
51
+  デフォルト値として項目の下に記載しています。長年ご利用の方は、参考に調整してください。
52
+  IE8にてJavaScriptエラーとなっていた箇所があり、「tsa_param.js」を修正いたしました。大変ご迷惑をお掛けいたしました。
53
+
54
  ・バージョン2.6.1
55
   スパムデータベースの表示に時間がかかるため「設定」部分と「スパムデータ」表示画面の2メニュー構成に変更しました。
56
   すぱむチャンプルーによる捕捉の場合にエラータイプが正しく表示されていない不具合を修正しました。
throws_spam_away.class.php CHANGED
@@ -10,7 +10,7 @@ class ThrowsSpamAway {
10
 
11
  // version
12
  var $version = '2.6';
13
- var $table_name = "";
14
 
15
  public function __construct() {
16
  global $default_spam_data_save;
@@ -24,12 +24,12 @@ class ThrowsSpamAway {
24
  global $lower_spam_keep_day_count;
25
 
26
  // 保存期間終了したデータ削除
27
- $skdc = intval( get_option('tsa_spam_keep_day_count', $default_spam_keep_day_count) );
28
  if ( $skdc < $lower_spam_keep_day_count ) { $skdc = $lower_spam_keep_day_count; }
29
- if ( get_option('tsa_spam_data_delete_flg', "") == "1" ) {
30
- // 期間 get_option('tsa_spam_keep_day_count') 日
31
  $wpdb->query(
32
- "DELETE FROM ".$this->table_name." WHERE post_date < '".gmdate('Y-m-d 23:59:59', current_time('timestamp')-86400 * $skdc)."'"
33
  );
34
  }
35
  }
@@ -38,13 +38,13 @@ class ThrowsSpamAway {
38
  * スパム投稿テーブル作成
39
  * $flg がTRUEなら強制的にテーブル作成
40
  */
41
- function tsa_createTbl() {
42
  global $wpdb;
43
  global $tsa_db_version;
44
 
45
  // テーブル作成要フラグ
46
  $flg = FALSE;
47
- if($wpdb->get_var("SHOW TABLES LIKE '$this->table_name'") != $this->table_name) {
48
  // テーブルが存在しないため作成する
49
  $flg = TRUE;
50
  }
@@ -54,9 +54,9 @@ class ThrowsSpamAway {
54
  //現在のDBバージョン取得
55
  $installed_ver = get_option( 'tsa_meta_version', 0 );
56
  // DBバージョンが低い または テーブルが存在しない場合は作成
57
- if( $flg == TRUE || $installed_ver < $tsa_db_version ) {
58
  // dbDeltaのおかげ様でCREATE文のみ
59
- $sql = "CREATE TABLE " . $this->table_name . " (
60
  meta_id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
61
  post_id bigint(20) UNSIGNED DEFAULT '0' NOT NULL,
62
  ip_address varchar(64),
@@ -82,13 +82,13 @@ class ThrowsSpamAway {
82
  function save_post_meta( $post_id, $ip_address, $spam_contents ) {
83
  global $default_spam_data_save;
84
 
85
- if ( get_option('tsa_spam_data_save', $default_spam_data_save) != "1" ) return;
86
 
87
  global $wpdb;
88
 
89
  $error_type = $spam_contents['error_type'];
90
- $author = strip_tags($spam_contents['author']);
91
- $comment = strip_tags($spam_contents['comment']);
92
 
93
  //保存するために配列にする
94
  $set_arr = array(
@@ -96,7 +96,7 @@ class ThrowsSpamAway {
96
  'ip_address' => $ip_address,
97
  'error_type' => $error_type,
98
  'author' => $author,
99
- 'comment' => $comment
100
  );
101
 
102
  //レコード新規追加
@@ -109,8 +109,8 @@ class ThrowsSpamAway {
109
  function tsa_scripts_init() {
110
  global $tsa_version;
111
  // anti-spam の方法を参考に作成しました
112
- if ( !is_admin() ) {
113
- wp_enqueue_script( 'throws-spam-away-script', plugins_url( '/js/tsa_params.js', __FILE__ ), array( 'jquery' ), $tsa_version );
114
  }
115
  }
116
 
@@ -128,11 +128,11 @@ class ThrowsSpamAway {
128
  function comment_form_dummy_param_field() {
129
  global $default_dummy_param_field_flg;
130
  // 空パラメータフィールド作成
131
- $dummy_param_field_flg = get_option( 'tsa_dummy_param_field_flg', $default_dummy_param_field_flg);
132
- if ( $dummy_param_field_flg == "1" ) {
133
  echo '<p class="tsa_param_field_tsa_" style="display:none;">email confirm<span class="required">*</span><input type="text" name="tsa_email_param_field___" id="tsa_email_param_field___" size="30" value="" />
134
  </p>';
135
- echo '<p class="tsa_param_field_tsa_2">post date<span class="required">*</span><input type="text" name="tsa_param_field_tsa_3" id="tsa_param_field_tsa_3" size="30" value="'.date('Y-m-d H:i:s').'" />
136
  </p>';
137
  }
138
  return TRUE;
@@ -151,27 +151,27 @@ class ThrowsSpamAway {
151
  global $error_type;
152
 
153
  // ログインしている場合は通過させます。
154
- if( $user_ID ) {
155
  return $id;
156
  }
157
  // コメント(comment)及び名前(author)の中も検査
158
- $author = $_POST["author"];
159
- $comment = $_POST["comment"];
160
 
161
  // チェック対象IPアドレス
162
  $ip = $_SERVER['REMOTE_ADDR'];
163
 
164
  // ホワイトリスト優先通過
165
  // IP制御 任意のIPアドレスをあればブロックする
166
- $white_ip_addresses = get_option( 'tsa_white_ip_addresses', "" );
167
- if ( $white_ip_addresses != NULL && $white_ip_addresses != "" ) {
168
  // 改行区切りの場合はカンマ区切りに文字列置換後リスト化
169
- $white_ip_addresses = str_replace("\n", ",", $white_ip_addresses);
170
- $ip_list = mb_split( ",", $white_ip_addresses );
171
  foreach ( $ip_list as $_ip ) {
172
  // 指定IPが範囲指定の場合 例:192.168.1.0/24
173
- if ( strpos( $_ip, "/" ) != FALSE ) {
174
- if ( $this->inCIDR( $ip, $_ip ) ) {
175
  // 通過対象
176
  return $id;
177
  }
@@ -182,40 +182,40 @@ class ThrowsSpamAway {
182
  }
183
  }
184
  // IP系の検査
185
- if ( !$newThrowsSpamAway->ip_check( $ip ) ) {
186
  // アウト!
187
  } else
188
  // コメント検査
189
- if ( $newThrowsSpamAway->validation( $comment, $author ) ) {
190
  return $id;
191
  }
192
- $error_msg = "";
193
  switch ( $error_type ) {
194
- case "must_word" :
195
  $error_msg = get_option( 'tsa_must_key_error_message', $default_must_key_error_msg );
196
  break;
197
- case "ng_word" :
198
  $error_msg = get_option( 'tsa_ng_key_error_message', $default_ng_key_error_msg );
199
  break;
200
- case "block_ip" :
201
  $error_msg = get_option( 'tsa_block_ip_address_error_message', $default_block_ip_address_error_msg );
202
  break;
203
- case "url_count_over" :
204
  $error_msg = get_option( 'tsa_url_count_over_error_message', $default_url_count_over_error_msg );
205
  break;
206
- case "spam_limit_over" :
207
  $error_msg = get_option( 'tsa_spam_limit_over_interval_error_message', $default_spam_limit_over_interval_error_msg );
208
  break;
209
- case "dummy_param_field" : // ダミーフィールドの場合は通常メッセージ
210
  default :
211
  $error_msg = get_option( 'tsa_error_message', $default_error_msg );
212
  }
213
  // 記録する場合はDB記録
214
- if ( get_option( 'tsa_spam_data_save', $default_spam_data_save ) == "1" ) {
215
  $spam_contents = array();
216
  $spam_contents['error_type'] = $error_type;
217
- $spam_contents['author'] = mb_strcut($author, 0, 255);
218
- $spam_contents['comment'] = mb_strcut($comment, 0, 255);
219
 
220
  $this->save_post_meta( $id, $ip, $spam_contents );
221
  }
@@ -223,10 +223,10 @@ class ThrowsSpamAway {
223
  $back_time = ( (int) get_option( 'tsa_back_second', $default_back_second ) ) * 1000;
224
  // タイム値が0なら元画面へそのままリダイレクト
225
  if ( $back_time == 0 ) {
226
- header( "Location:".$_SERVER['HTTP_REFERER'] );
227
  die;
228
  } else {
229
- wp_die( __($error_msg."<script type=\"text/javascript\">window.setTimeout(location.href='".$_SERVER['HTTP_REFERER']."', ".$back_time.");</script>", 'throws-spam-away'));
230
  }
231
  }
232
 
@@ -236,47 +236,48 @@ class ThrowsSpamAway {
236
  */
237
  function ip_check( $target_ip ) {
238
  global $wpdb; // WordPress DBアクセス
 
239
  global $newThrowsSpamAway;
240
  global $error_type;
241
  // スパムフィルター利用あれば始めに通す
242
  // 1.スパムちゃんぷるー
243
- $spam_filter_spam_champuru_flg = get_option( 'tsa_spam_champuru_flg' );
244
- if ( get_option( 'tsa_spam_champuru_flg', "" ) == "1" ) {
245
- return $this->rejectSpamIP( $target_ip );
246
  }
247
  // 2.以降あれば追加
248
 
249
  // IP制御 WordPressのスパムチェックにてスパム扱いしている投稿のIPをブロックするか
250
  $ip_block_from_spam_chk_flg = get_option( 'tsa_ip_block_from_spam_chk_flg' );
251
 
252
- if ($ip_block_from_spam_chk_flg === "1") {
253
  // wp_commentsの comment_approved カラムが「spam」のIP_ADDRESSからの投稿は無視する
254
  $results = $wpdb->get_results( "SELECT DISTINCT comment_author_IP FROM $wpdb->comments WHERE comment_approved = 'spam' ORDER BY comment_author_IP ASC " );
255
  foreach ( $results as $item ) {
256
  if ( trim( $item->comment_author_IP ) == trim( $target_ip ) ) {
257
  // ブロックしたいIP
258
- $error_type = "block_ip";
259
  return FALSE;
260
  }
261
  }
262
  }
263
  // IP制御 任意のIPアドレスをあればブロックする
264
- $block_ip_addresses = get_option( 'tsa_block_ip_addresses', "" );
265
- if ( $block_ip_addresses != NULL && $block_ip_addresses != "" ) {
266
  // 改行区切りの場合はカンマ区切りに文字列置換後リスト化
267
- $block_ip_addresses = str_replace("\n", ",", $block_ip_addresses);
268
- $ip_list = mb_split( ",", $block_ip_addresses );
269
  foreach ( $ip_list as $ip ) {
270
  // 指定IPが範囲指定の場合 例:192.168.1.0/24
271
- if ( strpos( $ip, "/" ) != FALSE ) {
272
- if ( $this->inCIDR( $target_ip, $ip ) ) {
273
  // ブロックしたいIP
274
- $error_type = "block_ip";
275
  return FALSE;
276
  }
277
  } elseif ( trim( $ip ) == trim( $target_ip ) ) {
278
  // ブロックしたいIP
279
- $error_type = "block_ip";
280
  return FALSE;
281
  } else {
282
  // セーフIP
@@ -289,42 +290,42 @@ class ThrowsSpamAway {
289
  /**
290
  * スパムちゃんぷるー利用ブロック
291
  */
292
- function rejectSpamIP( $ip ) {
293
  global $spam_champuru_host;
294
  global $error_type;
295
 
296
- $spam_IP = '127.0.0.2';
297
- $host = $spam_champuru_host;
298
  $pattern = '/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/';
299
- $check_IP = trim(preg_match($pattern, $ip) ? $ip : $_SERVER['REMOTE_ADDR']);
300
- $spam = false;
301
- if (preg_match($pattern, $check_IP)) {
302
- $host = implode('.',array_reverse(split('\.',$check_IP))) . '.' . $host;
303
- if (function_exists('dns_get_record')) {
304
- $check_recs = dns_get_record($host, DNS_A);
305
- if (isset($check_recs[0]['ip'])) $spam = ($check_recs[0]['ip'] === $spam_IP);
306
- unset($check_recs);
307
- } elseif (function_exists('gethostbyname')) {
308
- $checked = (gethostbyname($host) === $spam_IP);
309
- } elseif (class_exists('Net_DNS_Resolver')) {
310
  $resolver = new Net_DNS_Resolver();
311
- $response = $resolver->query($host, 'A');
312
- if ($response) {
313
- foreach ($response->answer as $rr) {
314
- if ($rr->type === 'A') {
315
- $spam = ($rr->address === $spam_IP);
316
  break;
317
  }
318
  }
319
  }
320
- unset($response);
321
- unset($resolver);
322
- } elseif (function_exists('checkdnsrr')) {
323
- $spam = (checkdnsrr($host, "A") === true);
324
  }
325
  }
326
- if ($spam) {
327
- $error_type = "block_ip";
328
  return FALSE;
329
  }
330
  return TRUE;
@@ -336,12 +337,12 @@ class ThrowsSpamAway {
336
  * @param string $cidr
337
  * @return boolean
338
  */
339
- function inCIDR($ip, $cidr) {
340
- list($network, $mask_bit_len) = explode('/', $cidr);
341
- if ( !is_nan($mask_bit_len) && $mask_bit_len <= 32) {
342
  $host = 32 - $mask_bit_len;
343
  $net = ip2long($network) >> $host << $host; // 11000000101010000000000000000000
344
- $ip_net = ip2long($ip) >> $host << $host; // 11000000101010000000000000000000
345
  return $net === $ip_net;
346
  } else {
347
  // 形式が不正ならば無視するためFALSE
@@ -357,13 +358,14 @@ class ThrowsSpamAway {
357
  function validation( $comment, $author ) {
358
  global $newThrowsSpamAway;
359
  global $error_type;
360
- global $default_dummy_param_field_flg; // ダミー項目によるスパム判定初期値
361
- global $default_url_count_check_flg; // URL数を制御するか初期設定値
362
- global $default_ok_url_count; // 制限する場合のURL数初期設定値
 
363
  global $default_japanese_string_min_count; // 日本語文字最小含有数
364
 
365
- // Throws SPAM Away 起動フラグ "1":起動 "2":オフ
366
- $tsa_on_flg = get_option( 'tsa_on_flg', "" );
367
 
368
  // 一定時間制限チェック
369
  // 一定時間内スパム認定機能<br />○分以内に○回スパムとなったら○分間、当該IPからのコメントはスパム扱いする設定+スパム情報保存
@@ -379,8 +381,8 @@ class ThrowsSpamAway {
379
  // スパム情報保存フラグ
380
  $tsa_spam_data_save = get_option( 'tsa_spam_data_save' );
381
  // 一定時間制限チェック
382
- $tsa_spam_limit_flg = get_option( 'tsa_spam_limit_flg', "" );
383
- if ( $tsa_spam_data_save == "1" && $tsa_spam_limit_flg == "1" ) {
384
  global $default_spam_limit_minutes;
385
  global $default_spam_limit_over_interval;
386
  global $default_spam_limit_count;
@@ -388,47 +390,47 @@ class ThrowsSpamAway {
388
  $tsa_spam_limit_minutes = intval(get_option( 'tsa_spam_limit_minutes', $default_spam_limit_minutes ) );
389
  $tsa_spam_limit_over_interval = intval(get_option( 'tsa_spam_limit_over_interval', $default_spam_limit_over_interval ) );
390
  // ○分以内(インターバルの方が長い場合はインターバル値を利用する)の同一IPからのスパム投稿回数を調べる
391
- $interval_minutes = ($tsa_spam_limit_minutes >= $tsa_spam_limit_over_interval ? $tsa_spam_limit_minutes : $tsa_spam_limit_over_interval );
392
 
393
  // 上記が○回を超えているかチェック
394
- $ip = htmlspecialchars($_SERVER['REMOTE_ADDR']);
395
  $this_ip_spam_cnt = "
396
  SELECT ip_address, count(ppd) as spam_count, max(post_date)
397
  FROM (select ip_address, post_date as ppd, post_date from $this->table_name) as A
398
  WHERE A.ip_address = '".$ip."' AND
399
- ppd >= '".gmdate('Y-m-d H:i:s', current_time('timestamp')-60 * $interval_minutes)."'
400
  GROUP BY ip_address LIMIT 1";
401
  $query = $wpdb->get_row( $this_ip_spam_cnt );
402
- $spam_count = intval($query->spam_count);
403
 
404
 
405
  // 最後のスパム投稿から○分超えていなければ アウト!!
406
  $tsa_spam_limit_count = intval( get_option( 'tsa_spam_limit_count', $default_spam_limit_count ) );
407
  if ( $spam_count > $tsa_spam_limit_count ) {
408
  // アウト!
409
- $error_type = "spam_limit_over";
410
  return FALSE;
411
  }
412
  }
413
  // ダミーフィールド使用する場合、ダミーフィールドに入力値があればエラー
414
  $tsa_dummy_param_field_flg = get_option( 'tsa_dummy_param_field_flg', $default_dummy_param_field_flg );
415
- if ( $tsa_dummy_param_field_flg == "1") {
416
- if ( !empty( $_POST['tsa_param_field_tsa_3'] ) ) { // このフィールドにリクエストパラメータが入る場合はスパム判定
417
- $error_type = "dummy_param_field";
418
  return FALSE;
419
  }
420
  }
421
  // シングルバイトだけならエラー
422
- if ($tsa_on_flg != "2" && strlen( bin2hex( $comment ) ) / 2 == mb_strlen( $comment ) ) {
423
- $error_type = "not_japanese";
424
  return FALSE;
425
  } else {
426
  // 日本語文字列必須含有数
427
  $tsa_japanese_string_min_count = intval( get_option( 'tsa_japanese_string_min_count', $default_japanese_string_min_count ) );
428
  // NGキーワード文字列群
429
- $tsa_ng_keywords = get_option( 'tsa_ng_keywords', "" );
430
  // キーワード文字列群 ※ブラックリストと重複するものはブラックリストのほうが優先です。
431
- $tsa_must_keywords = get_option( 'tsa_must_keywords', "" );
432
  // URL数チェック
433
  $tsa_url_count_check = get_option( 'tsa_url_count_on_flg', $default_url_count_check_flg );
434
  // 許容URL数設定値
@@ -437,55 +439,55 @@ class ThrowsSpamAway {
437
  // OKフラグ
438
  $flg = FALSE;
439
  // マルチバイト文字が含まれている場合は日本語が含まれていればOK
440
- if ($tsa_on_flg != "2") {
441
  $count_flg = 0;
442
  mb_regex_encoding('UTF-8');
443
- $com_split = $newThrowsSpamAway->mb_str_split($comment);
444
- foreach ($com_split as $it) {
445
- if (preg_match('/[一-龠]+/u', $it)){
446
  $count_flg += 1;
447
  }
448
- if (preg_match('/[ァ-ヶー]+/u', $it)){
449
  $count_flg += 1;
450
  }
451
- if (preg_match('/[ぁ-ん]+/u', $it)){
452
  $count_flg += 1;
453
  }
454
  }
455
- $flg = ($tsa_japanese_string_min_count < $count_flg);
456
  if ($flg == FALSE) {
457
- $error_type = "not_japanese";
458
  return FALSE;
459
  }
460
  }
461
  // 日本語文字列チェック抜けたらキーワードチェックを行う
462
- if ( $tsa_ng_keywords != "" ) {
463
- $keyword_list = mb_split( ",", $tsa_ng_keywords );
464
  foreach ( $keyword_list as $key ) {
465
- if ( preg_match('/'.trim($key)."/u", $author.$comment) ) {
466
- $error_type = "ng_word";
467
  return FALSE;
468
  }
469
  }
470
  }
471
  // キーワードチェック(ブラックリスト)を抜けたら必須キーワードチェックを行う
472
- if ( $tsa_must_keywords != "" ) {
473
- $keyword_list = mb_split( ",", $tsa_must_keywords );
474
  foreach ( $keyword_list as $key ) {
475
- if ( preg_match( '/'.trim($key)."/u", $author.$comment ) ) {
476
  // OK
477
  } else {
478
  // 必須ワードがなかったためエラー
479
- $error_type = "must_word";
480
  return FALSE;
481
  }
482
  }
483
  }
484
  // 含有URL数チェック
485
- if ( $tsa_url_count_check != "2" ) {
486
  if ( substr_count( strtolower( $author.$comment ), 'http') > $tsa_ok_url_count) {
487
  // URL文字列(httpの数)が多いエラー
488
- $error_type = "url_count_over";
489
  return FALSE;
490
  }
491
  }
@@ -502,23 +504,24 @@ class ThrowsSpamAway {
502
  * Callback admin_menu
503
  */
504
  function admin_menu() {
505
- $mincap="level_8";
506
- $spam_mincap = "level_7";
507
  if (function_exists('add_menu_page')) {
508
- add_menu_page(__('設定', 'throws-spam-away'), __('Throws SPAM Away', 'throws-spam-away'), $mincap, 'throws-spam-away', array( $this, 'options_page'));
509
  }
510
 
511
- if ( get_option( 'tsa_spam_data_save' ) == "1" ) {
512
- if (function_exists('add_submenu_page')) {
513
- add_submenu_page('throws-spam-away', __('スパムデータ', 'throws-spam-away'), __('スパムデータ', 'throws-spam-away'), $spam_mincap, 'throws-spam-away/throws_spam_away.class.php', array($this, 'spams_list'));
514
  }
 
515
  }
516
  // 従来通りスパムデータ保存しない場合はスルーする
517
  if ( get_option( 'tsa_spam_data_save' ) != 1 ) {
518
  // N/A
519
  } else {
520
  // プラグインアップデート時もチェックするため常に・・・
521
- $this->tsa_createTbl(TRUE);
522
  }
523
 
524
  }
@@ -528,6 +531,7 @@ class ThrowsSpamAway {
528
  */
529
  function options_page() {
530
  global $wpdb; // WordPress DBアクセス
 
531
  global $default_dummy_param_field_flg;
532
  global $default_japanese_string_min_count;
533
  global $default_caution_msg;
@@ -536,23 +540,28 @@ class ThrowsSpamAway {
536
  global $default_error_msg;
537
  global $default_ng_key_error_msg;
538
  global $default_must_key_error_msg;
 
 
539
  global $default_block_ip_address_error_msg;
 
 
540
  global $default_url_count_over_error_msg;
541
  global $default_ok_url_count;
542
- global $default_spam_data_save;
543
 
 
544
  global $default_spam_limit_minutes;
545
  global $default_spam_limit_count;
546
  global $default_spam_limit_over_interval;
547
  global $default_spam_limit_over_interval_error_msg;
548
 
 
549
  global $default_spam_display_day_count;
550
-
551
  global $default_spam_keep_day_count;
552
 
553
  // 設定完了の場合はメッセージ表示
554
  $_saved = FALSE;
555
- if ( $_GET['settings-updated'] == "true" ) {
556
  $_saved = TRUE;
557
  }
558
  ?>
@@ -567,129 +576,135 @@ table.form-table th {
567
  </style>
568
  <script type="text/Javascript">
569
  // 配列重複チェック
570
- var isDuplicate = function(ary, str) {
571
- for (i = 0; i < ary.length; i++) {
572
- if(str == ary[i]) {
573
- return true;
574
- }
575
- }
576
- return false;
577
  };
578
  function addIpAddresses(newAddressStr) {
579
  // チェック用配列
580
  var test_newAddress_list = newAddressStr.split(",");
581
- var str = document.getElementById('tsa_block_ip_addresses').value;
582
  // 現在の配列(テスト用)
583
- str = str.replace(/\,/g, "\n");
584
  var test_oldAddress_list = str.split("\n");
585
 
586
- if (str.length > 0) { str += "\n"; }
587
- if (newAddressStr.length > 0) {
588
- newAddressStr = newAddressStr.replace(/\,/g, "\n");
589
- }
590
- str += newAddressStr;
591
- str = str.replace(/\,/g, "\n");
592
-
593
- var ary = str.split("\n");
594
- var newAry = new Array;
595
- var ret = "";
596
-
597
- upd_flg = false;
598
- upd_ip_str = "";
599
- for ( var i=0; i < test_newAddress_list.length; i++) {
600
- if (!isDuplicate(test_oldAddress_list, test_newAddress_list[i]) && test_newAddress_list[i] != "") {
601
- upd_flg = true;
602
- upd_ip_str = upd_ip_str + "・"+test_newAddress_list[i]+"\n";
603
- }
604
- }
605
- if (upd_flg == true) {
606
-
607
- for( var i=0 ; i < ary.length ; i++ ) {
608
- if( !isDuplicate(newAry, ary[i]) && ary[i] != ""){
609
- newAry.push(ary[i]);
610
- }
611
- }
612
- document.getElementById('tsa_block_ip_addresses').value = newAry.join('\n');
613
- alert('新たにIPアドレスを追加しました。\n'+upd_ip_str);
614
- } else {
615
- alert('指定されたIPアドレスは\nすでに追加されています。');
616
- }
617
  return false;
618
  }
619
  </script>
620
  <div class="wrap">
621
  <h2>Throws SPAM Away設定</h2>
622
- <?php if ($_saved) { ?>
623
  <div class="updated" style="padding: 10px; width: 50%;" id="message">設定の更新が完了しました。</div>
624
  <?php } ?>
625
  <form method="post" action="options.php">
626
  <h3>スパム対策機能 設定</h3>
627
- <?php wp_nonce_field('update-options'); ?>
628
  <table class="form-table">
629
  <tr valign="top">
630
  <th scope="row">人の目には見えないダミーの入力項目を作成し、そこに入力があれば無視対象とする<br />(スパムプログラム投稿に有効です)</th>
631
  <td><?php
632
- $chk_1 = "";
633
- $chk_2 = "";
634
- if ( get_option( 'tsa_dummy_param_field_flg', "1") == "2" ) {
635
- $chk_2 = " checked=\"checked\"";
636
  } else {
637
- $chk_1 = " checked=\"checked\"";
638
  }
639
  ?>
640
- <label><input type="radio" name="tsa_dummy_param_field_flg" value="1"<?php echo $chk_1;?> />&nbsp;する</label>&nbsp;
641
- <label><input type="radio" name="tsa_dummy_param_field_flg" value="2"<?php echo $chk_2;?> />&nbsp;しない</label><br />
642
- ※ダミー項目の制御にJavaScriptを使用しますのでJavaScriptが動作しない環境からの投稿はスパム判定されてしまいます。ご注意の上、ご利用ください。
 
643
  </td>
644
  </tr>
645
  <tr valign="top"><td colspan="2"><hr/></td></tr>
646
  <tr valign="top">
647
  <th scope="row">日本語が存在しない場合、無視対象とする<br />(日本語文字列が存在しない場合無視対象となります。)</th>
648
  <td><?php
649
- $chk_1 = "";
650
- $chk_2 = "";
651
- if (get_option('tsa_on_flg', "1") == "2") {
652
- $chk_2 = " checked=\"checked\"";
653
- } else {
654
- $chk_1 = " checked=\"checked\"";
655
- }
656
- ?> <label><input type="radio" name="tsa_on_flg" value="1" <?php echo $chk_1;?> />&nbsp;する</label>&nbsp;
657
- <label><input type="radio" name="tsa_on_flg" value="2" <?php echo $chk_2;?> />&nbsp;しない</label>
 
658
  </td>
659
  </tr>
660
  <tr valign="top">
661
  <th scope="row">日本語文字列含有数<br />(この文字列に達していない場合無視対象となります。)
662
  </th>
663
  <td><input type="text" name="tsa_japanese_string_min_count"
664
- value="<?php echo get_option('tsa_japanese_string_min_count', $default_japanese_string_min_count); ?>" />
 
665
  </td>
666
  </tr>
667
  <tr valign="top">
668
  <th scope="row">元の記事に戻ってくる時間<br />(秒)※0の場合エラー画面表示しません。
669
  </th>
670
  <td><input type="text" name="tsa_back_second"
671
- value="<?php echo get_option('tsa_back_second', $default_back_second);?>" />
 
672
  </td>
673
  </tr>
674
  <tr valign="top">
675
  <th scope="row" id="tsa_caution_message">コメント欄の下に表示される注意文言</th>
676
  <td><input type="text" name="tsa_caution_message" size="80"
677
- value="<?php echo get_option('tsa_caution_message', $default_caution_msg);?>" /><br />(初期設定:<?php echo $default_caution_msg;?>)</td>
 
678
  </tr>
679
  <tr valign="top">
680
  <th scope="row" id="tsa_caution_msg_point">コメント注意文言の表示位置</th>
681
  <td><?php
682
- $chk_1 = "";
683
- $chk_2 = "";
684
- if (get_option('tsa_caution_msg_point', $default_caution_msg_point) == "2") {
685
- $chk_2 = " checked=\"checked\"";
686
- } else {
687
- $chk_1 = " checked=\"checked\"";
688
- }
689
- ?> <label><input type="radio"
690
- name="tsa_caution_msg_point" value="1" <?php echo $chk_1;?> />&nbsp;コメント送信ボタンの上</label>&nbsp;
691
  <label><input type="radio" name="tsa_caution_msg_point" value="2"
692
- <?php echo $chk_2;?> />&nbsp;コメント送信フォームの下</label>
 
693
  </td>
694
  </tr>
695
  <tr><td colspan="2">※表示が崩れる場合、<a href="#tsa_caution_msg_point">「コメント注意文言の表示位置」</a>の変更 や <a href="#tsa_caution_message">「コメント欄の下に表示される注意文言」</a>を空白にすること を試してみて下さい。<br />
@@ -697,7 +712,7 @@ function addIpAddresses(newAddressStr) {
697
  <tr valign="top">
698
  <th scope="row">日本語文字列規定値未満エラー時に表示される文言<br />(元の記事に戻ってくる時間の間のみ表示)</th>
699
  <td><input type="text" name="tsa_error_message" size="80"
700
- value="<?php echo get_option('tsa_error_message', $default_error_msg);?>" /><br />(初期設定:<?php echo $default_error_msg;?>)</td>
701
  </tr>
702
  </table>
703
  <h3>URL文字列除外 設定</h3>
@@ -705,26 +720,28 @@ function addIpAddresses(newAddressStr) {
705
  <tr valign="top">
706
  <th scope="row">URLらしき文字列が混入している場合エラーとするか</th>
707
  <td><?php
708
- $chk_1 = "";
709
- $chk_2 = "";
710
- if (get_option('tsa_url_count_on_flg', "1") == "2") {
711
- $chk_2 = " checked=\"checked\"";
712
- } else {
713
- $chk_1 = " checked=\"checked\"";
714
- }
715
- ?> <label><input type="radio"
716
- name="tsa_url_count_on_flg" value="1" <?php echo $chk_1;?> />&nbsp;する</label>&nbsp;
717
  <label><input type="radio" name="tsa_url_count_on_flg" value="2"
718
- <?php echo $chk_2;?> />&nbsp;しない</label><br /> する場合の制限数(入力数値まで許容):<input
719
  type="text" name="tsa_ok_url_count" size="2"
720
- value="<?php echo get_option('tsa_ok_url_count', $default_ok_url_count);?>" />
 
721
  </td>
722
  </tr>
723
  <tr valign="top">
724
  <th scope="row">URLらしき文字列混入数オーバーエラー時に表示される文言 (元の記事に戻ってくる時間の間のみ表示)</th>
725
  <td><input type="text" name="tsa_url_count_over_error_message"
726
  size="80"
727
- 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>
 
728
  </tr>
729
  </table>
730
  <h3>NGキーワード / 必須キーワード 制御設定</h3>
@@ -733,25 +750,27 @@ function addIpAddresses(newAddressStr) {
733
  <th scope="row">その他NGキーワード<br />(日本語でも英語(その他)でもNGとしたいキーワードを半角カンマ区切りで複数設定できます。<br />挙動は同じです。NGキーワードだけでも使用できます。)
734
  </th>
735
  <td><input type="text" name="tsa_ng_keywords" size="80"
736
- value="<?php echo get_option('tsa_ng_keywords', "");?>" /></td>
737
  </tr>
738
  <tr valign="top">
739
  <th scope="row">NGキーワードエラー時に表示される文言<br />(元の記事に戻ってくる時間の間のみ表示)
740
  </th>
741
  <td><input type="text" name="tsa_ng_key_error_message" size="80"
742
- value="<?php echo get_option('tsa_ng_key_error_message', $default_ng_key_error_msg);?>" /><br />(初期設定:<?php echo $default_ng_key_error_msg;?>)</td>
 
743
  </tr>
744
  <tr valign="top">
745
  <th scope="row">その上での必須キーワード<br />(日本語でも英語(その他)でも必須としたいキーワードを半角カンマ区切りで複数設定できます。<br />指定文字列を含まない場合はエラーとなります。※複数の方が厳しくなります。<br />必須キーワードだけでも使用できます。)
746
  </th>
747
  <td><input type="text" name="tsa_must_keywords" size="80"
748
- value="<?php echo get_option('tsa_must_keywords', "");?>" /></td>
749
  </tr>
750
  <tr valign="top">
751
  <th scope="row">必須キーワードエラー時に表示される文言<br />(元の記事に戻ってくる時間の間のみ表示)
752
  </th>
753
  <td><input type="text" name="tsa_must_key_error_message" size="80"
754
- value="<?php echo get_option('tsa_must_key_error_message', $default_must_key_error_msg);?>" /><br />(初期設定:<?php echo $default_must_key_error_msg;?>)</td>
 
755
  </tr>
756
  </table>
757
  <h3>トラックバックへの対応設定</h3>
@@ -759,32 +778,34 @@ function addIpAddresses(newAddressStr) {
759
  <tr valign="top">
760
  <th scope="row">上記設定をトラックバック記事にも採用する</th>
761
  <td><?php
762
- $chk_1 = "";
763
- $chk_2 = "";
764
- if (get_option('tsa_tb_on_flg', "2") == "2") {
765
- $chk_2 = " checked=\"checked\"";
766
- } else {
767
- $chk_1 = " checked=\"checked\"";
768
- }
769
- ?> <label><input type="radio" name="tsa_tb_on_flg"
770
- value="1" <?php echo $chk_1;?> />&nbsp;する</label>&nbsp; <label><input
771
- type="radio" name="tsa_tb_on_flg" value="2" <?php echo $chk_2;?> />&nbsp;しない</label>
 
772
  </td>
773
  </tr>
774
  <tr valign="top">
775
- <th scope="row">トラックバック記事にも採用する場合、ついでにこちらのURLが含まれているか判断する<br />(初期設定:「しない」)
776
  </th>
777
  <td><?php
778
- $chk_1 = "";
779
- $chk_2 = "";
780
- if (get_option('tsa_tb_url_flg', "2") == "2") {
781
- $chk_2 = " checked=\"checked\"";
782
- } else {
783
- $chk_1 = " checked=\"checked\"";
784
- }
785
- ?> <label><input type="radio" name="tsa_tb_url_flg"
786
- value="1" <?php echo $chk_1;?> />&nbsp;する</label>&nbsp; <label><input
787
- type="radio" name="tsa_tb_url_flg" value="2" <?php echo $chk_2;?> />&nbsp;しない</label>
 
788
  </td>
789
  </tr>
790
  </table>
@@ -793,43 +814,45 @@ function addIpAddresses(newAddressStr) {
793
  <tr valign="top">
794
  <th scope="row">SPAMブラックリスト利用</th>
795
  <td><?php
796
- $chk = "";
797
- if (get_option('tsa_spam_champuru_flg', "") == "1" ) {
798
- $chk = "checked=\"checked\"";
799
  }
800
  ?>
801
- <label><input type="checkbox" name="tsa_spam_champuru_flg" value="1" <?php echo $chk; ?> /><a href="http://spam-champuru.livedoor.com/dnsbl/">スパムちゃんぷるーDNSBL</a>に登録されているIPアドレスからのコメントを拒否する</label>
 
802
  </td>
803
  </tr>
804
  <tr valign="top">
805
  <th scope="row">WordPressのコメントで「スパム」にしたIPからの投稿にも採用する</th>
806
  <td><?php
807
- $chk = "";
808
- if (get_option('tsa_ip_block_from_spam_chk_flg', "") == "1") {
809
- $chk = "checked=\"checked\"";
810
- }
811
- ?> <label><input type="checkbox"
812
- name="tsa_ip_block_from_spam_chk_flg" value="1"
813
- <?php echo $chk; ?> />&nbsp;スパム投稿設定したIPアドレスからの投稿も無視する</label>&nbsp;※Akismet等で自動的にスパムマークされたものも含む<br />
 
814
  <?php
815
  // wp_commentsの comment_approved カラムが「spam」のIP_ADDRESSからの投稿は無視する
816
  $results = $wpdb->get_results("SELECT DISTINCT comment_author_IP FROM $wpdb->comments WHERE comment_approved = 'spam' ORDER BY comment_author_IP ASC ");
817
  ?>現在「spam」フラグが付いているIPアドレス:<br />
818
  <blockquote>
819
  <?php
820
- $add_ip_addresses = "";
821
- foreach ($results as $item) {
822
- $spam_ip = $item->comment_author_IP;
823
- // ブロックしたいIP
824
- if ( strlen( $add_ip_addresses ) > 0 ) {
825
- $add_ip_addresses .= ",";
826
- }
827
- $add_ip_addresses .= $spam_ip;
828
- ?>
829
- <b><?php echo $spam_ip; ?> </b><br />
830
  <?php
831
- }
832
- ?>
833
  &nbsp;<input type="button"
834
  onclick="javascript:addIpAddresses('<?php echo $add_ip_addresses; ?>');"
835
  value="これらのIPアドレスを任意のブロック対象IPアドレスにコピーする" /><br />
@@ -840,14 +863,14 @@ function addIpAddresses(newAddressStr) {
840
  <th scope="row">任意のIPアドレスからの投稿も無視したい場合、対象となるIPアドレスを記述してください。<br />改行区切りで複数設定できます。(半角数字とスラッシュ、ドットのみ)<br />※カンマは自動的に改行に変換されます
841
  </th>
842
  <td><textarea name="tsa_block_ip_addresses"
843
- id="tsa_block_ip_addresses" cols="80" rows="10"><?php echo get_option('tsa_block_ip_addresses', "");?></textarea></td>
844
  </tr>
845
  <tr valign="top">
846
  <th scope="row">ブロック対象のIPアドレスからの投稿時に表示される文言<br />(元の記事に戻ってくる時間の間のみ表示)
847
  </th>
848
  <td><input type="text" name="tsa_block_ip_address_error_message"
849
  size="80"
850
- 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>
851
  </tr>
852
  <tr style="background-color: #fefefe;"><td colspan="2">※上記のスパムチェックから除外するIPアドレスがあれば下記に設定してください。優先的に通過させます。<br />※トラックバックは優先通過ではありません。</td></tr>
853
  <tr style="background-color: #fefefe;" valign="top">
@@ -855,7 +878,7 @@ function addIpAddresses(newAddressStr) {
855
  <td>
856
  ※ここに登録したIPアドレスはスパムフィルタを掛けず優先的に通します。<br />※日本語以外の言語でご利用になられるお客様のIPアドレスを登録するなどご利用ください。<br />改行区切りで複数設定できます。範囲指定も可能です。(半角数字とスラッシュ、ドットのみ)
857
  <textarea name="tsa_white_ip_addresses"
858
- id="tsa_white_ip_addresses" cols="80" rows="10"><?php echo get_option('tsa_white_ip_addresses', "");?></textarea>
859
  </td>
860
  </tr>
861
 
@@ -865,7 +888,7 @@ function addIpAddresses(newAddressStr) {
865
  <table class="form-table">
866
  <tr valign="top">
867
  <td>
868
- <textarea name="tsa_memo" style="width: 80%;" rows="10"><?php echo get_option('tsa_memo', ""); ?></textarea>
869
 
870
  </td>
871
  </tr>
@@ -875,13 +898,14 @@ function addIpAddresses(newAddressStr) {
875
  <tr valign="top">
876
  <th scope="row">スパムコメント投稿情報を保存しますか?</th>
877
  <td><?php
878
- $chk = "";
879
- if (get_option('tsa_spam_data_save', "") == "1") {
880
- $chk = "checked=\"checked\"";
881
- }
882
- ?> <label><input type="checkbox"
883
- name="tsa_spam_data_save" value="1" <?php echo $chk; ?> />&nbsp;スパムコメント情報を保存する</label><br />※Throws
884
- SPAM Away設定画面表示時に時間がかかることがあります。<br />※「保存する」を解除した場合でもテーブルは残りますので<?php echo get_option('tsa_spam_keep_day_count', $default_spam_keep_day_count); ?>日以内の取得データは表示されます。
 
885
  </td>
886
  </tr>
887
  <tr>
@@ -889,15 +913,15 @@ function addIpAddresses(newAddressStr) {
889
  <td>
890
  <input
891
  type="text" name="tsa_spam_keep_day_count" size="3"
892
- value="<?php echo get_option('tsa_spam_keep_day_count', $default_spam_keep_day_count); ?>" />日分(最低7日)&nbsp;
893
  <?php
894
- $chk = "";
895
- if (get_option('tsa_spam_data_delete_flg', "") == "1") {
896
- $chk = "checked=\"checked\"";
897
  }
898
  ?>
899
- <label><input type="checkbox" name="tsa_spam_data_delete_flg" value="1"
900
- <?php echo $chk; ?> />&nbsp;期間が過ぎたデータを削除する</label><br />
901
  ※一度消したデータは復活出来ませんのでご注意ください。また最低7日分は保存されます。
902
  </td>
903
  </tr>
@@ -909,21 +933,22 @@ function addIpAddresses(newAddressStr) {
909
  <tr>
910
  <th scope="row">機能設定</th>
911
  <td><?php
912
- $chk = "";
913
- if (get_option('tsa_spam_limit_flg', "") == "1") {
914
- $chk = "checked=\"checked\"";
915
  }
916
- ?> <label><input type="checkbox" name="tsa_spam_limit_flg" value="1"
917
- <?php echo $chk; ?> />&nbsp;機能させる</label><br /> 一定時間:<input
918
  type="text" name="tsa_spam_limit_minutes" size="3"
919
- value="<?php echo get_option('tsa_spam_limit_minutes', $default_spam_limit_minutes); ?>" />分以内に
920
  一定回数:<input type="text" name="tsa_spam_limit_count" size="3"
921
- value="<?php echo get_option('tsa_spam_limit_count', $default_spam_limit_count); ?>" />回スパムとなったら<b>次から</b>
922
  一定時間:<input type="text" name="tsa_spam_limit_over_interval" size="3"
923
- value="<?php echo get_option('tsa_spam_limit_over_interval', $default_spam_limit_over_interval); ?>" />分間<br />
 
924
  当該IPアドレスからのコメントを強制スパム扱いします。<br /> エラーメッセージは:<input type="text"
925
  name="tsa_spam_limit_over_interval_error_message" size="80"
926
- value="<?php echo get_option('tsa_spam_limit_over_interval_error_message', $default_spam_limit_over_interval_error_msg); ?>" /><br />
927
  (初期設定:<?php echo $default_spam_limit_over_interval_error_msg; ?>)
928
  </td>
929
  </tr>
@@ -941,66 +966,66 @@ function addIpAddresses(newAddressStr) {
941
  <?php
942
  }
943
 
944
- function trackback_spam_away($tb) {
945
- global $newThrowsSpamAway;
946
-
947
- $tsa_tb_on_flg = get_option( 'tsa_tb_on_flg' );
948
- $tsa_tb_url_flg = get_option( 'tsa_tb_url_flg' );
949
- $siteurl = get_option('siteurl');
950
- // トラックバック OR ピンバック時にフィルタ発動
951
- if ( $tsa_tb_on_flg == "2" || ( $tb['comment_type'] != 'trackback' && $tb['comment_type'] != 'pingback' ) ) return $tb;
952
-
953
- // SPAMかどうかフラグ
954
- $tb_val['is_spam'] = FALSE;
955
-
956
- // コメント判定
957
- $author = $tb["comment_author"];
958
- $comment = $tb["comment_content"];
959
- $post_id = $tb["comment_post_ID"];
960
- // IP系の検査
961
- $ip = $_SERVER['REMOTE_ADDR'];
962
- if ( !$newThrowsSpamAway->ip_check( $ip ) ) {
963
- $tb_val['is_spam'] = TRUE;
964
- } else
965
- // 検査します!
966
- if ( !$newThrowsSpamAway->validation( $comment, $author ) ) {
967
- $tb_val['is_spam'] = TRUE;
968
- } else
969
- // URL検索する場合、URL包含検査 (このブログのURLを含んでない場合エラー
970
- if ( $tsa_tb_url_flg == "1" && stripos( $comment, $siteurl ) == FALSE ) {
971
- $tb_val['is_spam'] = TRUE; // スパム扱い
972
- }
973
- // トラックバックスパムがなければ返却・あったら捨てちゃう
974
- if ( !$tb_val['is_spam'] ) {
975
- // トラックバック内に日本語存在(または禁止語句混入なし)
976
- return $tb;
977
- } else {
978
- if ( get_option( 'tsa_spam_data_save', $default_spam_data_save ) == "1" ) {
979
  $spam_contents = array();
980
- $spam_contents['error_type'] = "spam_trackback";
981
- $spam_contents['author'] = mb_strcut(strip_tags($author), 0, 255);
982
- $spam_contents['comment'] = mb_strcut(strip_tags($comment), 0, 255);
983
 
984
  $this->save_post_meta( $post_id, $ip, $spam_contents );
985
  }
986
- die( 'Your Trackback Throws Away.' );
987
- }
988
- }
989
-
990
- /**
991
- * 当該IPアドレスからの最終投稿日時取得
992
- * @param string ip_address
993
- * @return 最終投稿日時 Y-m-d H:i:s
994
- */
995
- function get_last_spam_comment($ip_address = NULL) {
996
  global $wpdb;
997
  // IPアドレスがなければNULL返却
998
  if ( $ip_address == NULL ) {
999
  return NULL;
1000
  }
1001
  // 最終コメント情報取得
1002
- $qry_str = "SELECT post_date, post_id FROM $this->table_name WHERE ip_address = '".htmlspecialchars($ip_address)."' ORDER BY post_date DESC LIMIT 1 ";
1003
- $results = $wpdb->get_results($qry_str);
1004
  if ( count( $results ) > 0 ) {
1005
  return $results[0];
1006
  }
@@ -1015,10 +1040,16 @@ function addIpAddresses(newAddressStr) {
1015
  function spams_list() {
1016
  global $wpdb;
1017
  $_saved = FALSE;
 
 
 
 
 
 
1018
  // スパム情報から 特定IPアドレス削除
1019
  if ( $_POST['act'] != NULL && $_POST['act'] == "remove_ip" ) {
1020
- $remove_ip_address = @htmlspecialchars($_POST['ip_address']);
1021
- if ( !isset($remove_ip_address) || strlen($remove_ip_address) == 0 ) {
1022
  // N/A
1023
  } else {
1024
  // スパムデータベースから特定IP情報削除
@@ -1029,14 +1060,11 @@ function addIpAddresses(newAddressStr) {
1029
  $message = "スパムデータから $remove_ip_address のデータを削除しました。";
1030
  }
1031
  } elseif ( $_POST['act'] != NULL && $_POST['act'] == "add_ip" ) {
1032
- $add_ip_address = @htmlspecialchars($_POST['ip_address']);
1033
- if ( !isset($add_ip_address) || strlen($add_ip_address) == 0 ) {
1034
  // N/A
1035
  } else {
1036
  // 対象IPアドレスに一つ追加
1037
- $block_ip_addresses_str = get_option('tsa_block_ip_addresses', '');
1038
- $block_ip_addresses = str_replace("\n", ",", $block_ip_addresses_str);
1039
- $ip_list = mb_split( ",", $block_ip_addresses );
1040
  $dup_flg = FALSE;
1041
  foreach ( $ip_list as $ip ) {
1042
  if ( $ip == trim($add_ip_address) ) {
@@ -1054,13 +1082,19 @@ function addIpAddresses(newAddressStr) {
1054
  }
1055
  }
1056
  }
1057
- if ( $_GET['settings-updated'] == "true" ) {
 
 
 
 
 
 
1058
  $_saved = TRUE;
1059
  }
1060
  ?>
1061
  <div class="wrap">
1062
  <?php
1063
- if ( get_option( 'tsa_spam_data_save' ) == "1" ) {
1064
  // 日数
1065
  $gdays = get_option( 'tsa_spam_keep_day_count', $default_spam_keep_day_count);
1066
  if ( $gdays < $lower_spam_keep_day_count ) { $gdays = $lower_spam_keep_day_count; }
@@ -1070,8 +1104,8 @@ function addIpAddresses(newAddressStr) {
1070
  ?>
1071
  <h2>Throws SPAM Away スパムデータ</h2>
1072
  <h3>スパム投稿<?php echo $gdays; ?>日間の推移</h3>
1073
- <?php if ($_saved) { ?>
1074
- <div class="updated" style="padding: 10px; width: 50%;" id="message"><?php echo $message; ?></div>
1075
  <?php } ?>
1076
  <div style="background-color: #efefef;">
1077
  <table style="width: 100%; border: none;">
@@ -1080,12 +1114,12 @@ function addIpAddresses(newAddressStr) {
1080
  $total_qry = "
1081
  SELECT count(ppd) as pageview, ppd
1082
  FROM (select ip_address, SUBSTRING(post_date,1,10) as ppd from $this->table_name) as A
1083
- GROUP BY ppd HAVING ppd >= '".gmdate('Y-m-d', current_time('timestamp')-86400*$gdays)."'
1084
  ORDER BY pageview DESC
1085
  LIMIT 1
1086
  ";
1087
- $qry = $wpdb->get_row($total_qry);
1088
- $maxxday=$qry->pageview;
1089
 
1090
  $total_vis = "
1091
  SELECT count(distinct ip_address) as vis, ppd
@@ -1094,7 +1128,7 @@ function addIpAddresses(newAddressStr) {
1094
  ORDER BY vis DESC
1095
  LIMIT 1
1096
  ";
1097
- $qry_vis = $wpdb->get_row($total_vis);
1098
  $maxxday += $qry_vis->vis;
1099
 
1100
  if ( $maxxday == 0 ) {
@@ -1108,38 +1142,37 @@ function addIpAddresses(newAddressStr) {
1108
  $visitor_qry = "
1109
  SELECT count(DISTINCT ip_address) AS total
1110
  FROM (select ip_address, SUBSTRING(post_date,1,10) as ppd from $this->table_name) as B
1111
- WHERE ppd = '".gmdate('Y-m-d', current_time('timestamp')-86400*$gg)."'
1112
  ";
1113
- $qry_visitors = $wpdb->get_row($visitor_qry);
1114
- $px_visitors = round($qry_visitors->total*100/$maxxday);
1115
  // TOTAL
1116
  $pageview_qry = "
1117
  SELECT count(ppd) as total
1118
  FROM (select ip_address, SUBSTRING(post_date,1,10) as ppd from $this->table_name) as C
1119
- WHERE ppd = '".gmdate('Y-m-d', current_time('timestamp')-86400*$gg)."'
1120
  ";
1121
- $qry_pageviews = $wpdb->get_row($pageview_qry);
1122
- $px_pageviews = round($qry_pageviews->total*100/$maxxday);
1123
  $px_white = 100 - $px_pageviews - $px_visitors;
1124
- if ($px_white < 0) {
1125
- $px_white = 0;
1126
- }
1127
 
1128
- print '<td width="'.$gd.'" valign="bottom"';
1129
- if($start_of_week == gmdate('w',current_time('timestamp')-86400*$gg)) {
1130
- print ' style="border-left:2px dotted gray;"';
1131
- } # week-cut
1132
- print "><div style='float:left;width:100%;font-family:Helvetica;font-size:7pt;text-align:center;border-right:1px solid white;color:black;'>
1133
  <div style='background:#ffffff;width:100%;height:".$px_white."px;'></div>
1134
  <div style='background:$unique_color;width:100%;height:".$px_visitors."px;' title='".$qry_visitors->total." ip_addresses'></div>
1135
  <div style='background:$web_color;width:100%;height:".$px_pageviews."px;' title='".$qry_pageviews->total." spam comments'></div>
1136
  <div style='background:gray;width:100%;height:1px;'></div>
1137
- <br />".gmdate('d', current_time('timestamp')-86400*$gg) . '<br />' . gmdate('M', current_time('timestamp')-86400*$gg) ."
1138
  <div style='background:$ffffff;width:100%;height:2.2em;'>".$qry_visitors->total."<br />".$qry_pageviews->total."</div>
1139
  <br clear=\"all\" /></div>
1140
  </td>\n";
1141
- }
1142
- ?>
1143
  </tr>
1144
  </table>
1145
  </div>
@@ -1164,11 +1197,11 @@ function addIpAddresses(newAddressStr) {
1164
  <p>※IPアドレスをクリックすると特定のホストが存在するか確認し存在する場合は表示されます。</p>
1165
  <p>「スパムデータから削除する」ボタンを押しますと該当IPアドレスのスパム投稿データが削除されます。テストしたあとの削除などに使用してください。</p>
1166
  <?php if ( count( $results ) > 0 ) {
1167
- $p_url = WP_PLUGIN_URL.'/'.str_replace(basename( __FILE__),"",plugin_basename(__FILE__));
1168
- wp_enqueue_script("jquery.tablesorter", $p_url."js/jquery.tablesorter.min.js", array('jquery'), FALSE);
1169
- wp_enqueue_style("jquery.tablesorter", $p_url."images/style.css");
1170
- wp_enqueue_script("jquery.tipTip", $p_url."js/jquery.tipTip.js", array('jquery'), FALSE);
1171
- wp_enqueue_style("jquery.tipTip", $p_url."css/tipTip.css");
1172
  ?>
1173
  <style type="text/css">
1174
  <!--
@@ -1307,9 +1340,9 @@ function addIpAddresses(newAddressStr) {
1307
 
1308
  .cols0 { width: 200px; }
1309
  .cols1 { width: 50px; }
1310
- .cols2 { width: 100px; }
1311
- .cols3 { width: 380px; }
1312
- .cols4 { width: 170px; }
1313
 
1314
  -->
1315
  </style>
@@ -1327,22 +1360,22 @@ function addIpAddresses(newAddressStr) {
1327
  });
1328
  // tipTip
1329
  jQuery(".tip").tipTip({
1330
- activation: "hover", // hover か focus か click で起動
1331
- keepAlive: "true", // true か false true だとずっと出ている。
1332
- maxWidth: "auto", //ツールチップ最大幅
1333
- edgeOffset: 10, //要素からのオフセット距離
1334
- defaultPosition: "left", // デフォルト表示位置 bottom(default) か top か left か right
1335
- fadeIn: 300, // フェードインのスピード
1336
- fadeOut: 500 // フェードアウトのスピード
1337
  });
1338
  jQuery(".tip_click").tipTip({
1339
- activation: "click", // hover か focus か click で起動
1340
- keepAlive: "true", // true か false true だとずっと出ている。
1341
- maxWidth: "auto", //ツールチップ最大幅
1342
- edgeOffset: 10, //要素からのオフセット距離
1343
- defaultPosition: "left", // デフォルト表示位置 bottom(default) か top か left か right
1344
- fadeIn: 300, // フェードインのスピード
1345
- fadeOut: 500 // フェードアウトのスピード
1346
  });
1347
 
1348
  });
@@ -1385,59 +1418,68 @@ function addIpAddresses(newAddressStr) {
1385
  </tr>
1386
  </thead>
1387
  <tbody>
1388
- <?php
1389
- foreach ($results as $item) {
1390
  $spam_ip = $item->ip_address;
1391
  $spam_cnt = $item->cnt;
1392
  $last_post_date = $item->post_date;
1393
  $spam_error_type = $item->error_type;
1394
- $spam_author = strip_tags($item->author);
1395
- $spam_comment = strip_tags($item->comment);
1396
 
1397
  // エラー変換
1398
  $spam_error_type_str = $spam_error_type;
1399
- switch ($spam_error_type) {
1400
- case "not_japanese":
1401
- $spam_error_type_str = "日本語以外";
1402
  break;
1403
- case "must_word":
1404
- $spam_error_type_str = "必須キーワード無し";
1405
  break;
1406
- case "ng_word":
1407
- $spam_error_type_str = "NGキーワード混入";
1408
  break;
1409
- case "block_ip":
1410
- $spam_error_type_str = "ブロック対象IPアドレス";
1411
  break;
1412
- case "spam_trackback":
1413
- $spam_error_type_str = "トラックバックスパム";
1414
  break;
1415
- case "url_count_over":
1416
- $spam_error_type_str = "URL文字列混入数オーバー";
1417
  break;
1418
- case "spam_limit_over":
1419
- $spam_error_type_str = "一定時間スパム判定エラー";
1420
  break;
1421
- case "dummy_param_field":
1422
- $spam_error_type_str = "ダミー項目エラー";
1423
  break;
1424
  }
1425
- ?>
1426
  <tr>
1427
  <td>
1428
  <b><a href="javascript:void(0);"
1429
- onclick="window.open('<?php echo $p_url; ?>hostbyip.php?ip=<?php echo $spam_ip; ?>', 'hostbyip', 'width=350,height=300,scrollbars=no,location=no,menubar=no,toolbar=no,directories=no,status=no');"><?php echo $spam_ip; ?>
1430
  </a></b><br clear="all" />
1431
  <input type="button"
1432
- onclick="javascript:removeIpAddressOnData('<?php echo $spam_ip; ?>');"
1433
  value="スパムデータから削除する" />
1434
  </td>
1435
- <td><?php echo $spam_cnt; ?>回</td>
1436
- <td><?php echo $last_post_date; ?></td>
1437
- <td><input type="button"
1438
- onclick="javascript:addIpAddressOnData('<?php echo $spam_ip; ?>');"
1439
- value="ブロック対象IPアドレス追加[<?php echo $spam_ip; ?>]" /></td>
1440
- <td><?php echo $spam_error_type_str; ?><?php if ($spam_author != NULL && $spam_comment != NULL) { ?>&nbsp;<a name="<?php echo $spam_ip; ?>" class="tip tip_click" title="名前:<?php echo $spam_author; ?><br />内容:<?php echo $spam_comment; ?>">●</a><?php } ?>
 
 
 
 
 
 
 
 
 
1441
  </td>
1442
  </tr>
1443
  <?php
@@ -1461,10 +1503,18 @@ function addIpAddresses(newAddressStr) {
1461
  <input type="hidden" name="act" value="add_ip" />
1462
  </form>
1463
  <p>スパム投稿IPアドレスを参考にアクセス禁止対策を行なってください。</p>
 
 
 
 
1464
 
1465
-
1466
- </div>
1467
- <br clear="all" />
 
 
 
 
1468
  <?php
1469
  }
1470
 
10
 
11
  // version
12
  var $version = '2.6';
13
+ var $table_name = NULL;
14
 
15
  public function __construct() {
16
  global $default_spam_data_save;
24
  global $lower_spam_keep_day_count;
25
 
26
  // 保存期間終了したデータ削除
27
+ $skdc = intval( get_option( 'tsa_spam_keep_day_count', $default_spam_keep_day_count ) );
28
  if ( $skdc < $lower_spam_keep_day_count ) { $skdc = $lower_spam_keep_day_count; }
29
+ if ( get_option( 'tsa_spam_data_delete_flg', '' ) == '1' ) {
30
+ // 期間 get_option( 'tsa_spam_keep_day_count' ) 日
31
  $wpdb->query(
32
+ 'DELETE FROM '.$this->table_name." WHERE post_date < '".gmdate( 'Y-m-d 23:59:59', current_time( 'timestamp' ) - 86400 * $skdc )."'"
33
  );
34
  }
35
  }
38
  * スパム投稿テーブル作成
39
  * $flg がTRUEなら強制的にテーブル作成
40
  */
41
+ function tsa_create_tbl() {
42
  global $wpdb;
43
  global $tsa_db_version;
44
 
45
  // テーブル作成要フラグ
46
  $flg = FALSE;
47
+ if ( $wpdb->get_var( "SHOW TABLES LIKE '$this->table_name'" ) != $this->table_name ) {
48
  // テーブルが存在しないため作成する
49
  $flg = TRUE;
50
  }
54
  //現在のDBバージョン取得
55
  $installed_ver = get_option( 'tsa_meta_version', 0 );
56
  // DBバージョンが低い または テーブルが存在しない場合は作成
57
+ if ( $flg == TRUE || $installed_ver < $tsa_db_version ) {
58
  // dbDeltaのおかげ様でCREATE文のみ
59
+ $sql = "CREATE TABLE $this->table_name (
60
  meta_id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
61
  post_id bigint(20) UNSIGNED DEFAULT '0' NOT NULL,
62
  ip_address varchar(64),
82
  function save_post_meta( $post_id, $ip_address, $spam_contents ) {
83
  global $default_spam_data_save;
84
 
85
+ if ( get_option( 'tsa_spam_data_save', $default_spam_data_save ) != '1' ) return;
86
 
87
  global $wpdb;
88
 
89
  $error_type = $spam_contents['error_type'];
90
+ $author = strip_tags( $spam_contents['author'] );
91
+ $comment = strip_tags( $spam_contents['comment'] );
92
 
93
  //保存するために配列にする
94
  $set_arr = array(
96
  'ip_address' => $ip_address,
97
  'error_type' => $error_type,
98
  'author' => $author,
99
+ 'comment' => $comment,
100
  );
101
 
102
  //レコード新規追加
109
  function tsa_scripts_init() {
110
  global $tsa_version;
111
  // anti-spam の方法を参考に作成しました
112
+ if ( ! is_admin() ) {
113
+ wp_enqueue_script( 'throws-spam-away-script', plugins_url( '/js/tsa_params.min.js', __FILE__ ), array( 'jquery' ), $tsa_version );
114
  }
115
  }
116
 
128
  function comment_form_dummy_param_field() {
129
  global $default_dummy_param_field_flg;
130
  // 空パラメータフィールド作成
131
+ $dummy_param_field_flg = get_option( 'tsa_dummy_param_field_flg', $default_dummy_param_field_flg );
132
+ if ( $dummy_param_field_flg == '1' ) {
133
  echo '<p class="tsa_param_field_tsa_" style="display:none;">email confirm<span class="required">*</span><input type="text" name="tsa_email_param_field___" id="tsa_email_param_field___" size="30" value="" />
134
  </p>';
135
+ echo '<p class="tsa_param_field_tsa_2">post date<span class="required">*</span><input type="text" name="tsa_param_field_tsa_3" id="tsa_param_field_tsa_3" size="30" value="'.date( 'Y-m-d H:i:s' ).'" />
136
  </p>';
137
  }
138
  return TRUE;
151
  global $error_type;
152
 
153
  // ログインしている場合は通過させます。
154
+ if ( $user_ID ) {
155
  return $id;
156
  }
157
  // コメント(comment)及び名前(author)の中も検査
158
+ $author = esc_attr( $_POST['author'] );
159
+ $comment = esc_attr( $_POST['comment'] );
160
 
161
  // チェック対象IPアドレス
162
  $ip = $_SERVER['REMOTE_ADDR'];
163
 
164
  // ホワイトリスト優先通過
165
  // IP制御 任意のIPアドレスをあればブロックする
166
+ $white_ip_addresses = get_option( 'tsa_white_ip_addresses', '' );
167
+ if ( $white_ip_addresses != NULL && $white_ip_addresses != '' ) {
168
  // 改行区切りの場合はカンマ区切りに文字列置換後リスト化
169
+ $white_ip_addresses = str_replace( "\n", ',', $white_ip_addresses );
170
+ $ip_list = mb_split( ',', $white_ip_addresses );
171
  foreach ( $ip_list as $_ip ) {
172
  // 指定IPが範囲指定の場合 例:192.168.1.0/24
173
+ if ( strpos( $_ip, '/' ) != FALSE ) {
174
+ if ( $this->in_cidr( $ip, $_ip ) ) {
175
  // 通過対象
176
  return $id;
177
  }
182
  }
183
  }
184
  // IP系の検査
185
+ if ( ! $newThrowsSpamAway->ip_check( $ip ) ) {
186
  // アウト!
187
  } else
188
  // コメント検査
189
+ if ( $newThrowsSpamAway->validation( $comment, $author ) ) {
190
  return $id;
191
  }
192
+ $error_msg = '';
193
  switch ( $error_type ) {
194
+ case 'must_word' :
195
  $error_msg = get_option( 'tsa_must_key_error_message', $default_must_key_error_msg );
196
  break;
197
+ case 'ng_word' :
198
  $error_msg = get_option( 'tsa_ng_key_error_message', $default_ng_key_error_msg );
199
  break;
200
+ case 'block_ip' :
201
  $error_msg = get_option( 'tsa_block_ip_address_error_message', $default_block_ip_address_error_msg );
202
  break;
203
+ case 'url_count_over' :
204
  $error_msg = get_option( 'tsa_url_count_over_error_message', $default_url_count_over_error_msg );
205
  break;
206
+ case 'spam_limit_over' :
207
  $error_msg = get_option( 'tsa_spam_limit_over_interval_error_message', $default_spam_limit_over_interval_error_msg );
208
  break;
209
+ case 'dummy_param_field' : // ダミーフィールドの場合は通常メッセージ
210
  default :
211
  $error_msg = get_option( 'tsa_error_message', $default_error_msg );
212
  }
213
  // 記録する場合はDB記録
214
+ if ( get_option( 'tsa_spam_data_save', $default_spam_data_save ) == '1' ) {
215
  $spam_contents = array();
216
  $spam_contents['error_type'] = $error_type;
217
+ $spam_contents['author'] = mb_strcut( $author, 0, 255 );
218
+ $spam_contents['comment'] = mb_strcut( $comment, 0, 255 );
219
 
220
  $this->save_post_meta( $id, $ip, $spam_contents );
221
  }
223
  $back_time = ( (int) get_option( 'tsa_back_second', $default_back_second ) ) * 1000;
224
  // タイム値が0なら元画面へそのままリダイレクト
225
  if ( $back_time == 0 ) {
226
+ header( 'Location:'.$_SERVER['HTTP_REFERER'] );
227
  die;
228
  } else {
229
+ wp_die( __( $error_msg.'<script type="text/javascript">window.setTimeout(location.href=\''.$_SERVER['HTTP_REFERER'].'\', '.$back_time.');</script>', 'throws-spam-away' ) );
230
  }
231
  }
232
 
236
  */
237
  function ip_check( $target_ip ) {
238
  global $wpdb; // WordPress DBアクセス
239
+ global $default_spam_champuru_flg; // すぱむちゃんぷるー利用初期値
240
  global $newThrowsSpamAway;
241
  global $error_type;
242
  // スパムフィルター利用あれば始めに通す
243
  // 1.スパムちゃんぷるー
244
+ $spam_filter_spam_champuru_flg = get_option( 'tsa_spam_champuru_flg', $default_spam_champuru_flg );
245
+ if ( get_option( 'tsa_spam_champuru_flg', '' ) == '1' ) {
246
+ return $this->reject_spam_ip( $target_ip );
247
  }
248
  // 2.以降あれば追加
249
 
250
  // IP制御 WordPressのスパムチェックにてスパム扱いしている投稿のIPをブロックするか
251
  $ip_block_from_spam_chk_flg = get_option( 'tsa_ip_block_from_spam_chk_flg' );
252
 
253
+ if ( $ip_block_from_spam_chk_flg === '1' ) {
254
  // wp_commentsの comment_approved カラムが「spam」のIP_ADDRESSからの投稿は無視する
255
  $results = $wpdb->get_results( "SELECT DISTINCT comment_author_IP FROM $wpdb->comments WHERE comment_approved = 'spam' ORDER BY comment_author_IP ASC " );
256
  foreach ( $results as $item ) {
257
  if ( trim( $item->comment_author_IP ) == trim( $target_ip ) ) {
258
  // ブロックしたいIP
259
+ $error_type = 'block_ip';
260
  return FALSE;
261
  }
262
  }
263
  }
264
  // IP制御 任意のIPアドレスをあればブロックする
265
+ $block_ip_addresses = get_option( 'tsa_block_ip_addresses', '' );
266
+ if ( $block_ip_addresses != NULL && $block_ip_addresses != '' ) {
267
  // 改行区切りの場合はカンマ区切りに文字列置換後リスト化
268
+ $block_ip_addresses = str_replace( "\n", ',', $block_ip_addresses );
269
+ $ip_list = mb_split( ',', $block_ip_addresses );
270
  foreach ( $ip_list as $ip ) {
271
  // 指定IPが範囲指定の場合 例:192.168.1.0/24
272
+ if ( strpos( $ip, '/' ) != FALSE ) {
273
+ if ( $this->in_cidr( $target_ip, $ip ) ) {
274
  // ブロックしたいIP
275
+ $error_type = 'block_ip';
276
  return FALSE;
277
  }
278
  } elseif ( trim( $ip ) == trim( $target_ip ) ) {
279
  // ブロックしたいIP
280
+ $error_type = 'block_ip';
281
  return FALSE;
282
  } else {
283
  // セーフIP
290
  /**
291
  * スパムちゃんぷるー利用ブロック
292
  */
293
+ function reject_spam_ip( $ip ) {
294
  global $spam_champuru_host;
295
  global $error_type;
296
 
297
+ $spam_def_ip = '127.0.0.2';
298
+ $host = $spam_champuru_host;
299
  $pattern = '/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/';
300
+ $check_IP = trim( preg_match( $pattern, $ip ) ? $ip : $_SERVER['REMOTE_ADDR'] );
301
+ $spam = false;
302
+ if ( preg_match( $pattern, $check_IP ) ) {
303
+ $host = implode( '.',array_reverse( split( '\.',$check_IP ) ) ) . '.' . $host;
304
+ if ( function_exists( 'dns_get_record' ) ) {
305
+ $check_recs = dns_get_record( $host, DNS_A );
306
+ if ( isset( $check_recs[0]['ip'] ) ) $spam = ( $check_recs[0]['ip'] === $spam_def_ip );
307
+ unset( $check_recs );
308
+ } elseif ( function_exists( 'gethostbyname' ) ) {
309
+ $checked = ( gethostbyname( $host ) === $spam_def_ip );
310
+ } elseif ( class_exists( 'Net_DNS_Resolver' ) ) {
311
  $resolver = new Net_DNS_Resolver();
312
+ $response = $resolver->query( $host, 'A' );
313
+ if ( $response ) {
314
+ foreach ( $response->answer as $rr ) {
315
+ if ( $rr->type === 'A' ) {
316
+ $spam = ( $rr->address === $spam_def_ip );
317
  break;
318
  }
319
  }
320
  }
321
+ unset( $response );
322
+ unset( $resolver );
323
+ } elseif ( function_exists( 'checkdnsrr' ) ) {
324
+ $spam = ( checkdnsrr( $host, 'A' ) === true );
325
  }
326
  }
327
+ if ( $spam ) {
328
+ $error_type = 'block_ip';
329
  return FALSE;
330
  }
331
  return TRUE;
337
  * @param string $cidr
338
  * @return boolean
339
  */
340
+ function in_cidr( $ip, $cidr ) {
341
+ list( $network, $mask_bit_len ) = explode( '/', $cidr );
342
+ if ( ! is_nan( $mask_bit_len ) && $mask_bit_len <= 32 ) {
343
  $host = 32 - $mask_bit_len;
344
  $net = ip2long($network) >> $host << $host; // 11000000101010000000000000000000
345
+ $ip_net = ip2long($ip) >> $host << $host; // 11000000101010000000000000000000
346
  return $net === $ip_net;
347
  } else {
348
  // 形式が不正ならば無視するためFALSE
358
  function validation( $comment, $author ) {
359
  global $newThrowsSpamAway;
360
  global $error_type;
361
+ global $default_on_flg; // 日本語以外を弾くかどうか初期値
362
+ global $default_dummy_param_field_flg; // ダミー項目によるスパム判定初期値
363
+ global $default_url_count_check_flg; // URL数を制御するか初期設定値
364
+ global $default_ok_url_count; // 制限する場合のURL数初期設定値
365
  global $default_japanese_string_min_count; // 日本語文字最小含有数
366
 
367
+ // Throws SPAM Away 起動フラグ '1':起動 "2":オフ
368
+ $tsa_on_flg = get_option( 'tsa_on_flg', $default_tsa_on );
369
 
370
  // 一定時間制限チェック
371
  // 一定時間内スパム認定機能<br />○分以内に○回スパムとなったら○分間、当該IPからのコメントはスパム扱いする設定+スパム情報保存
381
  // スパム情報保存フラグ
382
  $tsa_spam_data_save = get_option( 'tsa_spam_data_save' );
383
  // 一定時間制限チェック
384
+ $tsa_spam_limit_flg = get_option( 'tsa_spam_limit_flg', '' );
385
+ if ( $tsa_spam_data_save == '1' && $tsa_spam_limit_flg == '1' ) {
386
  global $default_spam_limit_minutes;
387
  global $default_spam_limit_over_interval;
388
  global $default_spam_limit_count;
390
  $tsa_spam_limit_minutes = intval(get_option( 'tsa_spam_limit_minutes', $default_spam_limit_minutes ) );
391
  $tsa_spam_limit_over_interval = intval(get_option( 'tsa_spam_limit_over_interval', $default_spam_limit_over_interval ) );
392
  // ○分以内(インターバルの方が長い場合はインターバル値を利用する)の同一IPからのスパム投稿回数を調べる
393
+ $interval_minutes = ( $tsa_spam_limit_minutes >= $tsa_spam_limit_over_interval ? $tsa_spam_limit_minutes : $tsa_spam_limit_over_interval );
394
 
395
  // 上記が○回を超えているかチェック
396
+ $ip = htmlspecialchars( $_SERVER['REMOTE_ADDR'] );
397
  $this_ip_spam_cnt = "
398
  SELECT ip_address, count(ppd) as spam_count, max(post_date)
399
  FROM (select ip_address, post_date as ppd, post_date from $this->table_name) as A
400
  WHERE A.ip_address = '".$ip."' AND
401
+ ppd >= '".gmdate( 'Y-m-d H:i:s', current_time( 'timestamp' ) - 60 * $interval_minutes )."'
402
  GROUP BY ip_address LIMIT 1";
403
  $query = $wpdb->get_row( $this_ip_spam_cnt );
404
+ $spam_count = intval( $query->spam_count );
405
 
406
 
407
  // 最後のスパム投稿から○分超えていなければ アウト!!
408
  $tsa_spam_limit_count = intval( get_option( 'tsa_spam_limit_count', $default_spam_limit_count ) );
409
  if ( $spam_count > $tsa_spam_limit_count ) {
410
  // アウト!
411
+ $error_type = 'spam_limit_over';
412
  return FALSE;
413
  }
414
  }
415
  // ダミーフィールド使用する場合、ダミーフィールドに入力値があればエラー
416
  $tsa_dummy_param_field_flg = get_option( 'tsa_dummy_param_field_flg', $default_dummy_param_field_flg );
417
+ if ( $tsa_dummy_param_field_flg == '1') {
418
+ if ( ! empty( $_POST['tsa_param_field_tsa_3'] ) ) { // このフィールドにリクエストパラメータが入る場合はスパム判定
419
+ $error_type = 'dummy_param_field';
420
  return FALSE;
421
  }
422
  }
423
  // シングルバイトだけならエラー
424
+ if ( $tsa_on_flg != '2' && strlen( bin2hex( $comment ) ) / 2 == mb_strlen( $comment ) ) {
425
+ $error_type = 'not_japanese';
426
  return FALSE;
427
  } else {
428
  // 日本語文字列必須含有数
429
  $tsa_japanese_string_min_count = intval( get_option( 'tsa_japanese_string_min_count', $default_japanese_string_min_count ) );
430
  // NGキーワード文字列群
431
+ $tsa_ng_keywords = get_option( 'tsa_ng_keywords', '' );
432
  // キーワード文字列群 ※ブラックリストと重複するものはブラックリストのほうが優先です。
433
+ $tsa_must_keywords = get_option( 'tsa_must_keywords', '' );
434
  // URL数チェック
435
  $tsa_url_count_check = get_option( 'tsa_url_count_on_flg', $default_url_count_check_flg );
436
  // 許容URL数設定値
439
  // OKフラグ
440
  $flg = FALSE;
441
  // マルチバイト文字が含まれている場合は日本語が含まれていればOK
442
+ if ( $tsa_on_flg != '2' ) {
443
  $count_flg = 0;
444
  mb_regex_encoding('UTF-8');
445
+ $com_split = $newThrowsSpamAway->mb_str_split( $comment );
446
+ foreach ( $com_split as $it ) {
447
+ if ( preg_match('/[一-龠]+/u', $it ) ){
448
  $count_flg += 1;
449
  }
450
+ if ( preg_match('/[ァ-ヶー]+/u', $it ) ){
451
  $count_flg += 1;
452
  }
453
+ if ( preg_match('/[ぁ-ん]+/u', $it ) ){
454
  $count_flg += 1;
455
  }
456
  }
457
+ $flg = ( $tsa_japanese_string_min_count < $count_flg );
458
  if ($flg == FALSE) {
459
+ $error_type = 'not_japanese';
460
  return FALSE;
461
  }
462
  }
463
  // 日本語文字列チェック抜けたらキーワードチェックを行う
464
+ if ( $tsa_ng_keywords != '' ) {
465
+ $keyword_list = mb_split( ',', $tsa_ng_keywords );
466
  foreach ( $keyword_list as $key ) {
467
+ if ( preg_match('/'.trim( $key ).'/u', $author.$comment) ) {
468
+ $error_type = 'ng_word';
469
  return FALSE;
470
  }
471
  }
472
  }
473
  // キーワードチェック(ブラックリスト)を抜けたら必須キーワードチェックを行う
474
+ if ( $tsa_must_keywords != '' ) {
475
+ $keyword_list = mb_split( ',', $tsa_must_keywords );
476
  foreach ( $keyword_list as $key ) {
477
+ if ( preg_match( '/'.trim( $key ).'/u', $author.$comment ) ) {
478
  // OK
479
  } else {
480
  // 必須ワードがなかったためエラー
481
+ $error_type = 'must_word';
482
  return FALSE;
483
  }
484
  }
485
  }
486
  // 含有URL数チェック
487
+ if ( $tsa_url_count_check != '2' ) {
488
  if ( substr_count( strtolower( $author.$comment ), 'http') > $tsa_ok_url_count) {
489
  // URL文字列(httpの数)が多いエラー
490
+ $error_type = 'url_count_over';
491
  return FALSE;
492
  }
493
  }
504
  * Callback admin_menu
505
  */
506
  function admin_menu() {
507
+ $mincap = 'level_8';
508
+ $spam_mincap = 'level_7';
509
  if (function_exists('add_menu_page')) {
510
+ add_menu_page(__('Throws SPAM Away', 'throws-spam-away'), __('Throws SPAM Away', 'throws-spam-away'), $mincap, 'throws-spam-away', array( $this, 'options_page'));
511
  }
512
 
513
+ if (function_exists('add_submenu_page')) {
514
+ if ( get_option( 'tsa_spam_data_save' ) == '1' ) {
515
+ add_submenu_page( 'throws-spam-away', __( 'スパムデータ', 'throws-spam-away' ), __( 'スパムデータ', 'throws-spam-away' ), $spam_mincap, 'throws-spam-away/throws_spam_away.class.php', array( $this, 'spams_list' ) );
516
  }
517
+ // add_submenu_page( 'throws-spam-away', __( 'おすすめ設定', 'throws-spam-away' ), __( 'おすすめ設定', 'throws-spam_away' ), $mincap, 'throws-spam-away/throws_spam_away.class.php', array( $this, 'recommend_setting' ) );
518
  }
519
  // 従来通りスパムデータ保存しない場合はスルーする
520
  if ( get_option( 'tsa_spam_data_save' ) != 1 ) {
521
  // N/A
522
  } else {
523
  // プラグインアップデート時もチェックするため常に・・・
524
+ $this->tsa_create_tbl();
525
  }
526
 
527
  }
531
  */
532
  function options_page() {
533
  global $wpdb; // WordPress DBアクセス
534
+ global $default_on_flg;
535
  global $default_dummy_param_field_flg;
536
  global $default_japanese_string_min_count;
537
  global $default_caution_msg;
540
  global $default_error_msg;
541
  global $default_ng_key_error_msg;
542
  global $default_must_key_error_msg;
543
+ global $default_tb_on_flg;
544
+ global $default_tb_url_flg;
545
  global $default_block_ip_address_error_msg;
546
+ global $default_ip_block_from_spam_chk_flg;
547
+ global $default_spam_data_save;
548
  global $default_url_count_over_error_msg;
549
  global $default_ok_url_count;
550
+ global $default_spam_champuru_flg;
551
 
552
+ global $default_spam_limit_flg;
553
  global $default_spam_limit_minutes;
554
  global $default_spam_limit_count;
555
  global $default_spam_limit_over_interval;
556
  global $default_spam_limit_over_interval_error_msg;
557
 
558
+ global $default_spam_data_delete_flg;
559
  global $default_spam_display_day_count;
 
560
  global $default_spam_keep_day_count;
561
 
562
  // 設定完了の場合はメッセージ表示
563
  $_saved = FALSE;
564
+ if ( esc_attr( $_GET['settings-updated'] ) == 'true' ) {
565
  $_saved = TRUE;
566
  }
567
  ?>
576
  </style>
577
  <script type="text/Javascript">
578
  // 配列重複チェック
579
+ var isDuplicate = function( ary, str ) {
580
+ for ( i = 0; i < ary.length; i++ ) {
581
+ if ( str == ary[i] ) {
582
+ return true;
583
+ }
584
+ }
585
+ return false;
586
  };
587
  function addIpAddresses(newAddressStr) {
588
  // チェック用配列
589
  var test_newAddress_list = newAddressStr.split(",");
590
+ var str = document.getElementById('tsa_block_ip_addresses').value;
591
  // 現在の配列(テスト用)
592
+ str = str.replace(/\,/g, "\n");
593
  var test_oldAddress_list = str.split("\n");
594
 
595
+ if (str.length > 0) { str += "\n"; }
596
+ if (newAddressStr.length > 0) {
597
+ newAddressStr = newAddressStr.replace(/\,/g, "\n");
598
+ }
599
+ str += newAddressStr;
600
+ str = str.replace(/\,/g, "\n");
601
+
602
+ var ary = str.split("\n");
603
+ var newAry = new Array;
604
+ var ret = "";
605
+
606
+ upd_flg = false;
607
+ upd_ip_str = "";
608
+ for ( var i=0; i < test_newAddress_list.length; i++) {
609
+ if (!isDuplicate(test_oldAddress_list, test_newAddress_list[i]) && test_newAddress_list[i] != "") {
610
+ upd_flg = true;
611
+ upd_ip_str = upd_ip_str + "・"+test_newAddress_list[i]+"\n";
612
+ }
613
+ }
614
+ if ( upd_flg == true ) {
615
+
616
+ for ( var i=0 ; i < ary.length ; i++ ) {
617
+ if ( ! isDuplicate( newAry, ary[i] ) && ary[i] != "" ){
618
+ newAry.push(ary[i]);
619
+ }
620
+ }
621
+ document.getElementById( 'tsa_block_ip_addresses' ).value = newAry.join( '\n' );
622
+ alert('新たにIPアドレスを追加しました。\n'+upd_ip_str);
623
+ } else {
624
+ alert('指定されたIPアドレスは\nすでに追加されています。');
625
+ }
626
  return false;
627
  }
628
  </script>
629
  <div class="wrap">
630
  <h2>Throws SPAM Away設定</h2>
631
+ <?php if ( $_saved ) { ?>
632
  <div class="updated" style="padding: 10px; width: 50%;" id="message">設定の更新が完了しました。</div>
633
  <?php } ?>
634
  <form method="post" action="options.php">
635
  <h3>スパム対策機能 設定</h3>
636
+ <?php wp_nonce_field( 'update-options' ); ?>
637
  <table class="form-table">
638
  <tr valign="top">
639
  <th scope="row">人の目には見えないダミーの入力項目を作成し、そこに入力があれば無視対象とする<br />(スパムプログラム投稿に有効です)</th>
640
  <td><?php
641
+ $chk_1 = '';
642
+ $chk_2 = '';
643
+ if ( get_option( 'tsa_dummy_param_field_flg', $default_dummy_param_field_flg ) == '2' ) {
644
+ $chk_2 = ' checked="checked"';
645
  } else {
646
+ $chk_1 = ' checked="checked"';
647
  }
648
  ?>
649
+ <label><input type="radio" name="tsa_dummy_param_field_flg" value="1"<?php esc_attr_e( $chk_1 ); ?> />&nbsp;する</label>&nbsp;
650
+ <label><input type="radio" name="tsa_dummy_param_field_flg" value="2"<?php esc_attr_e( $chk_2 ); ?> />&nbsp;しない</label><br />
651
+ ※ダミー項目の制御にJavaScriptを使用しますのでJavaScriptが動作しない環境からの投稿はスパム判定されてしまいます。ご注意の上、ご利用ください。<br />
652
+ (初期設定:<?php echo ( $default_dummy_param_field_flg == '2' ? "しない" : "する" ); ?>)
653
  </td>
654
  </tr>
655
  <tr valign="top"><td colspan="2"><hr/></td></tr>
656
  <tr valign="top">
657
  <th scope="row">日本語が存在しない場合、無視対象とする<br />(日本語文字列が存在しない場合無視対象となります。)</th>
658
  <td><?php
659
+ $chk_1 = '';
660
+ $chk_2 = '';
661
+ if ( get_option( 'tsa_on_flg', $default_on_flg ) == '2' ) {
662
+ $chk_2 = ' checked="checked"';
663
+ } else {
664
+ $chk_1 = ' checked="checked"';
665
+ }
666
+ ?> <label><input type="radio" name="tsa_on_flg" value="1" <?php esc_attr_e( $chk_1 ); ?> />&nbsp;する</label>&nbsp;
667
+ <label><input type="radio" name="tsa_on_flg" value="2" <?php esc_attr_e( $chk_2 );?> />&nbsp;しない</label><br />
668
+ (初期設定:<?php echo ( $default_on_flg == '2' ? "しない" : "する" ); ?>)
669
  </td>
670
  </tr>
671
  <tr valign="top">
672
  <th scope="row">日本語文字列含有数<br />(この文字列に達していない場合無視対象となります。)
673
  </th>
674
  <td><input type="text" name="tsa_japanese_string_min_count"
675
+ value="<?php echo get_option( 'tsa_japanese_string_min_count', $default_japanese_string_min_count ); ?>" /><br />
676
+ (初期設定:<?php echo $default_japanese_string_min_count; ?>)
677
  </td>
678
  </tr>
679
  <tr valign="top">
680
  <th scope="row">元の記事に戻ってくる時間<br />(秒)※0の場合エラー画面表示しません。
681
  </th>
682
  <td><input type="text" name="tsa_back_second"
683
+ value="<?php echo get_option( 'tsa_back_second', $default_back_second );?>" /><br />
684
+ (初期設定:<?php echo $default_back_second; ?>)
685
  </td>
686
  </tr>
687
  <tr valign="top">
688
  <th scope="row" id="tsa_caution_message">コメント欄の下に表示される注意文言</th>
689
  <td><input type="text" name="tsa_caution_message" size="80"
690
+ value="<?php echo get_option( 'tsa_caution_message', $default_caution_msg );?>" /><br />
691
+ (初期設定:<?php echo $default_caution_msg;?>)</td>
692
  </tr>
693
  <tr valign="top">
694
  <th scope="row" id="tsa_caution_msg_point">コメント注意文言の表示位置</th>
695
  <td><?php
696
+ $chk_1 = '';
697
+ $chk_2 = '';
698
+ if ( get_option( 'tsa_caution_msg_point', $default_caution_msg_point ) == '2' ) {
699
+ $chk_2 = ' checked="checked"';
700
+ } else {
701
+ $chk_1 = ' checked="checked"';
702
+ }
703
+ ?> <label><input type="radio"
704
+ name="tsa_caution_msg_point" value='1' <?php esc_attr_e( $chk_1 ); ?> />&nbsp;コメント送信ボタンの上</label>&nbsp;
705
  <label><input type="radio" name="tsa_caution_msg_point" value="2"
706
+ <?php esc_attr_e( $chk_2 );?> />&nbsp;コメント送信フォームの下</label><br />
707
+ (初期設定:<?php echo ( $default_caution_msg_point == '2' ? "コメント送信フォームの下" : "コメント送信ボタンの上" ); ?>)
708
  </td>
709
  </tr>
710
  <tr><td colspan="2">※表示が崩れる場合、<a href="#tsa_caution_msg_point">「コメント注意文言の表示位置」</a>の変更 や <a href="#tsa_caution_message">「コメント欄の下に表示される注意文言」</a>を空白にすること を試してみて下さい。<br />
712
  <tr valign="top">
713
  <th scope="row">日本語文字列規定値未満エラー時に表示される文言<br />(元の記事に戻ってくる時間の間のみ表示)</th>
714
  <td><input type="text" name="tsa_error_message" size="80"
715
+ value="<?php echo get_option( 'tsa_error_message', $default_error_msg );?>" /><br />(初期設定:<?php echo $default_error_msg; ?>)</td>
716
  </tr>
717
  </table>
718
  <h3>URL文字列除外 設定</h3>
720
  <tr valign="top">
721
  <th scope="row">URLらしき文字列が混入している場合エラーとするか</th>
722
  <td><?php
723
+ $chk_1 = '';
724
+ $chk_2 = '';
725
+ if (get_option( 'tsa_url_count_on_flg', '1') == '2') {
726
+ $chk_2 = ' checked="checked"';
727
+ } else {
728
+ $chk_1 = ' checked="checked"';
729
+ }
730
+ ?> <label><input type="radio"
731
+ name="tsa_url_count_on_flg" value='1' <?php esc_attr_e( $chk_1 ); ?> />&nbsp;する</label>&nbsp;
732
  <label><input type="radio" name="tsa_url_count_on_flg" value="2"
733
+ <?php esc_attr_e( $chk_2 );?> />&nbsp;しない</label><br /> する場合の制限数(入力数値まで許容):<input
734
  type="text" name="tsa_ok_url_count" size="2"
735
+ value="<?php echo get_option( 'tsa_ok_url_count', $default_ok_url_count);?>" /><br />
736
+ (初期設定: <?php echo $default_ok_url_count; ?>)
737
  </td>
738
  </tr>
739
  <tr valign="top">
740
  <th scope="row">URLらしき文字列混入数オーバーエラー時に表示される文言 (元の記事に戻ってくる時間の間のみ表示)</th>
741
  <td><input type="text" name="tsa_url_count_over_error_message"
742
  size="80"
743
+ value="<?php echo get_option( 'tsa_url_count_over_error_message', $default_url_count_over_error_msg);?>" /><br />
744
+ (初期設定:<?php echo $default_url_count_over_error_msg;?>)</td>
745
  </tr>
746
  </table>
747
  <h3>NGキーワード / 必須キーワード 制御設定</h3>
750
  <th scope="row">その他NGキーワード<br />(日本語でも英語(その他)でもNGとしたいキーワードを半角カンマ区切りで複数設定できます。<br />挙動は同じです。NGキーワードだけでも使用できます。)
751
  </th>
752
  <td><input type="text" name="tsa_ng_keywords" size="80"
753
+ value="<?php echo get_option( 'tsa_ng_keywords', '');?>" /></td>
754
  </tr>
755
  <tr valign="top">
756
  <th scope="row">NGキーワードエラー時に表示される文言<br />(元の記事に戻ってくる時間の間のみ表示)
757
  </th>
758
  <td><input type="text" name="tsa_ng_key_error_message" size="80"
759
+ value="<?php echo get_option( 'tsa_ng_key_error_message', $default_ng_key_error_msg);?>" /><br />
760
+ (初期設定:<?php echo $default_ng_key_error_msg;?>)</td>
761
  </tr>
762
  <tr valign="top">
763
  <th scope="row">その上での必須キーワード<br />(日本語でも英語(その他)でも必須としたいキーワードを半角カンマ区切りで複数設定できます。<br />指定文字列を含まない場合はエラーとなります。※複数の方が厳しくなります。<br />必須キーワードだけでも使用できます。)
764
  </th>
765
  <td><input type="text" name="tsa_must_keywords" size="80"
766
+ value="<?php echo get_option( 'tsa_must_keywords', '');?>" /></td>
767
  </tr>
768
  <tr valign="top">
769
  <th scope="row">必須キーワードエラー時に表示される文言<br />(元の記事に戻ってくる時間の間のみ表示)
770
  </th>
771
  <td><input type="text" name="tsa_must_key_error_message" size="80"
772
+ value="<?php echo get_option( 'tsa_must_key_error_message', $default_must_key_error_msg);?>" /><br />
773
+ (初期設定:<?php echo $default_must_key_error_msg;?>)</td>
774
  </tr>
775
  </table>
776
  <h3>トラックバックへの対応設定</h3>
778
  <tr valign="top">
779
  <th scope="row">上記設定をトラックバック記事にも採用する</th>
780
  <td><?php
781
+ $chk_1 = '';
782
+ $chk_2 = '';
783
+ if (get_option( 'tsa_tb_on_flg', $default_tb_on_flg) == "2") {
784
+ $chk_2 = ' checked="checked"';
785
+ } else {
786
+ $chk_1 = ' checked="checked"';
787
+ }
788
+ ?> <label><input type="radio" name="tsa_tb_on_flg"
789
+ value='1' <?php esc_attr_e( $chk_1 ); ?> />&nbsp;する</label>&nbsp; <label><input
790
+ type="radio" name="tsa_tb_on_flg" value="2" <?php esc_attr_e( $chk_2 );?> />&nbsp;しない</label><br />
791
+ (初期設定:<?php echo ( $default_tb_on_flg == '2' ? "しない" : "する" ); ?>)
792
  </td>
793
  </tr>
794
  <tr valign="top">
795
+ <th scope="row">トラックバック記事にも採用する場合、ついでにこちらのURLが含まれているか判断する
796
  </th>
797
  <td><?php
798
+ $chk_1 = '';
799
+ $chk_2 = '';
800
+ if ( get_option( 'tsa_tb_url_flg', $default_tb_url_flg) == '2' ) {
801
+ $chk_2 = ' checked="checked"';
802
+ } else {
803
+ $chk_1 = ' checked="checked"';
804
+ }
805
+ ?> <label><input type="radio" name="tsa_tb_url_flg"
806
+ value='1' <?php esc_attr_e( $chk_1 ); ?> />&nbsp;する</label>&nbsp; <label><input
807
+ type="radio" name="tsa_tb_url_flg" value="2" <?php esc_attr_e( $chk_2 );?> />&nbsp;しない</label><br />
808
+ (初期設定:<?php echo ( $default_tb_url_flg == '2' ? "しない" : "する" ); ?>)
809
  </td>
810
  </tr>
811
  </table>
814
  <tr valign="top">
815
  <th scope="row">SPAMブラックリスト利用</th>
816
  <td><?php
817
+ $chk = '';
818
+ if ( get_option( 'tsa_spam_champuru_flg', $default_spam_champuru_flg) == '1' ) {
819
+ $chk = ' checked="checked"';
820
  }
821
  ?>
822
+ <label><input type="checkbox" name="tsa_spam_champuru_flg" value='1' <?php esc_attr_e( $chk ); ?> /><a href="http://spam-champuru.livedoor.com/dnsbl/">スパムちゃんぷるーDNSBL</a>に登録されているIPアドレスからのコメントを拒否する</label><br />
823
+ (初期設定:<?php echo ( $default_spam_champuru_flg == '2' ? "しない" : "する" ); ?>)
824
  </td>
825
  </tr>
826
  <tr valign="top">
827
  <th scope="row">WordPressのコメントで「スパム」にしたIPからの投稿にも採用する</th>
828
  <td><?php
829
+ $chk = '';
830
+ if ( get_option( 'tsa_ip_block_from_spam_chk_flg', $default_ip_block_from_spam_chk_flg) == '1' ) {
831
+ $chk = ' checked="checked"';
832
+ }
833
+ ?> <label><input type="checkbox"
834
+ name="tsa_ip_block_from_spam_chk_flg" value='1'
835
+ <?php esc_attr_e( $chk ); ?> />&nbsp;スパム投稿設定したIPアドレスからの投稿も無視する</label>&nbsp;※Akismet等で自動的にスパムマークされたものも含む<br />
836
+ (初期設定:<?php echo ( $default_ip_block_from_spam_chk_flg != '1' ? "しない" : "する" ); ?>)<br />
837
  <?php
838
  // wp_commentsの comment_approved カラムが「spam」のIP_ADDRESSからの投稿は無視する
839
  $results = $wpdb->get_results("SELECT DISTINCT comment_author_IP FROM $wpdb->comments WHERE comment_approved = 'spam' ORDER BY comment_author_IP ASC ");
840
  ?>現在「spam」フラグが付いているIPアドレス:<br />
841
  <blockquote>
842
  <?php
843
+ $add_ip_addresses = '';
844
+ foreach ( $results as $item ) {
845
+ $spam_ip = esc_attr($item->comment_author_IP);
846
+ // ブロックしたいIP
847
+ if ( strlen( $add_ip_addresses ) > 0 ) {
848
+ $add_ip_addresses .= ',';
849
+ }
850
+ $add_ip_addresses .= $spam_ip;
851
+ ?>
852
+ <b><?php esc_attr_e( $spam_ip ); ?> </b><br />
853
  <?php
854
+ }
855
+ ?>
856
  &nbsp;<input type="button"
857
  onclick="javascript:addIpAddresses('<?php echo $add_ip_addresses; ?>');"
858
  value="これらのIPアドレスを任意のブロック対象IPアドレスにコピーする" /><br />
863
  <th scope="row">任意のIPアドレスからの投稿も無視したい場合、対象となるIPアドレスを記述してください。<br />改行区切りで複数設定できます。(半角数字とスラッシュ、ドットのみ)<br />※カンマは自動的に改行に変換されます
864
  </th>
865
  <td><textarea name="tsa_block_ip_addresses"
866
+ id="tsa_block_ip_addresses" cols="80" rows="10"><?php echo get_option( 'tsa_block_ip_addresses', '' );?></textarea></td>
867
  </tr>
868
  <tr valign="top">
869
  <th scope="row">ブロック対象のIPアドレスからの投稿時に表示される文言<br />(元の記事に戻ってくる時間の間のみ表示)
870
  </th>
871
  <td><input type="text" name="tsa_block_ip_address_error_message"
872
  size="80"
873
+ 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>
874
  </tr>
875
  <tr style="background-color: #fefefe;"><td colspan="2">※上記のスパムチェックから除外するIPアドレスがあれば下記に設定してください。優先的に通過させます。<br />※トラックバックは優先通過ではありません。</td></tr>
876
  <tr style="background-color: #fefefe;" valign="top">
878
  <td>
879
  ※ここに登録したIPアドレスはスパムフィルタを掛けず優先的に通します。<br />※日本語以外の言語でご利用になられるお客様のIPアドレスを登録するなどご利用ください。<br />改行区切りで複数設定できます。範囲指定も可能です。(半角数字とスラッシュ、ドットのみ)
880
  <textarea name="tsa_white_ip_addresses"
881
+ id="tsa_white_ip_addresses" cols="80" rows="10"><?php echo get_option( 'tsa_white_ip_addresses', '' );?></textarea>
882
  </td>
883
  </tr>
884
 
888
  <table class="form-table">
889
  <tr valign="top">
890
  <td>
891
+ <textarea name="tsa_memo" style="width: 80%;" rows="10"><?php echo get_option( 'tsa_memo', '' ); ?></textarea>
892
 
893
  </td>
894
  </tr>
898
  <tr valign="top">
899
  <th scope="row">スパムコメント投稿情報を保存しますか?</th>
900
  <td><?php
901
+ $chk = '';
902
+ if ( get_option( 'tsa_spam_data_save', $default_spam_data_save) == '1' ) {
903
+ $chk = ' checked="checked"';
904
+ }
905
+ ?> <label><input type="checkbox"
906
+ name="tsa_spam_data_save" value='1' <?php esc_attr_e( $chk ); ?> />&nbsp;スパムコメント情報を保存する</label><br />※Throws
907
+ SPAM Away設定画面表示時に時間がかかることがあります。<br />※「保存する」を解除した場合でもテーブルは残りますので<?php echo get_option( 'tsa_spam_keep_day_count', $default_spam_keep_day_count); ?>日以内の取得データは表示されます。<br />
908
+ (初期設定:<?php echo ( $default_spam_data_save != '1' ? "しない" : "する" ); ?>)
909
  </td>
910
  </tr>
911
  <tr>
913
  <td>
914
  <input
915
  type="text" name="tsa_spam_keep_day_count" size="3"
916
+ value="<?php echo get_option( 'tsa_spam_keep_day_count', $default_spam_keep_day_count); ?>" />日分(最低7日)(初期設定: <?php echo $default_spam_keep_day_count; ?>)<br />&nbsp;
917
  <?php
918
+ $chk = '';
919
+ if ( get_option( 'tsa_spam_data_delete_flg', $default_spam_data_delete_flg) == '1' ) {
920
+ $chk = ' checked="checked"';
921
  }
922
  ?>
923
+ <label><input type="checkbox" name="tsa_spam_data_delete_flg" value='1'
924
+ <?php esc_attr_e( $chk ); ?> />&nbsp;期間が過ぎたデータを削除する</label><br />
925
  ※一度消したデータは復活出来ませんのでご注意ください。また最低7日分は保存されます。
926
  </td>
927
  </tr>
933
  <tr>
934
  <th scope="row">機能設定</th>
935
  <td><?php
936
+ $chk = '';
937
+ if ( get_option( 'tsa_spam_limit_flg', $default_spam_limit_flg) == '1' ) {
938
+ $chk = ' checked="checked"';
939
  }
940
+ ?> <label><input type="checkbox" name="tsa_spam_limit_flg" value='1'
941
+ <?php esc_attr_e( $chk ); ?> />&nbsp;機能させる</label> (初期設定: <?php echo ( $default_spam_limit_flg != '1' ? "しない" : "する" ); ?>)<br /> 一定時間:<input
942
  type="text" name="tsa_spam_limit_minutes" size="3"
943
+ value="<?php echo get_option( 'tsa_spam_limit_minutes', $default_spam_limit_minutes); ?>" />分以内に
944
  一定回数:<input type="text" name="tsa_spam_limit_count" size="3"
945
+ value="<?php echo get_option( 'tsa_spam_limit_count', $default_spam_limit_count); ?>" />回スパムとなったら<b>次から</b>
946
  一定時間:<input type="text" name="tsa_spam_limit_over_interval" size="3"
947
+ value="<?php echo get_option( 'tsa_spam_limit_over_interval', $default_spam_limit_over_interval); ?>" />分間<br />
948
+ (初期設定:一定時間「<?php echo $default_spam_limit_minutes; ?>」分以内に一定回数「<?php echo $default_spam_limit_count; ?>」回スパムとなったら次から「<?php echo $default_spam_limit_over_interval; ?>」分間)<br />
949
  当該IPアドレスからのコメントを強制スパム扱いします。<br /> エラーメッセージは:<input type="text"
950
  name="tsa_spam_limit_over_interval_error_message" size="80"
951
+ value="<?php echo get_option( 'tsa_spam_limit_over_interval_error_message', $default_spam_limit_over_interval_error_msg); ?>" /><br />
952
  (初期設定:<?php echo $default_spam_limit_over_interval_error_msg; ?>)
953
  </td>
954
  </tr>
966
  <?php
967
  }
968
 
969
+ function trackback_spam_away( $tb ) {
970
+ global $newThrowsSpamAway;
971
+
972
+ $tsa_tb_on_flg = get_option( 'tsa_tb_on_flg' );
973
+ $tsa_tb_url_flg = get_option( 'tsa_tb_url_flg' );
974
+ $siteurl = get_option( 'siteurl');
975
+ // トラックバック OR ピンバック時にフィルタ発動
976
+ if ( $tsa_tb_on_flg == "2" || ( $tb['comment_type'] != 'trackback' && $tb['comment_type'] != 'pingback' ) ) return $tb;
977
+
978
+ // SPAMかどうかフラグ
979
+ $tb_val['is_spam'] = FALSE;
980
+
981
+ // コメント判定
982
+ $author = $tb["comment_author"];
983
+ $comment = $tb["comment_content"];
984
+ $post_id = $tb["comment_post_ID"];
985
+ // IP系の検査
986
+ $ip = $_SERVER['REMOTE_ADDR'];
987
+ if ( ! $newThrowsSpamAway->ip_check( $ip ) ) {
988
+ $tb_val['is_spam'] = TRUE;
989
+ } else
990
+ // 検査します!
991
+ if ( ! $newThrowsSpamAway->validation( $comment, $author ) ) {
992
+ $tb_val['is_spam'] = TRUE;
993
+ } else
994
+ // URL検索する場合、URL包含検査 (このブログのURLを含んでない場合エラー
995
+ if ( $tsa_tb_url_flg == '1' && stripos( $comment, $siteurl ) == FALSE ) {
996
+ $tb_val['is_spam'] = TRUE; // スパム扱い
997
+ }
998
+ // トラックバックスパムがなければ返却・あったら捨てちゃう
999
+ if ( ! $tb_val['is_spam'] ) {
1000
+ // トラックバック内に日本語存在(または禁止語句混入なし)
1001
+ return $tb;
1002
+ } else {
1003
+ if ( get_option( 'tsa_spam_data_save', $default_spam_data_save ) == '1' ) {
1004
  $spam_contents = array();
1005
+ $spam_contents['error_type'] = 'spam_trackback';
1006
+ $spam_contents['author'] = mb_strcut( strip_tags( $author ), 0, 255 );
1007
+ $spam_contents['comment'] = mb_strcut( strip_tags( $comment ), 0, 255 );
1008
 
1009
  $this->save_post_meta( $post_id, $ip, $spam_contents );
1010
  }
1011
+ die( 'Your Trackback Throws Away.' );
1012
+ }
1013
+ }
1014
+
1015
+ /**
1016
+ * 当該IPアドレスからの最終投稿日時取得
1017
+ * @param string ip_address
1018
+ * @return 最終投稿日時 Y-m-d H:i:s
1019
+ */
1020
+ function get_last_spam_comment( $ip_address = NULL ) {
1021
  global $wpdb;
1022
  // IPアドレスがなければNULL返却
1023
  if ( $ip_address == NULL ) {
1024
  return NULL;
1025
  }
1026
  // 最終コメント情報取得
1027
+ $qry_str = "SELECT post_date, post_id FROM $this->table_name WHERE ip_address = '".htmlspecialchars( $ip_address )."' ORDER BY post_date DESC LIMIT 1 ";
1028
+ $results = $wpdb->get_results( $qry_str );
1029
  if ( count( $results ) > 0 ) {
1030
  return $results[0];
1031
  }
1040
  function spams_list() {
1041
  global $wpdb;
1042
  $_saved = FALSE;
1043
+
1044
+ // ブラックIPリスト
1045
+ $block_ip_addresses_str = get_option( 'tsa_block_ip_addresses', '');
1046
+ $block_ip_addresses = str_replace("\n", ",", $block_ip_addresses_str);
1047
+ $ip_list = mb_split( ",", $block_ip_addresses );
1048
+
1049
  // スパム情報から 特定IPアドレス削除
1050
  if ( $_POST['act'] != NULL && $_POST['act'] == "remove_ip" ) {
1051
+ $remove_ip_address = @htmlspecialchars( $_POST['ip_address'] );
1052
+ if ( !isset( $remove_ip_address ) || strlen( $remove_ip_address ) == 0 ) {
1053
  // N/A
1054
  } else {
1055
  // スパムデータベースから特定IP情報削除
1060
  $message = "スパムデータから $remove_ip_address のデータを削除しました。";
1061
  }
1062
  } elseif ( $_POST['act'] != NULL && $_POST['act'] == "add_ip" ) {
1063
+ $add_ip_address = @htmlspecialchars( $_POST['ip_address'] );
1064
+ if ( ! isset( $add_ip_address ) || strlen( $add_ip_address ) == 0 ) {
1065
  // N/A
1066
  } else {
1067
  // 対象IPアドレスに一つ追加
 
 
 
1068
  $dup_flg = FALSE;
1069
  foreach ( $ip_list as $ip ) {
1070
  if ( $ip == trim($add_ip_address) ) {
1082
  }
1083
  }
1084
  }
1085
+
1086
+ // ブラックIPリスト もう一度取得
1087
+ $block_ip_addresses_str = get_option( 'tsa_block_ip_addresses', '' );
1088
+ $block_ip_addresses = str_replace( "\n", ',', $block_ip_addresses_str );
1089
+ $ip_list = mb_split( ",", $block_ip_addresses );
1090
+
1091
+ if ( $_GET['settings-updated'] == 'true' ) {
1092
  $_saved = TRUE;
1093
  }
1094
  ?>
1095
  <div class="wrap">
1096
  <?php
1097
+ if ( get_option( 'tsa_spam_data_save' ) == '1' ) {
1098
  // 日数
1099
  $gdays = get_option( 'tsa_spam_keep_day_count', $default_spam_keep_day_count);
1100
  if ( $gdays < $lower_spam_keep_day_count ) { $gdays = $lower_spam_keep_day_count; }
1104
  ?>
1105
  <h2>Throws SPAM Away スパムデータ</h2>
1106
  <h3>スパム投稿<?php echo $gdays; ?>日間の推移</h3>
1107
+ <?php if ( $_saved ) { ?>
1108
+ <div class="updated" style="padding: 10px; width: 50%;" id="message"><?php esc_attr_e( $message ); ?></div>
1109
  <?php } ?>
1110
  <div style="background-color: #efefef;">
1111
  <table style="width: 100%; border: none;">
1114
  $total_qry = "
1115
  SELECT count(ppd) as pageview, ppd
1116
  FROM (select ip_address, SUBSTRING(post_date,1,10) as ppd from $this->table_name) as A
1117
+ GROUP BY ppd HAVING ppd >= '".gmdate( 'Y-m-d', current_time( 'timestamp' ) - 86400 * $gdays )."'
1118
  ORDER BY pageview DESC
1119
  LIMIT 1
1120
  ";
1121
+ $qry = $wpdb->get_row( $total_qry );
1122
+ $maxxday = $qry->pageview;
1123
 
1124
  $total_vis = "
1125
  SELECT count(distinct ip_address) as vis, ppd
1128
  ORDER BY vis DESC
1129
  LIMIT 1
1130
  ";
1131
+ $qry_vis = $wpdb->get_row( $total_vis );
1132
  $maxxday += $qry_vis->vis;
1133
 
1134
  if ( $maxxday == 0 ) {
1142
  $visitor_qry = "
1143
  SELECT count(DISTINCT ip_address) AS total
1144
  FROM (select ip_address, SUBSTRING(post_date,1,10) as ppd from $this->table_name) as B
1145
+ WHERE ppd = '".gmdate( 'Y-m-d', current_time( 'timestamp' ) - 86400 * $gg )."'
1146
  ";
1147
+ $qry_visitors = $wpdb->get_row( $visitor_qry );
1148
+ $px_visitors = round( $qry_visitors->total * 100 / $maxxday );
1149
  // TOTAL
1150
  $pageview_qry = "
1151
  SELECT count(ppd) as total
1152
  FROM (select ip_address, SUBSTRING(post_date,1,10) as ppd from $this->table_name) as C
1153
+ WHERE ppd = '".gmdate( 'Y-m-d', current_time( 'timestamp' ) - 86400 * $gg )."'
1154
  ";
1155
+ $qry_pageviews = $wpdb->get_row( $pageview_qry );
1156
+ $px_pageviews = round( $qry_pageviews->total * 100 / $maxxday );
1157
  $px_white = 100 - $px_pageviews - $px_visitors;
1158
+ if ( $px_white < 0 ) {
1159
+ $px_white = 0;
1160
+ }
1161
 
1162
+ print '<td width="'.$gd.'" valign="bottom"';
1163
+ if ( $start_of_week == gmdate( 'w', current_time( 'timestamp' ) - 86400 * $gg ) ) {
1164
+ print ' style="border-left:2px dotted gray;"';
1165
+ } # week-cut
1166
+ print "><div style='float:left;width:100%;font-family:Helvetica;font-size:7pt;text-align:center;border-right:1px solid white;color:black;'>
1167
  <div style='background:#ffffff;width:100%;height:".$px_white."px;'></div>
1168
  <div style='background:$unique_color;width:100%;height:".$px_visitors."px;' title='".$qry_visitors->total." ip_addresses'></div>
1169
  <div style='background:$web_color;width:100%;height:".$px_pageviews."px;' title='".$qry_pageviews->total." spam comments'></div>
1170
  <div style='background:gray;width:100%;height:1px;'></div>
1171
+ <br />".gmdate( 'd', current_time( 'timestamp' ) - 86400 * $gg ) . '<br />' . gmdate( 'M', current_time( 'timestamp' ) - 86400 * $gg ) ."
1172
  <div style='background:$ffffff;width:100%;height:2.2em;'>".$qry_visitors->total."<br />".$qry_pageviews->total."</div>
1173
  <br clear=\"all\" /></div>
1174
  </td>\n";
1175
+ } ?>
 
1176
  </tr>
1177
  </table>
1178
  </div>
1197
  <p>※IPアドレスをクリックすると特定のホストが存在するか確認し存在する場合は表示されます。</p>
1198
  <p>「スパムデータから削除する」ボタンを押しますと該当IPアドレスのスパム投稿データが削除されます。テストしたあとの削除などに使用してください。</p>
1199
  <?php if ( count( $results ) > 0 ) {
1200
+ $p_url = WP_PLUGIN_URL.'/'.str_replace( basename( __FILE__ ), '', plugin_basename( __FILE__ ) );
1201
+ wp_enqueue_script( 'jquery.tablesorter', $p_url.'js/jquery.tablesorter.min.js', array( 'jquery' ), FALSE );
1202
+ wp_enqueue_style( 'jquery.tablesorter', $p_url.'images/style.css' );
1203
+ wp_enqueue_script( 'jquery.tipTip', $p_url.'js/jquery.tipTip.js', array( 'jquery' ), FALSE );
1204
+ wp_enqueue_style( 'jquery.tipTip', $p_url.'css/tipTip.css' );
1205
  ?>
1206
  <style type="text/css">
1207
  <!--
1340
 
1341
  .cols0 { width: 200px; }
1342
  .cols1 { width: 50px; }
1343
+ .cols2 { width: 130px; }
1344
+ .cols3 { width: 300px; }
1345
+ .cols4 { width: 220px; }
1346
 
1347
  -->
1348
  </style>
1360
  });
1361
  // tipTip
1362
  jQuery(".tip").tipTip({
1363
+ activation: "hover", // hover か focus か click で起動
1364
+ keepAlive: "true", // true か false true だとずっと出ている。
1365
+ maxWidth: "auto", //ツールチップ最大幅
1366
+ edgeOffset: 10, //要素からのオフセット距離
1367
+ defaultPosition: "left", // デフォルト表示位置 bottom(default) か top か left か right
1368
+ fadeIn: 300, // フェードインのスピード
1369
+ fadeOut: 500 // フェードアウトのスピード
1370
  });
1371
  jQuery(".tip_click").tipTip({
1372
+ activation: "click", // hover か focus か click で起動
1373
+ keepAlive: "true", // true か false true だとずっと出ている。
1374
+ maxWidth: "auto", //ツールチップ最大幅
1375
+ edgeOffset: 10, //要素からのオフセット距離
1376
+ defaultPosition: "left", // デフォルト表示位置 bottom(default) か top か left か right
1377
+ fadeIn: 300, // フェードインのスピード
1378
+ fadeOut: 500 // フェードアウトのスピード
1379
  });
1380
 
1381
  });
1418
  </tr>
1419
  </thead>
1420
  <tbody>
1421
+ <?php
1422
+ foreach ( $results as $item ) {
1423
  $spam_ip = $item->ip_address;
1424
  $spam_cnt = $item->cnt;
1425
  $last_post_date = $item->post_date;
1426
  $spam_error_type = $item->error_type;
1427
+ $spam_author = strip_tags( $item->author );
1428
+ $spam_comment = strip_tags( $item->comment );
1429
 
1430
  // エラー変換
1431
  $spam_error_type_str = $spam_error_type;
1432
+ switch ( $spam_error_type ) {
1433
+ case 'not_japanese':
1434
+ $spam_error_type_str = '日本語以外';
1435
  break;
1436
+ case 'must_word':
1437
+ $spam_error_type_str = '必須キーワード無し';
1438
  break;
1439
+ case 'ng_word':
1440
+ $spam_error_type_str = 'NGキーワード混入';
1441
  break;
1442
+ case 'block_ip':
1443
+ $spam_error_type_str = 'ブロック対象IPアドレス';
1444
  break;
1445
+ case 'spam_trackback':
1446
+ $spam_error_type_str = 'トラックバックスパム';
1447
  break;
1448
+ case 'url_count_over':
1449
+ $spam_error_type_str = 'URL文字列混入数オーバー';
1450
  break;
1451
+ case 'spam_limit_over':
1452
+ $spam_error_type_str = '一定時間スパム判定エラー';
1453
  break;
1454
+ case 'dummy_param_field':
1455
+ $spam_error_type_str = 'ダミー項目エラー';
1456
  break;
1457
  }
1458
+ ?>
1459
  <tr>
1460
  <td>
1461
  <b><a href="javascript:void(0);"
1462
+ onclick="window.open('<?php echo esc_attr( $p_url ); ?>hostbyip.php?ip=<?php esc_attr_e( $spam_ip ); ?>', 'hostbyip', 'width=350,height=300,scrollbars=no,location=no,menubar=no,toolbar=no,directories=no,status=no');"><?php esc_attr_e( $spam_ip ); ?>
1463
  </a></b><br clear="all" />
1464
  <input type="button"
1465
+ onclick="javascript:removeIpAddressOnData('<?php esc_attr_e( $spam_ip ); ?>');"
1466
  value="スパムデータから削除する" />
1467
  </td>
1468
+ <td><?php esc_attr_e( $spam_cnt ); ?>回</td>
1469
+ <td><?php esc_attr_e( $last_post_date ); ?></td>
1470
+ <td>
1471
+ <?php if ( ! in_array( $spam_ip, $ip_list ) ) { ?>
1472
+ <input type="button"
1473
+ onclick="javascript:addIpAddressOnData('<?php esc_attr_e( $spam_ip ); ?>');"
1474
+ value="ブロック対象IPアドレス追加[<?php esc_attr_e( $spam_ip ); ?>]" />
1475
+ <?php } else { ?>
1476
+ ブロック対象IP
1477
+ <?php } ?>
1478
+ </td>
1479
+ <td><?php esc_attr_e( $spam_error_type_str ); ?><?php if ( $spam_author != NULL && $spam_comment != NULL ) {
1480
+ ?>
1481
+ &nbsp;<a href="javascript:void(0);" id="<?php esc_attr_e( $spam_ip ); ?>" class="tip tip_click" title="名前:<?php echo esc_attr( $spam_author ).'<br />'; ?> 内容:<?php esc_attr_e( $spam_comment ); ?>">●</a><?php
1482
+ } ?>
1483
  </td>
1484
  </tr>
1485
  <?php
1503
  <input type="hidden" name="act" value="add_ip" />
1504
  </form>
1505
  <p>スパム投稿IPアドレスを参考にアクセス禁止対策を行なってください。</p>
1506
+ </div>
1507
+ <br clear="all" />
1508
+ <?php
1509
+ }
1510
 
1511
+ /**
1512
+ * おすすめ設定ページ
1513
+ */
1514
+ function recommend_setting() {
1515
+ global $wpdb;
1516
+ ?>
1517
+ 制作中
1518
  <?php
1519
  }
1520
 
throws_spam_away.php CHANGED
@@ -4,7 +4,7 @@
4
  Plugin URI: http://gti.jp/tsa/
5
  Description: コメント内に日本語の記述が存在しない場合はあたかも受け付けたように振る舞いながらも捨ててしまうプラグイン
6
  Author: 株式会社ジーティーアイ さとう たけし
7
- Version: 2.6.1
8
  Author URI: http://gti.jp/
9
  */
10
  require_once 'throws_spam_away.class.php';
@@ -15,54 +15,105 @@ require_once 'throws_spam_away.class.php';
15
  */
16
 
17
  // Throws SPAM Awayバージョン
18
- $tsa_version = "2.6.1";
19
  // スパムデータベースバージョン
20
  $tsa_db_version = 2.6; // 2.6からデータベース変更 [error_type]追加
21
 
22
- /** 初期設定 */
23
  // エラー種別
24
- $error_type = "";
 
 
 
 
 
 
25
  // ダミー項目でのスパム判定をするか
26
- $default_dummy_param_field_flg = "1"; // 1: する 2:しない
 
 
 
 
27
  // 日本語文字最小含有数
28
  $default_japanese_string_min_count = 3;
 
 
 
 
29
  // コメント欄下に表示される注意文言(初期設定)
30
  $default_caution_msg = '日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)';
31
- // コメント欄下に表示する位置(初期設定)
32
- $default_caution_msg_point = "1"; //1:"comment_form", 2:"comment_form_after"
 
33
 
34
  // エラー時に表示されるエラー文言(初期設定)
35
  $default_error_msg = '日本語を規定文字数以上含まない記事は投稿できませんよ。';
36
- // 元画面に戻る時間
37
- $default_back_second = 0;
 
 
 
 
 
 
 
 
 
 
 
38
  // キーワードNGエラー時に表示されるエラー文言(初期設定)
39
  $default_ng_key_error_msg = 'NGキーワードが含まれているため投稿できません。';
 
40
  // 必須キーワードが含まれないエラー文言(初期設定)
41
- $default_must_key_error_msg = "必須キーワードが含まれていないため投稿できません。";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
  // ブロックIPアドレスからの投稿の場合に表示されるエラー文言(初期設定)
43
- $default_block_ip_address_error_msg = "";
44
- // URL数制限値オーバーのエラー文言(初期設定)
45
- $default_url_count_over_error_msg = "";
46
- // URL数の制限をするか
47
- $default_url_count_check_flg = "1"; // 1:する
48
- // URL数の制限数
49
- $default_ok_url_count = 3; // 3つまで許容
 
 
 
 
 
 
 
 
 
 
 
50
 
51
  // ○分以内に○回スパムとなったら○分間そのIPからのコメントははじくかの設定
52
- $default_spam_limit_flg = 2; // 1:する Other:しない ※スパム情報保存がデフォルトではないのでこちらも基本はしない方向です。
53
  // ※スパム情報保存していないと機能しません。
54
  $default_spam_limit_minutes = 10; // 10分以内に・・・
55
  $default_spam_limit_count = 2; // 2回までは許そうか。
56
  $default_spam_limit_over_interval = 10; // だがそれを超えたら(デフォルト3回目以降)10分はOKコメントでもスパム扱いするんでよろしく!
57
- $default_spam_limit_over_interval_error_msg = ""; // そしてその際のエラーメッセージは・・・
58
 
59
- // スパムデータ保持期間(日)
60
- $default_spam_keep_day_count = 30;
61
- // 最低保存期間(日)
62
- $lower_spam_keep_day_count = 7;
63
 
64
- // スパムちゃんぷるーホスト
65
- $spam_champuru_host = "dnsbl.spam-champuru.livedoor.com";
66
 
67
  /** オプションキー */
68
  // ダミーフィールドを生成しそこに入力がある場合はエラーとするかフラグ [tsa_dummy_param_field_flg] 1:する 2:しない
@@ -100,21 +151,22 @@ $spam_champuru_host = "dnsbl.spam-champuru.livedoor.com";
100
  /** プロセス */
101
  $newThrowsSpamAway = new ThrowsSpamAway;
102
  // トラックバックチェックフィルター
103
- add_filter('preprocess_comment', array(&$newThrowsSpamAway, 'trackback_spam_away'), 1, 1);
104
  // ダミーフィールド作成
105
- $dummy_param_field_flg = get_option("tsa_dummy_param_field_flg", $default_dummy_param_field_flg );
106
- if ( "1" == $dummy_param_field_flg ) {
107
- add_action('init', array(&$newThrowsSpamAway, "tsa_scripts_init" ), 9997);
108
  add_action( "comment_form", array(&$newThrowsSpamAway, "comment_form_dummy_param_field" ), 9998);
109
  }
110
  // 注意文言表示
111
  // コメントフォーム表示
112
- $comment_disp_point = "comment_form";
113
- $comment_form_action_point = get_option("tsa_caution_msg_point", $default_caution_msg_point);
114
  // フォーム内かフォーム外か判断する
115
- if ("2" == $comment_form_action_point) {
116
- $comment_disp_point = "comment_form_after";
117
  }
118
- add_action($comment_disp_point, array(&$newThrowsSpamAway, "comment_form"), 9999);
119
  // コメントチェックフィルター
120
- add_action('pre_comment_on_post', array(&$newThrowsSpamAway, "comment_post"), 1);
 
4
  Plugin URI: http://gti.jp/tsa/
5
  Description: コメント内に日本語の記述が存在しない場合はあたかも受け付けたように振る舞いながらも捨ててしまうプラグイン
6
  Author: 株式会社ジーティーアイ さとう たけし
7
+ Version: 2.6.2
8
  Author URI: http://gti.jp/
9
  */
10
  require_once 'throws_spam_away.class.php';
15
  */
16
 
17
  // Throws SPAM Awayバージョン
18
+ $tsa_version = '2.6.2';
19
  // スパムデータベースバージョン
20
  $tsa_db_version = 2.6; // 2.6からデータベース変更 [error_type]追加
21
 
 
22
  // エラー種別
23
+ $error_type = '';
24
+
25
+ /** 初期設定 */
26
+ /**
27
+ * 設定値変更 2.6.2から
28
+ */
29
+
30
  // ダミー項目でのスパム判定をするか
31
+ $default_dummy_param_field_flg = '1'; // 1: する 2:しない
32
+
33
+ // 日本語が存在しない場合無視対象とするか
34
+ $default_on_flg = 1; // 1:する
35
+
36
  // 日本語文字最小含有数
37
  $default_japanese_string_min_count = 3;
38
+
39
+ // 無視後、元画面に戻る時間
40
+ $default_back_second = 0;
41
+
42
  // コメント欄下に表示される注意文言(初期設定)
43
  $default_caution_msg = '日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)';
44
+
45
+ // コメント欄下に表示する位置(初期設定)1:コメント送信ボタンの上 2:コメント送信フォームの下
46
+ $default_caution_msg_point = '1'; //1:"comment_form", 2:"comment_form_after"
47
 
48
  // エラー時に表示されるエラー文言(初期設定)
49
  $default_error_msg = '日本語を規定文字数以上含まない記事は投稿できませんよ。';
50
+
51
+ /** URL文字列除外 設定 */
52
+ // URL数の制限をするか
53
+ $default_url_count_check_flg = '1'; // 1:する
54
+
55
+ // URL数の制限数
56
+ $default_ok_url_count = 3; // 3つまで許容
57
+
58
+ // URL数制限値オーバーのエラー文言(初期設定)
59
+ $default_url_count_over_error_msg = '';
60
+
61
+ /** NGキーワード/必須キーワード 制御設定 */
62
+
63
  // キーワードNGエラー時に表示されるエラー文言(初期設定)
64
  $default_ng_key_error_msg = 'NGキーワードが含まれているため投稿できません。';
65
+
66
  // 必須キーワードが含まれないエラー文言(初期設定)
67
+ $default_must_key_error_msg = '必須キーワードが含まれていないため投稿できません。';
68
+
69
+ /** トラックバックへの対応設定 */
70
+
71
+ // トラックバックへの対応 1: する
72
+ $default_tb_on_flg = '1';
73
+
74
+ // トラックバック記事に当サイトURLがなければ無視するか
75
+ $default_tb_url_flg = '1';
76
+
77
+ /** 投稿IPアドレスによる制御設定 */
78
+
79
+ // スパムちゃんぷるーホスト
80
+ $spam_champuru_host = 'dnsbl.spam-champuru.livedoor.com';
81
+
82
+ // すぱむちゃんぷるー利用初期設定
83
+ $default_spam_champuru_flg = '1'; // "1":する
84
+
85
+ // WordPressのcommentsテーブルで「spam」判定されたことがあるIPアドレスからの投稿を無視するか
86
+ $default_ip_block_from_spam_chk_flg = '1'; // "1":する
87
+
88
  // ブロックIPアドレスからの投稿の場合に表示されるエラー文言(初期設定)
89
+ $default_block_ip_address_error_msg = '';
90
+
91
+ /** スパムデータベース */
92
+
93
+ // スパムデータベース保存するか "1":保存
94
+ $default_spam_data_save = '1';
95
+
96
+ // 期間が過ぎたデータを削除するか? "1":する
97
+ $default_spam_data_delete_flg = '1';
98
+
99
+ // スパムデータ保持期間(日)
100
+ $default_spam_keep_day_count = 30;
101
+
102
+ // 最低保存期間(日)
103
+ $lower_spam_keep_day_count = 7;
104
+
105
+ // 機能設定
106
+ $default_spam_limit_flg = '1';
107
 
108
  // ○分以内に○回スパムとなったら○分間そのIPからのコメントははじくかの設定
109
+ $default_spam_limit_flg = 1; // 1:する Other:しない ※スパム情報保存がデフォルトではないのでこちらも基本はしない方向です。
110
  // ※スパム情報保存していないと機能しません。
111
  $default_spam_limit_minutes = 10; // 10分以内に・・・
112
  $default_spam_limit_count = 2; // 2回までは許そうか。
113
  $default_spam_limit_over_interval = 10; // だがそれを超えたら(デフォルト3回目以降)10分はOKコメントでもスパム扱いするんでよろしく!
114
+ $default_spam_limit_over_interval_error_msg = ''; // そしてその際のエラーメッセージは・・・
115
 
 
 
 
 
116
 
 
 
117
 
118
  /** オプションキー */
119
  // ダミーフィールドを生成しそこに入力がある場合はエラーとするかフラグ [tsa_dummy_param_field_flg] 1:する 2:しない
151
  /** プロセス */
152
  $newThrowsSpamAway = new ThrowsSpamAway;
153
  // トラックバックチェックフィルター
154
+ add_filter( 'preprocess_comment', array( &$newThrowsSpamAway, 'trackback_spam_away' ), 1, 1 );
155
  // ダミーフィールド作成
156
+ $dummy_param_field_flg = get_option( 'tsa_dummy_param_field_flg', $default_dummy_param_field_flg );
157
+ if ( '1' == $dummy_param_field_flg ) {
158
+ add_action( 'init', array( &$newThrowsSpamAway, 'tsa_scripts_init' ), 9997 );
159
  add_action( "comment_form", array(&$newThrowsSpamAway, "comment_form_dummy_param_field" ), 9998);
160
  }
161
  // 注意文言表示
162
  // コメントフォーム表示
163
+ $comment_disp_point = 'comment_form';
164
+ $comment_form_action_point = get_option( 'tsa_caution_msg_point', $default_caution_msg_point );
165
  // フォーム内かフォーム外か判断する
166
+ if ( '2' == $comment_form_action_point ) {
167
+ $comment_disp_point = 'comment_form_after';
168
  }
169
+ add_action( $comment_disp_point, array( &$newThrowsSpamAway, 'comment_form' ), 9999 );
170
  // コメントチェックフィルター
171
+ add_action( 'pre_comment_on_post', array( &$newThrowsSpamAway, 'comment_post' ), 1 );
172
+