Throws SPAM Away - Version 2.6.3

Version Description

IPIP

Download this release

Release Info

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

Code changes from version 2.6.2 to 2.6.3

css/tipTip.css DELETED
@@ -1,114 +0,0 @@
1
- /* TipTip CSS - Version 1.2 */
2
-
3
- #tiptip_holder {
4
- display: none;
5
- position: absolute;
6
- top: 0;
7
- left: 0;
8
- z-index: 99999;
9
- }
10
-
11
- #tiptip_holder.tip_top {
12
- padding-bottom: 5px;
13
- }
14
-
15
- #tiptip_holder.tip_bottom {
16
- padding-top: 5px;
17
- }
18
-
19
- #tiptip_holder.tip_right {
20
- padding-left: 5px;
21
- }
22
-
23
- #tiptip_holder.tip_left {
24
- padding-right: 5px;
25
- }
26
-
27
- #tiptip_content {
28
- font-size: 11px;
29
- text-align: left;
30
- color: #fff;
31
- text-shadow: 0 0 2px #000;
32
- padding: 4px 8px;
33
- border: 1px solid rgba(255,255,255,0.25);
34
- background-color: rgb(25,25,25);
35
- /* background-color: rgba(25,25,25,0.92); */
36
- background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(transparent), to(#000));
37
- border-radius: 3px;
38
- -webkit-border-radius: 3px;
39
- -moz-border-radius: 3px;
40
- box-shadow: 0 0 3px #555;
41
- -webkit-box-shadow: 0 0 3px #555;
42
- -moz-box-shadow: 0 0 3px #555;
43
- }
44
-
45
- #tiptip_arrow, #tiptip_arrow_inner {
46
- position: absolute;
47
- border-color: transparent;
48
- border-style: solid;
49
- border-width: 6px;
50
- height: 0;
51
- width: 0;
52
- }
53
-
54
- #tiptip_holder.tip_top #tiptip_arrow {
55
- border-top-color: #fff;
56
- border-top-color: rgba(255,255,255,0.35);
57
- }
58
-
59
- #tiptip_holder.tip_bottom #tiptip_arrow {
60
- border-bottom-color: #fff;
61
- border-bottom-color: rgba(255,255,255,0.35);
62
- }
63
-
64
- #tiptip_holder.tip_right #tiptip_arrow {
65
- border-right-color: #fff;
66
- border-right-color: rgba(255,255,255,0.35);
67
- }
68
-
69
- #tiptip_holder.tip_left #tiptip_arrow {
70
- border-left-color: #fff;
71
- border-left-color: rgba(255,255,255,0.35);
72
- }
73
-
74
- #tiptip_holder.tip_top #tiptip_arrow_inner {
75
- margin-top: -7px;
76
- margin-left: -6px;
77
- border-top-color: rgb(25,25,25);
78
- border-top-color: rgba(25,25,25,0.92);
79
- }
80
-
81
- #tiptip_holder.tip_bottom #tiptip_arrow_inner {
82
- margin-top: -5px;
83
- margin-left: -6px;
84
- border-bottom-color: rgb(25,25,25);
85
- border-bottom-color: rgba(25,25,25,0.92);
86
- }
87
-
88
- #tiptip_holder.tip_right #tiptip_arrow_inner {
89
- margin-top: -6px;
90
- margin-left: -5px;
91
- border-right-color: rgb(25,25,25);
92
- border-right-color: rgba(25,25,25,0.92);
93
- }
94
-
95
- #tiptip_holder.tip_left #tiptip_arrow_inner {
96
- margin-top: -6px;
97
- margin-left: -7px;
98
- border-left-color: rgb(25,25,25);
99
- border-left-color: rgba(25,25,25,0.92);
100
- }
101
-
102
- /* Webkit Hacks */
103
- @media screen and (-webkit-min-device-pixel-ratio:0) {
104
- #tiptip_content {
105
- padding: 4px 8px 5px 8px;
106
- background-color: rgba(45,45,45,0.88);
107
- }
108
- #tiptip_holder.tip_bottom #tiptip_arrow_inner {
109
- border-bottom-color: rgba(45,45,45,0.88);
110
- }
111
- #tiptip_holder.tip_top #tiptip_arrow_inner {
112
- border-top-color: rgba(20,20,20,0.92);
113
- }
114
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
css/tsa_data_styles.css ADDED
@@ -0,0 +1,141 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @CHARSET "UTF-8";
2
+ /** Throws SPAM Away */
3
+ /** 変更ボタン */
4
+ p.submit .button-primary {
5
+ width: 200px;
6
+ height: 30px;
7
+ margin: 20px auto 50px 20px;
8
+ }
9
+ /** ------ lightbox風 ----- */
10
+ #kotak-dialog {
11
+ position:absolute;
12
+ top:20%;
13
+ left:50%;
14
+ margin:0px 0px 0px -200px;
15
+ width:400px;
16
+ height:auto;
17
+ background-color:#fff;
18
+ -webkit-box-shadow:0px 1px 2px rgba(0,0,0,0.4);
19
+ -moz-box-shadow:0px 1px 2px rgba(0,0,0,0.4);
20
+ box-shadow:0px 1px 2px rgba(0,0,0,0.4);
21
+ z-index:1000;
22
+ display:none;
23
+ }
24
+
25
+ #kotak-dialog *:focus {
26
+ outline:none;
27
+ }
28
+
29
+ #kotak-dialog h3.title {
30
+ background-color:#3B5998;
31
+ padding:10px 15px;
32
+ color:#fff;
33
+ font:normal 16px Arial,Sans-Serif;
34
+ margin:0px 0px 0px 0px;
35
+ position:relative;
36
+ }
37
+
38
+ #kotak-dialog h3.title a {
39
+ position:absolute;
40
+ top:10px;
41
+ right:15px;
42
+ color:#fff;
43
+ text-decoration:none;
44
+ cursor:pointer;
45
+ }
46
+
47
+ #kotak-dialog .isi-dialog {
48
+ margin:15px;
49
+ font:normal 12px Arial,Sans-Serif;
50
+ }
51
+
52
+ #kotak-dialog .button-wrapper {
53
+ padding:10px 15px 0px;
54
+ border-top:1px solid #ddd;
55
+ margin-top:15px;
56
+ }
57
+
58
+ #kotak-dialog .button-wrapper button {
59
+ background-color:#FF0C39;
60
+ border:none;
61
+ font:bold 12px Arial,Sans-Serif;
62
+ color:#fff;
63
+ padding:5px 10px;
64
+ -webkit-border-radius:3px;
65
+ -moz-border-radius:3px;
66
+ border-radius:3px;
67
+ cursor:pointer;
68
+ }
69
+
70
+ #kotak-dialog .button-wrapper button:hover {
71
+ background-color:#aaa;
72
+ }
73
+
74
+ #dialog-overlay {
75
+ position:fixed !important;
76
+ position:absolute;
77
+ z-index:999;
78
+ top:0px;
79
+ right:0px;
80
+ bottom:0px;
81
+ left:0px;
82
+ background-color:#000;
83
+ display:none;
84
+ }
85
+
86
+
87
+ /* Iframe */
88
+ #iframeContainer iframe {
89
+ width:100%;
90
+ height:300px;
91
+ border:none;
92
+ background-color:#ccc;
93
+ overflow:auto;
94
+ }
95
+
96
+ /** スクロール対象テーブルCSS */
97
+ #spam_list {
98
+ background-color: #ffffff;
99
+ border-collapse:;
100
+ font-size: 1em !important;
101
+ }
102
+ /** 全体container */
103
+ #spam_list_container {
104
+ position: relative;
105
+ padding-top: 26px;
106
+ width: 928px; /* 列幅合計+セル間の幅(2px)の合計+20px */
107
+ border: 1px solid #3377b6;
108
+ background-color: #ffffff;
109
+ }
110
+ /** tbody スクロール対象 */
111
+ #spam_list_div {
112
+ overflow: auto;
113
+ height: 600px;
114
+ }
115
+
116
+ #spam_list thead tr {
117
+ position: absolute;
118
+ top: 0;
119
+ left: 0;
120
+ background-color: #ffffff;
121
+ }
122
+ #spam_list thead tr th {
123
+ background-color: #3377b6;
124
+ color: #fff;
125
+ padding: 3px 0px;
126
+ }
127
+ #spam_list tbody tr td {
128
+ background-color: #efefef;
129
+ color: black;
130
+ padding: 3px 6px;
131
+ }
132
+ #spam_list tbody tr.odd td {
133
+ background-color:#F0F0F6;
134
+ }
135
+
136
+ .cols0 { width: 200px; }
137
+ .cols1 { width: 50px; }
138
+ .cols2 { width: 130px; }
139
+ .cols3 { width: 300px; }
140
+ .cols4 { width: 220px; }
141
+
css/tsa_styles.css ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @CHARSET "UTF-8";
2
+ /**
3
+ Throws SPAM Away
4
+ Option page
5
+ */
6
+
7
+ h2 {
8
+ padding: 10px !important;
9
+ }
10
+
11
+ .wrap h3 {
12
+ background: #fff;
13
+ border-left: 3px solid orange ;
14
+ margin: 0 0 15px 15px;
15
+ padding: 5px 10px;
16
+ }
17
+
18
+ .wrap p {
19
+ margin: 0 0 15px 15px;
20
+ padding: 5px 10px;
21
+ }
22
+
23
+ .wrap table.form-table {
24
+ margin: 0 0 15px 15px;
25
+ padding: 5px 10px;
26
+ border-collapse: separate;
27
+ border-spacing: 5px;
28
+ }
29
+
30
+ .wrap table.form-table tbody tr th {
31
+ background: #fff;
32
+ width: 250px;
33
+ margin: 0 0 15px 15px;
34
+ padding: 5px 10px;
35
+ border: solid 1px #ddd;
36
+ border-radius: 3px;
37
+ box-shadow: 0 1px 3px rgba( 0, 0, 0, 0.1 );
38
+ overflow: hidden;
39
+ }
40
+
hostbyip.php CHANGED
@@ -3,6 +3,7 @@
3
  * <p>ThrowsSpamAway</p> hostbyipページ
4
  * WordPress's Plugin
5
  * @author Takeshi Satoh@GTI Inc. 2013
 
6
  */
7
  require_once 'throws_spam_away.class.php';
8
  require_once dirname( __FILE__ ).'/../../../wp-load.php';
@@ -13,10 +14,12 @@ $spam_ip = htmlspecialchars($_GET['ip']);
13
  $newThrowsSpamAway = new ThrowsSpamAway(TRUE);
14
  $last_spam_comment_result = $newThrowsSpamAway->get_last_spam_comment($spam_ip);
15
  // 最終投稿日
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#" >
@@ -57,6 +60,16 @@ Whois: <a href="http://whois.arin.net/rest/ip/<?php echo $spam_ip; ?>" target="_
57
  <div style="background: #999;color: #fff;margin:3px 0 0 0;">このIPからスパム投稿対象となったページ</div><a href="<?php echo $last_comment_post; ?>" target="_blank"><?php echo $last_comment_post_title; ?></a><br />
58
  <?php } ?>
59
  <h4>スパムフィルター:<?php echo ($is_spam_champuru ? "スパムちゃんぷるー存在IPアドレス" : "未検出" ); ?></h4>
 
 
 
 
 
 
 
 
 
 
60
  <div style="text-align:right;"><a href="javascript:void(0);" onclick="window.close();">閉じる</a></div>
61
  </div>
62
  </body>
3
  * <p>ThrowsSpamAway</p> hostbyipページ
4
  * WordPress's Plugin
5
  * @author Takeshi Satoh@GTI Inc. 2013
6
+ * 2.6.3 2014/06/06
7
  */
8
  require_once 'throws_spam_away.class.php';
9
  require_once dirname( __FILE__ ).'/../../../wp-load.php';
14
  $newThrowsSpamAway = new ThrowsSpamAway(TRUE);
15
  $last_spam_comment_result = $newThrowsSpamAway->get_last_spam_comment($spam_ip);
16
  // 最終投稿日
17
+ $last_comment_date = $last_spam_comment_result->post_date;
18
+ $last_comment_post = get_permalink($last_spam_comment_result->post_id);
19
  $last_comment_post_title = get_the_title(get_post($last_spam_comment_result->post_id));
20
+ $is_spam_champuru = ( $newThrowsSpamAway->reject_spam_ip( $spam_ip ) ? FALSE : TRUE );
21
+ $spam_author = $last_spam_comment_result->spam_author;
22
+ $spam_comment = esc_attr($last_spam_comment_result->spam_comment);
23
  ?><!DOCTYPE html>
24
  <!--[if IE 8]>
25
  <html xmlns="http://www.w3.org/1999/xhtml" class="ie8 wp-toolbar" lang="ja" prefix="og: http://ogp.me/ns#" >
60
  <div style="background: #999;color: #fff;margin:3px 0 0 0;">このIPからスパム投稿対象となったページ</div><a href="<?php echo $last_comment_post; ?>" target="_blank"><?php echo $last_comment_post_title; ?></a><br />
61
  <?php } ?>
62
  <h4>スパムフィルター:<?php echo ($is_spam_champuru ? "スパムちゃんぷるー存在IPアドレス" : "未検出" ); ?></h4>
63
+
64
+ <div style="background: #999;color: #fff;margin:3px 0 0 0;">最新コメント内容</div>
65
+ <div ><?php if ( $spam_author != NULL && $spam_comment != NULL ) {
66
+ ?>
67
+ IP: <?php esc_attr_e( $spam_ip ); ?><br />
68
+ 名前:<?php echo esc_attr( $spam_author ); ?><br />
69
+ 内容:<?php esc_attr_e( $spam_comment ); ?><?php
70
+ } ?>
71
+ </div>
72
+
73
  <div style="text-align:right;"><a href="javascript:void(0);" onclick="window.close();">閉じる</a></div>
74
  </div>
75
  </body>
js/jquery.tipTip.js DELETED
@@ -1,191 +0,0 @@
1
- /*
2
- * TipTip
3
- * Copyright 2010 Drew Wilson
4
- * www.drewwilson.com
5
- * code.drewwilson.com/entry/tiptip-jquery-plugin
6
- *
7
- * Version 1.3 - Updated: Mar. 23, 2010
8
- *
9
- * This Plug-In will create a custom tooltip to replace the default
10
- * browser tooltip. It is extremely lightweight and very smart in
11
- * that it detects the edges of the browser window and will make sure
12
- * the tooltip stays within the current window size. As a result the
13
- * tooltip will adjust itself to be displayed above, below, to the left
14
- * or to the right depending on what is necessary to stay within the
15
- * browser window. It is completely customizable as well via CSS.
16
- *
17
- * This TipTip jQuery plug-in is dual licensed under the MIT and GPL licenses:
18
- * http://www.opensource.org/licenses/mit-license.php
19
- * http://www.gnu.org/licenses/gpl.html
20
- */
21
-
22
- (function($){
23
- $.fn.tipTip = function(options) {
24
- var defaults = {
25
- activation: "hover",
26
- keepAlive: false,
27
- maxWidth: "200px",
28
- edgeOffset: 3,
29
- defaultPosition: "bottom",
30
- delay: 400,
31
- fadeIn: 200,
32
- fadeOut: 200,
33
- attribute: "title",
34
- content: false, // HTML or String to fill TipTIp with
35
- enter: function(){},
36
- exit: function(){}
37
- };
38
- var opts = $.extend(defaults, options);
39
-
40
- // Setup tip tip elements and render them to the DOM
41
- if($("#tiptip_holder").length <= 0){
42
- var tiptip_holder = $('<div id="tiptip_holder" style="max-width:'+ opts.maxWidth +';"></div>');
43
- var tiptip_content = $('<div id="tiptip_content"></div>');
44
- var tiptip_arrow = $('<div id="tiptip_arrow"></div>');
45
- $("body").append(tiptip_holder.html(tiptip_content).prepend(tiptip_arrow.html('<div id="tiptip_arrow_inner"></div>')));
46
- } else {
47
- var tiptip_holder = $("#tiptip_holder");
48
- var tiptip_content = $("#tiptip_content");
49
- var tiptip_arrow = $("#tiptip_arrow");
50
- }
51
-
52
- return this.each(function(){
53
- var org_elem = $(this);
54
- if(opts.content){
55
- var org_title = opts.content;
56
- } else {
57
- var org_title = org_elem.attr(opts.attribute);
58
- }
59
- if(org_title != ""){
60
- if(!opts.content){
61
- org_elem.removeAttr(opts.attribute); //remove original Attribute
62
- }
63
- var timeout = false;
64
-
65
- if(opts.activation == "hover"){
66
- org_elem.hover(function(){
67
- active_tiptip();
68
- }, function(){
69
- if(!opts.keepAlive){
70
- deactive_tiptip();
71
- }
72
- });
73
- if(opts.keepAlive){
74
- tiptip_holder.hover(function(){}, function(){
75
- deactive_tiptip();
76
- });
77
- }
78
- } else if(opts.activation == "focus"){
79
- org_elem.focus(function(){
80
- active_tiptip();
81
- }).blur(function(){
82
- deactive_tiptip();
83
- });
84
- } else if(opts.activation == "click"){
85
- org_elem.click(function(){
86
- active_tiptip();
87
- return false;
88
- }).hover(function(){},function(){
89
- if(!opts.keepAlive){
90
- deactive_tiptip();
91
- }
92
- });
93
- if(opts.keepAlive){
94
- tiptip_holder.hover(function(){}, function(){
95
- deactive_tiptip();
96
- });
97
- }
98
- }
99
-
100
- function active_tiptip(){
101
- opts.enter.call(this);
102
- tiptip_content.html(org_title);
103
- tiptip_holder.hide().removeAttr("class").css("margin","0");
104
- tiptip_arrow.removeAttr("style");
105
-
106
- var top = parseInt(org_elem.offset()['top']);
107
- var left = parseInt(org_elem.offset()['left']);
108
- var org_width = parseInt(org_elem.outerWidth());
109
- var org_height = parseInt(org_elem.outerHeight());
110
- var tip_w = tiptip_holder.outerWidth();
111
- var tip_h = tiptip_holder.outerHeight();
112
- var w_compare = Math.round((org_width - tip_w) / 2);
113
- var h_compare = Math.round((org_height - tip_h) / 2);
114
- var marg_left = Math.round(left + w_compare);
115
- var marg_top = Math.round(top + org_height + opts.edgeOffset);
116
- var t_class = "";
117
- var arrow_top = "";
118
- var arrow_left = Math.round(tip_w - 12) / 2;
119
-
120
- if(opts.defaultPosition == "bottom"){
121
- t_class = "_bottom";
122
- } else if(opts.defaultPosition == "top"){
123
- t_class = "_top";
124
- } else if(opts.defaultPosition == "left"){
125
- t_class = "_left";
126
- } else if(opts.defaultPosition == "right"){
127
- t_class = "_right";
128
- }
129
-
130
- var right_compare = (w_compare + left) < parseInt($(window).scrollLeft());
131
- var left_compare = (tip_w + left) > parseInt($(window).width());
132
-
133
- if((right_compare && w_compare < 0) || (t_class == "_right" && !left_compare) || (t_class == "_left" && left < (tip_w + opts.edgeOffset + 5))){
134
- t_class = "_right";
135
- arrow_top = Math.round(tip_h - 13) / 2;
136
- arrow_left = -12;
137
- marg_left = Math.round(left + org_width + opts.edgeOffset);
138
- marg_top = Math.round(top + h_compare);
139
- } else if((left_compare && w_compare < 0) || (t_class == "_left" && !right_compare)){
140
- t_class = "_left";
141
- arrow_top = Math.round(tip_h - 13) / 2;
142
- arrow_left = Math.round(tip_w);
143
- marg_left = Math.round(left - (tip_w + opts.edgeOffset + 5));
144
- marg_top = Math.round(top + h_compare);
145
- }
146
-
147
- var top_compare = (top + org_height + opts.edgeOffset + tip_h + 8) > parseInt($(window).height() + $(window).scrollTop());
148
- var bottom_compare = ((top + org_height) - (opts.edgeOffset + tip_h + 8)) < 0;
149
-
150
- if(top_compare || (t_class == "_bottom" && top_compare) || (t_class == "_top" && !bottom_compare)){
151
- if(t_class == "_top" || t_class == "_bottom"){
152
- t_class = "_top";
153
- } else {
154
- t_class = t_class+"_top";
155
- }
156
- arrow_top = tip_h;
157
- marg_top = Math.round(top - (tip_h + 5 + opts.edgeOffset));
158
- } else if(bottom_compare | (t_class == "_top" && bottom_compare) || (t_class == "_bottom" && !top_compare)){
159
- if(t_class == "_top" || t_class == "_bottom"){
160
- t_class = "_bottom";
161
- } else {
162
- t_class = t_class+"_bottom";
163
- }
164
- arrow_top = -12;
165
- marg_top = Math.round(top + org_height + opts.edgeOffset);
166
- }
167
-
168
- if(t_class == "_right_top" || t_class == "_left_top"){
169
- marg_top = marg_top + 5;
170
- } else if(t_class == "_right_bottom" || t_class == "_left_bottom"){
171
- marg_top = marg_top - 5;
172
- }
173
- if(t_class == "_left_top" || t_class == "_left_bottom"){
174
- marg_left = marg_left + 5;
175
- }
176
- tiptip_arrow.css({"margin-left": arrow_left+"px", "margin-top": arrow_top+"px"});
177
- tiptip_holder.css({"margin-left": marg_left+"px", "margin-top": marg_top+"px"}).attr("class","tip"+t_class);
178
-
179
- if (timeout){ clearTimeout(timeout); }
180
- timeout = setTimeout(function(){ tiptip_holder.stop(true,true).fadeIn(opts.fadeIn); }, opts.delay);
181
- }
182
-
183
- function deactive_tiptip(){
184
- opts.exit.call(this);
185
- if (timeout){ clearTimeout(timeout); }
186
- tiptip_holder.fadeOut(opts.fadeOut);
187
- }
188
- }
189
- });
190
- }
191
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
readme.txt CHANGED
@@ -4,48 +4,83 @@ 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
 
11
  == Description ==
12
- 海外からのコメントスパムに対抗(?)する手段として開発したプラグインです。
 
13
 
14
- コメント欄に日本語文字列が含まれていないと投稿出来ない・・・(その他設定可能です。)
15
- といってもエラーにするのではなく「無視」して何事もなかったようにもとの記事に戻ります。
 
16
 
17
- ダブルバイトをカウントするのではなく正規表現により日本語を検出しているため、ダブルバイトの他言語も侵入してきません。
 
18
 
19
- また、NGキーワードを複数設定することが出来ます。(カンマ区切りにて設定)
20
- 日本語の文章であっても設定された「NGキーワード」を含む投稿の場合は、同様に無視します。
21
- もちろん他の言語のキーワードでもOKです。
22
 
23
- 日本語が一切入っていないコメントでも「NGキーワード」だけ設定したい場合を想定し
24
- 日本語が入っていないと許可しない設定を「オン・オフ」出来るようになっています。
25
- リンクと思わしき'http'を含んだ文字列が許容数(初期設定は3つ)を超えて包含される場合にエラーとします。
 
26
 
27
- 設定により、空のダミーフィールドを生成しJavaScriptでの制御を行うことでスパム判定出来ます。
28
- ※スパムプログラムによる投稿に有効です。実際に入力しようとしてもその項目は見えないようになっています。
29
 
30
- IPアドレスによる投稿制御が出来ます。
 
31
 
32
- 以前スパムとしてチェックした投稿のIPアドレス及び、任意のIPアドレスでの制御も出来るようになっています。
 
 
 
33
 
34
- 「スパムちゃんぷるー(ベータ)」http://spam-champuru.livedoor.com/dnsbl/ を利用してスパム判定することも可能です。
35
- 設定にてON/OFF出来ます。
 
36
 
37
- 「IPアドレス ホワイトリスト」があります。ホワイトリストに登録されたIPアドレスからの投稿はノーチェックで投稿完了されます。
38
- ※ホワイトリストが一番強力にしてありますので、このIPアドレスがAkismetで捉えられていてもスパムちゃんぷるーでスパム扱いになったとしても優先で通過させます。
39
 
40
- スパムデータベースでスパム投稿の増減を確認出来ます。
41
- 表示期間を設定出来ますのでお好みの周期を設定してください。
42
- また表示期間を過ぎたデータを削除することも可能です。
43
- テストなどでスパム投稿したIPアドレスはスパム投稿一覧よりボタンひとつで削除出来ます。
44
 
45
  IPアドレスの指定「ブロックリスト」「ホワイトリスト」共に「改行」区切りで複数入力できますが、「192.168.1.0/24」のように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.2
50
   スパム対策設定の初期値を長年の研究の末の「最適」であろう設定値にしました。
51
   デフォルト値として項目の下に記載しています。長年ご利用の方は、参考に調整してください。
@@ -178,6 +213,19 @@ e.g.
178
  == Screenshots ==
179
 
180
  == Changelog ==
 
 
 
 
 
 
 
 
 
 
 
 
 
181
  = 2.6 =
182
   コメント欄に隠しフィールドを生成しその項目に入力があればスパム判定する機能を追加。
183
   スパムデータベースに[error_type]を追加。なにが原因でスパム判定されたかとスパム投稿の内容をスパムデータベースで保存(255バイトずつ)
4
  Tags: comments, spam
5
  Requires at least: 3.1
6
  Tested up to: 3.9.1
7
+ Stable tag: 2.6.3
8
+ License: GPLv2 or later
9
+ License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
11
+ スパムコメントを無視して何もなかったように捨てる強力スパム対策プラグイン
12
 
13
  == Description ==
14
+ 海外からのコメントスパムに対抗(?)する手段として開発したプラグインですが
15
+ 現在下記のフィルタでスパム判定しています。
16
 
17
+ ・日本語判定(日本語を含むかどうか)
18
+  コメント欄に日本語文字列が含まれていないと投稿出来ない・・・
19
+  といってもエラーにするのではなく「無視」して何事もなかったようにもとの記事に戻ります。
20
 
21
+  ダブルバイトをカウントするのではなく正規表現により日本語を検出しているため、ダブルバイトの他言語も侵入してきません。
22
+  [設定にてON/OFF出来ます。]
23
 
 
 
 
24
 
25
+ NGキーワード判定
26
+  NGキーワードを複数設定することが出来ます。(カンマ区切りにて設定)
27
+  日本語の文章であっても設定された「NGキーワード」を含む投稿の場合は、同様に無視します。
28
+  もちろん他の言語のキーワードでもOKです。
29
 
30
+  日本語が一切入っていないコメントでも「NGキーワード」だけ設定したい場合を想定し
31
+  日本語が入っていないと許可しない設定を「オン・オフ」出来るようになっています。
32
 
33
+ ・リンク含有数判定
34
+  リンクと思わしき'http'を含んだ文字列が許容数(初期設定は3つ)を超えて包含される場合にエラーとします。
35
 
36
+ ・ダミー項目による判定(スパムロボット対策)
37
+  空のダミーフィールドを生成しJavaScriptでの制御を行うことでスパム判定します。(停止も可能です)
38
+  ※スパムプログラムによる投稿に有効です。実際に入力しようとしてもその項目は見えないようになっています。
39
+  [設定にてON/OFF出来ます。]
40
 
41
+ ・IPアドレスによる判定
42
+  指定IPアドレスからの投稿をスパムとして処理します。
43
+  以前スパムとしてチェックした投稿のIPアドレス及び、任意のIPアドレスでの制御も出来るようになっています。
44
 
45
+  【ブラックリスト】
46
+   ブラックリストに登録したIPアドレスからの投稿をスパム処理します。
47
 
48
+  【ホワイトリスト】
49
+   ホワイトリストに登録したIPアドレスからの投稿はすべてのフィルタを通しませんので優先的に通常コメントとしてノーチェックで投稿処理がなされます。
50
+ ※ホワイトリストが一番強力にしてありますので、このIPアドレスがAkismetで捉えられていてもスパムちゃんぷるーでスパム扱いになったとしても優先で通過させます。
 
51
 
52
  IPアドレスの指定「ブロックリスト」「ホワイトリスト」共に「改行」区切りで複数入力できますが、「192.168.1.0/24」のようにIPアドレスの範囲指定も可能です。
53
  ※例:192.168.0.1,192.168.1.0/24,69.208.0.0/16 と指定した場合
54
   [192.168.0.1]と[192.168.1.0 ~ 192.168.1.255]と[69.208.0.0 ~ 69.208.255.255]のIPアドレスを拒否(または優先通過)対象とします。
55
 
56
+ ・スパムフィルタによる判定
57
+  「スパムちゃんぷるー(ベータ)」http://spam-champuru.livedoor.com/dnsbl/ を利用してスパム判定することも可能です。
58
+  設定にてON/OFF出来ます。
59
+
60
+
61
+ ○スパムデータベースでスパム投稿の増減を確認出来ます。
62
+
63
+ 表示期間を設定出来ますのでお好みの周期を設定してください。
64
+
65
+ また表示期間を過ぎたデータを削除することも可能です。
66
+ ※あまりにも解析処理に時間がかかるようでしたら過去のデータを削除することをお試し下さい。
67
+
68
+ テストなどでスパム投稿したIPアドレスはスパム投稿一覧よりボタンひとつで削除出来ます。
69
+
70
+ ※コメント投稿時のスパムコメント対応の煩わしさが原因で作ったものですのでスパム判定されたコメントを保持しておりません。
71
+
72
+ -- これまでの変更点について
73
+
74
+ ・バージョン2.6.3
75
+  2014/06/06
76
+  スパムデータベースの表示速度を向上するため
77
+  スパムコメントの表示を個別画面へ移動(エラーをクリック)
78
+
79
+  スパムの区別が「すぱむちゃんぷるー」でも「指定IP」でも同一「ブロックIPアドレス」であったが
80
+  「すぱむちゃんぷるー」を分けて表示するようにした。これによりブラックリストから外せる場合が増えるはずです。
81
+
82
+  管理画面の見栄えを変更しました。
83
+
84
  ・バージョン2.6.2
85
   スパム対策設定の初期値を長年の研究の末の「最適」であろう設定値にしました。
86
   デフォルト値として項目の下に記載しています。長年ご利用の方は、参考に調整してください。
213
  == Screenshots ==
214
 
215
  == Changelog ==
216
+ = 2.6.3 =
217
+  スパムデータベースの表示速度を向上するため
218
+  スパムコメントの表示を個別画面へ移動(エラーをクリック)
219
+
220
+  スパムの区別が「すぱむちゃんぷるー」でも「指定IP」でも同一「ブロックIPアドレス」であったが
221
+  「すぱむちゃんぷるー」を分けて表示するようにした。これによりブラックリストから外せる場合が増えるはずです。
222
+
223
+  管理画面の見栄えを変更しました。
224
+
225
+ = 2.6.2 =
226
+  IE8でスクリプトエラーが発生していたため、修正しました。
227
+  初期設定値を最適化しました。デフォルトで効果的なスパム対策を提供します。
228
+
229
  = 2.6 =
230
   コメント欄に隠しフィールドを生成しその項目に入力があればスパム判定する機能を追加。
231
   スパムデータベースに[error_type]を追加。なにが原因でスパム判定されたかとスパム投稿の内容をスパムデータベースで保存(255バイトずつ)
throws_spam_away.class.php CHANGED
@@ -8,7 +8,7 @@
8
  */
9
  class ThrowsSpamAway {
10
 
11
- // version
12
  var $version = '2.6';
13
  var $table_name = NULL;
14
 
@@ -200,6 +200,8 @@ class ThrowsSpamAway {
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;
@@ -325,7 +327,7 @@ class ThrowsSpamAway {
325
  }
326
  }
327
  if ( $spam ) {
328
- $error_type = 'block_ip';
329
  return FALSE;
330
  }
331
  return TRUE;
@@ -564,6 +566,7 @@ class ThrowsSpamAway {
564
  if ( esc_attr( $_GET['settings-updated'] ) == 'true' ) {
565
  $_saved = TRUE;
566
  }
 
567
  ?>
568
  <style>
569
  table.form-table {
@@ -627,12 +630,15 @@ function addIpAddresses(newAddressStr) {
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">
@@ -652,7 +658,8 @@ function addIpAddresses(newAddressStr) {
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
@@ -707,15 +714,18 @@ function addIpAddresses(newAddressStr) {
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 />
711
- 「コメント欄の下に表示される注意文言」が空白の場合は文言表示のタグ自体が挿入されないようになります。</td></tr>
 
 
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>
 
719
  <table class="form-table">
720
  <tr valign="top">
721
  <th scope="row">URLらしき文字列が混入している場合エラーとするか</th>
@@ -744,7 +754,9 @@ function addIpAddresses(newAddressStr) {
744
  (初期設定:<?php echo $default_url_count_over_error_msg;?>)</td>
745
  </tr>
746
  </table>
747
- <h3>NGキーワード / 必須キーワード 制御設定</h3>
 
 
748
  <table class="form-table">
749
  <tr valign="top">
750
  <th scope="row">その他NGキーワード<br />(日本語でも英語(その他)でもNGとしたいキーワードを半角カンマ区切りで複数設定できます。<br />挙動は同じです。NGキーワードだけでも使用できます。)
@@ -773,7 +785,9 @@ function addIpAddresses(newAddressStr) {
773
  (初期設定:<?php echo $default_must_key_error_msg;?>)</td>
774
  </tr>
775
  </table>
776
- <h3>トラックバックへの対応設定</h3>
 
 
777
  <table class="form-table">
778
  <tr valign="top">
779
  <th scope="row">上記設定をトラックバック記事にも採用する</th>
@@ -809,7 +823,9 @@ function addIpAddresses(newAddressStr) {
809
  </td>
810
  </tr>
811
  </table>
812
- <h3>投稿IPアドレスによる制御設定</h3>
 
 
813
  <table class="form-table">
814
  <tr valign="top">
815
  <th scope="row">SPAMブラックリスト利用</th>
@@ -872,7 +888,9 @@ function addIpAddresses(newAddressStr) {
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">
877
  <th scope="row"><strong>IP制御免除<br />ホワイトリスト</strong></th>
878
  <td>
@@ -883,7 +901,9 @@ function addIpAddresses(newAddressStr) {
883
  </tr>
884
 
885
  </table>
886
- <h3>メモ(スパム対策情報や IPアドレス・NGワードその他メモ備忘録としてご自由にお使い下さい)</h3>
 
 
887
  <p>この欄の内容が表示されることはありません。</p>
888
  <table class="form-table">
889
  <tr valign="top">
@@ -893,7 +913,9 @@ function addIpAddresses(newAddressStr) {
893
  </td>
894
  </tr>
895
  </table>
896
- <h3>スパムデータベース</h3>
 
 
897
  <table class="form-table">
898
  <tr valign="top">
899
  <th scope="row">スパムコメント投稿情報を保存しますか?</th>
@@ -925,11 +947,10 @@ function addIpAddresses(newAddressStr) {
925
  ※一度消したデータは復活出来ませんのでご注意ください。また最低7日分は保存されます。
926
  </td>
927
  </tr>
928
- <tr valign="top">
929
- <th scope="row" colspan="2">一定時間内スパム認定機能<br />○分以内に○回スパムとなったら○分間、当該IPからのコメントはスパム扱いする設定<br />
930
- <b>※一定時間以内にスパム投稿された回数を測定していますので「スパムコメント情報を保存する」機能がオフの場合は機能しません。</b>
931
- </th>
932
- </tr>
933
  <tr>
934
  <th scope="row">機能設定</th>
935
  <td><?php
@@ -953,6 +974,7 @@ function addIpAddresses(newAddressStr) {
953
  </td>
954
  </tr>
955
  </table>
 
956
 
957
  <input type="hidden" name="action" value="update" /> <input
958
  type="hidden" name="page_options"
@@ -1024,7 +1046,17 @@ function addIpAddresses(newAddressStr) {
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];
@@ -1084,9 +1116,9 @@ function addIpAddresses(newAddressStr) {
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;
@@ -1200,152 +1232,8 @@ function addIpAddresses(newAddressStr) {
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
- <!--
1208
- /** 変更ボタン */
1209
- p.submit .button-primary {
1210
- width: 200px;
1211
- height: 30px;
1212
- margin: 20px auto 50px 20px;
1213
- }
1214
- /** ------ lightbox風 ----- */
1215
- #kotak-dialog {
1216
- position:absolute;
1217
- top:20%;
1218
- left:50%;
1219
- margin:0px 0px 0px -200px;
1220
- width:400px;
1221
- height:auto;
1222
- background-color:#fff;
1223
- -webkit-box-shadow:0px 1px 2px rgba(0,0,0,0.4);
1224
- -moz-box-shadow:0px 1px 2px rgba(0,0,0,0.4);
1225
- box-shadow:0px 1px 2px rgba(0,0,0,0.4);
1226
- z-index:1000;
1227
- display:none;
1228
- }
1229
-
1230
- #kotak-dialog *:focus {
1231
- outline:none;
1232
- }
1233
-
1234
- #kotak-dialog h3.title {
1235
- background-color:#3B5998;
1236
- padding:10px 15px;
1237
- color:#fff;
1238
- font:normal 16px Arial,Sans-Serif;
1239
- margin:0px 0px 0px 0px;
1240
- position:relative;
1241
- }
1242
-
1243
- #kotak-dialog h3.title a {
1244
- position:absolute;
1245
- top:10px;
1246
- right:15px;
1247
- color:#fff;
1248
- text-decoration:none;
1249
- cursor:pointer;
1250
- }
1251
-
1252
- #kotak-dialog .isi-dialog {
1253
- margin:15px;
1254
- font:normal 12px Arial,Sans-Serif;
1255
- }
1256
-
1257
- #kotak-dialog .button-wrapper {
1258
- padding:10px 15px 0px;
1259
- border-top:1px solid #ddd;
1260
- margin-top:15px;
1261
- }
1262
-
1263
- #kotak-dialog .button-wrapper button {
1264
- background-color:#FF0C39;
1265
- border:none;
1266
- font:bold 12px Arial,Sans-Serif;
1267
- color:#fff;
1268
- padding:5px 10px;
1269
- -webkit-border-radius:3px;
1270
- -moz-border-radius:3px;
1271
- border-radius:3px;
1272
- cursor:pointer;
1273
- }
1274
-
1275
- #kotak-dialog .button-wrapper button:hover {
1276
- background-color:#aaa;
1277
- }
1278
-
1279
- #dialog-overlay {
1280
- position:fixed !important;
1281
- position:absolute;
1282
- z-index:999;
1283
- top:0px;
1284
- right:0px;
1285
- bottom:0px;
1286
- left:0px;
1287
- background-color:#000;
1288
- display:none;
1289
- }
1290
-
1291
-
1292
- /* Iframe */
1293
- #iframeContainer iframe {
1294
- width:100%;
1295
- height:300px;
1296
- border:none;
1297
- background-color:#ccc;
1298
- overflow:auto;
1299
- }
1300
-
1301
- /** スクロール対象テーブルCSS */
1302
- #spam_list {
1303
- background-color: #ffffff;
1304
- border-collapse:;
1305
- font-size: 1em !important;
1306
- }
1307
- /** 全体container */
1308
- #spam_list_container {
1309
- position: relative;
1310
- padding-top: 26px;
1311
- width: 928px; /* 列幅合計+セル間の幅(2px)の合計+20px */
1312
- border: 1px solid #3377b6;
1313
- background-color: #ffffff;
1314
- }
1315
- /** tbody スクロール対象 */
1316
- #spam_list_div {
1317
- overflow: auto;
1318
- height: 600px;
1319
- }
1320
-
1321
- #spam_list thead tr {
1322
- position: absolute;
1323
- top: 0;
1324
- left: 0;
1325
- background-color: #ffffff;
1326
- }
1327
- #spam_list thead tr th {
1328
- background-color: #3377b6;
1329
- color: #fff;
1330
- padding: 3px 0px;
1331
- }
1332
- #spam_list tbody tr td {
1333
- background-color: #efefef;
1334
- color: black;
1335
- padding: 3px 6px;
1336
- }
1337
- #spam_list tbody tr.odd td {
1338
- background-color:#F0F0F6;
1339
- }
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>
1349
  <script type="text/JavaScript">
1350
  <!--
1351
  jQuery(function() {
@@ -1358,26 +1246,6 @@ function addIpAddresses(newAddressStr) {
1358
  3: { sorter: false }
1359
  }
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
  });
1382
 
1383
  function removeIpAddressOnData(ipAddressStr) {
@@ -1399,7 +1267,8 @@ function addIpAddresses(newAddressStr) {
1399
  }
1400
  -->
1401
  </script>
1402
- <p><strong>投稿内容の判定</strong>&nbsp;最新投稿内容には最近のスパムコメント内容及びエラー判定が表示されます。●にカーソルを重ねると内容が表示されます。</p>
 
1403
  <div id="spam_list_container">
1404
  <div id="spam_list_div">
1405
  <table id="spam_list" class="tablesorter">
@@ -1414,7 +1283,7 @@ function addIpAddresses(newAddressStr) {
1414
  <th class="cols1">投稿数</th>
1415
  <th class="cols2">最終投稿日時</th>
1416
  <th class="cols3">スパムIP登録</th>
1417
- <th class="cols4">最新投稿内容</th>
1418
  </tr>
1419
  </thead>
1420
  <tbody>
@@ -1442,6 +1311,9 @@ function addIpAddresses(newAddressStr) {
1442
  case 'block_ip':
1443
  $spam_error_type_str = 'ブロック対象IPアドレス';
1444
  break;
 
 
 
1445
  case 'spam_trackback':
1446
  $spam_error_type_str = 'トラックバックスパム';
1447
  break;
@@ -1459,7 +1331,7 @@ function addIpAddresses(newAddressStr) {
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 ); ?>');"
@@ -1468,18 +1340,18 @@ function addIpAddresses(newAddressStr) {
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
8
  */
9
  class ThrowsSpamAway {
10
 
11
+ // データベースのversion
12
  var $version = '2.6';
13
  var $table_name = NULL;
14
 
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 'spam_champuru' :
204
+ $error_msg = get_option( 'tsa_block_ip_address_error_message', $default_block_ip_address_error_msg );
205
  case 'url_count_over' :
206
  $error_msg = get_option( 'tsa_url_count_over_error_message', $default_url_count_over_error_msg );
207
  break;
327
  }
328
  }
329
  if ( $spam ) {
330
+ $error_type = 'spam_champuru';
331
  return FALSE;
332
  }
333
  return TRUE;
566
  if ( esc_attr( $_GET['settings-updated'] ) == 'true' ) {
567
  $_saved = TRUE;
568
  }
569
+ wp_enqueue_style( 'thorows-spam-away-styles', plugins_url( '/css/tsa_styles.css', __FILE__ ) );
570
  ?>
571
  <style>
572
  table.form-table {
630
  }
631
  </script>
632
  <div class="wrap">
633
+ <h2 id="option_setting">Throws SPAM Away設定</h2>
634
  <?php if ( $_saved ) { ?>
635
  <div class="updated" style="padding: 10px; width: 50%;" id="message">設定の更新が完了しました。</div>
636
  <?php } ?>
637
  <form method="post" action="options.php">
638
+ <p>
639
+ <a href="spam_opt">スパム対策機能設定</a> | <a href="#url_opt">URL文字列除外 設定</a> | <a href="#keyword_opt">NGキーワード / 必須キーワード 制御設定</a> | <a href="#tb_opt">トラックバックへの対応設定</a> | <a href="#ip_opt">投稿IPアドレスによる制御設定</a> | <a href="#memo_opt">メモ</a> | <a href="#spam_data_opt">スパムデータベース</a>
640
+ </p>
641
+ <h3 id="spam_opt">スパム対策機能 設定</h3>
642
  <?php wp_nonce_field( 'update-options' ); ?>
643
  <table class="form-table">
644
  <tr valign="top">
658
  (初期設定:<?php echo ( $default_dummy_param_field_flg == '2' ? "しない" : "する" ); ?>)
659
  </td>
660
  </tr>
661
+ </table>
662
+ <table class="form-table">
663
  <tr valign="top">
664
  <th scope="row">日本語が存在しない場合、無視対象とする<br />(日本語文字列が存在しない場合無視対象となります。)</th>
665
  <td><?php
714
  (初期設定:<?php echo ( $default_caution_msg_point == '2' ? "コメント送信フォームの下" : "コメント送信ボタンの上" ); ?>)
715
  </td>
716
  </tr>
717
+ </table>
718
+ <p>※表示が崩れる場合、<a href="#tsa_caution_msg_point">「コメント注意文言の表示位置」</a>の変更 や <a href="#tsa_caution_message">「コメント欄の下に表示される注意文言」</a>を空白にすること を試してみて下さい。<br />
719
+ 「コメント欄の下に表示される注意文言」が空白の場合は文言表示のタグ自体が挿入されないようになります。</p>
720
+ <table class="form-table">
721
  <tr valign="top">
722
  <th scope="row">日本語文字列規定値未満エラー時に表示される文言<br />(元の記事に戻ってくる時間の間のみ表示)</th>
723
  <td><input type="text" name="tsa_error_message" size="80"
724
  value="<?php echo get_option( 'tsa_error_message', $default_error_msg );?>" /><br />(初期設定:<?php echo $default_error_msg; ?>)</td>
725
  </tr>
726
  </table>
727
+ <a href="#option_setting" class="alignright">▲ 上へ</a>
728
+ <h3 id="url_opt">URL文字列除外 設定</h3>
729
  <table class="form-table">
730
  <tr valign="top">
731
  <th scope="row">URLらしき文字列が混入している場合エラーとするか</th>
754
  (初期設定:<?php echo $default_url_count_over_error_msg;?>)</td>
755
  </tr>
756
  </table>
757
+ <a href="#option_setting" class="alignright">▲ 上へ</a>
758
+
759
+ <h3 id="keyword_opt">NGキーワード / 必須キーワード 制御設定</h3>
760
  <table class="form-table">
761
  <tr valign="top">
762
  <th scope="row">その他NGキーワード<br />(日本語でも英語(その他)でもNGとしたいキーワードを半角カンマ区切りで複数設定できます。<br />挙動は同じです。NGキーワードだけでも使用できます。)
785
  (初期設定:<?php echo $default_must_key_error_msg;?>)</td>
786
  </tr>
787
  </table>
788
+ <a href="#option_setting" class="alignright">▲ 上へ</a>
789
+
790
+ <h3 id="tb_opt">トラックバックへの対応設定</h3>
791
  <table class="form-table">
792
  <tr valign="top">
793
  <th scope="row">上記設定をトラックバック記事にも採用する</th>
823
  </td>
824
  </tr>
825
  </table>
826
+ <a href="#option_setting" class="alignright">▲ 上へ</a>
827
+
828
+ <h3 id="ip_opt">投稿IPアドレスによる制御設定</h3>
829
  <table class="form-table">
830
  <tr valign="top">
831
  <th scope="row">SPAMブラックリスト利用</th>
888
  size="80"
889
  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>
890
  </tr>
891
+ </table>
892
+ <p>※上記のスパムチェックから除外するIPアドレスがあれば下記に設定してください。優先的に通過させます。<br />※トラックバックは優先通過ではありません。</p>
893
+ <table class="form-table">
894
  <tr style="background-color: #fefefe;" valign="top">
895
  <th scope="row"><strong>IP制御免除<br />ホワイトリスト</strong></th>
896
  <td>
901
  </tr>
902
 
903
  </table>
904
+ <a href="#option_setting" class="alignright">▲ 上へ</a>
905
+
906
+ <h3 id="memo_opt">メモ(スパム対策情報や IPアドレス・NGワードその他メモ備忘録としてご自由にお使い下さい)</h3>
907
  <p>この欄の内容が表示されることはありません。</p>
908
  <table class="form-table">
909
  <tr valign="top">
913
  </td>
914
  </tr>
915
  </table>
916
+ <a href="#option_setting" class="alignright">▲ 上へ</a>
917
+
918
+ <h3 id="spam_data_opt">スパムデータベース</h3>
919
  <table class="form-table">
920
  <tr valign="top">
921
  <th scope="row">スパムコメント投稿情報を保存しますか?</th>
947
  ※一度消したデータは復活出来ませんのでご注意ください。また最低7日分は保存されます。
948
  </td>
949
  </tr>
950
+ </table>
951
+ <p>一定時間内スパム認定機能<br />○分以内に○回スパムとなったら○分間、当該IPからのコメントはスパム扱いする設定<br />
952
+ <b>※一定時間以内にスパム投稿された回数を測定していますので「スパムコメント情報を保存する」機能がオフの場合は機能しません。</b></p>
953
+ <table class="form-table">
 
954
  <tr>
955
  <th scope="row">機能設定</th>
956
  <td><?php
974
  </td>
975
  </tr>
976
  </table>
977
+ <a href="#option_setting" class="alignright">▲ 上へ</a>
978
 
979
  <input type="hidden" name="action" value="update" /> <input
980
  type="hidden" name="page_options"
1046
  return NULL;
1047
  }
1048
  // 最終コメント情報取得
1049
+ /** $results = $wpdb->get_results(
1050
+ "SELECT D.cnt as cnt,E.ip_address as ip_address, D.ppd as post_date, E.error_type as error_type, E.author as author, E.comment as comment FROM
1051
+ ((select count(ip_address) as cnt, ip_address, max(post_date) as ppd, error_type, author, comment from $this->table_name
1052
+ WHERE post_date >= '". gmdate( 'Y-m-d', current_time( 'timestamp' ) - 86400 * $gdays )."'
1053
+ GROUP BY ip_address) as D INNER JOIN $this->table_name as E ON D.ip_address = E.ip_address AND D.ppd = E.post_date)
1054
+ ORDER BY post_date DESC"
1055
+ );
1056
+ */
1057
+ $qry_str = "SELECT A.post_date, A.post_id, B.error_type, B.author as spam_author, B.comment as spam_comment FROM $this->table_name as A
1058
+ INNER JOIN $this->table_name as B ON A.ip_address = B.ip_address AND A.post_date = B.post_date
1059
+ WHERE A.ip_address = '".htmlspecialchars( $ip_address )."' ORDER BY A.post_date DESC LIMIT 1 ";
1060
  $results = $wpdb->get_results( $qry_str );
1061
  if ( count( $results ) > 0 ) {
1062
  return $results[0];
1116
  }
1117
 
1118
  // ブラックIPリスト もう一度取得
1119
+ // $block_ip_addresses_str = get_option( 'tsa_block_ip_addresses', '' );
1120
+ // $block_ip_addresses = str_replace( "\n", ',', $block_ip_addresses_str );
1121
+ // $ip_list = mb_split( ",", $block_ip_addresses );
1122
 
1123
  if ( $_GET['settings-updated'] == 'true' ) {
1124
  $_saved = TRUE;
1232
  $p_url = WP_PLUGIN_URL.'/'.str_replace( basename( __FILE__ ), '', plugin_basename( __FILE__ ) );
1233
  wp_enqueue_script( 'jquery.tablesorter', $p_url.'js/jquery.tablesorter.min.js', array( 'jquery' ), FALSE );
1234
  wp_enqueue_style( 'jquery.tablesorter', $p_url.'images/style.css' );
1235
+ wp_enqueue_style( 'thorows-spam-away-styles', $p_url.'css/tsa_data_styles.css' );
 
1236
  ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1237
  <script type="text/JavaScript">
1238
  <!--
1239
  jQuery(function() {
1246
  3: { sorter: false }
1247
  }
1248
  });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1249
  });
1250
 
1251
  function removeIpAddressOnData(ipAddressStr) {
1267
  }
1268
  -->
1269
  </script>
1270
+ <p><strong>投稿内容の判定</strong></p>
1271
+ ※最新1件のコメント内容はIPアドレスまたはエラー判定のリンク先を参照してください。
1272
  <div id="spam_list_container">
1273
  <div id="spam_list_div">
1274
  <table id="spam_list" class="tablesorter">
1283
  <th class="cols1">投稿数</th>
1284
  <th class="cols2">最終投稿日時</th>
1285
  <th class="cols3">スパムIP登録</th>
1286
+ <th class="cols4">エラー判定(最新)</th>
1287
  </tr>
1288
  </thead>
1289
  <tbody>
1311
  case 'block_ip':
1312
  $spam_error_type_str = 'ブロック対象IPアドレス';
1313
  break;
1314
+ case 'spam_champuru':
1315
+ $spam_error_type_str = 'すぱむちゃんぷるー';
1316
+ break;
1317
  case 'spam_trackback':
1318
  $spam_error_type_str = 'トラックバックスパム';
1319
  break;
1331
  <tr>
1332
  <td>
1333
  <b><a href="javascript:void(0);"
1334
+ onclick="window.open('<?php echo esc_attr( $p_url ); ?>hostbyip.php?ip=<?php esc_attr_e( $spam_ip ); ?>', 'hostbyip', 'width=350,height=500,scrollbars=no,location=no,menubar=no,toolbar=no,directories=no,status=no');"><?php esc_attr_e( $spam_ip ); ?>
1335
  </a></b><br clear="all" />
1336
  <input type="button"
1337
  onclick="javascript:removeIpAddressOnData('<?php esc_attr_e( $spam_ip ); ?>');"
1340
  <td><?php esc_attr_e( $spam_cnt ); ?>回</td>
1341
  <td><?php esc_attr_e( $last_post_date ); ?></td>
1342
  <td>
1343
+ <?php // if ( ! in_array( $spam_ip, $ip_list ) ) { ?>
1344
  <input type="button"
1345
  onclick="javascript:addIpAddressOnData('<?php esc_attr_e( $spam_ip ); ?>');"
1346
  value="ブロック対象IPアドレス追加[<?php esc_attr_e( $spam_ip ); ?>]" />
1347
+ <?php /*} else { ?>
1348
  ブロック対象IP
1349
+ <?php } */ ?>
1350
  </td>
1351
+ <td>
1352
+ <a href="javascript:void(0);"
1353
+ onclick="window.open('<?php echo esc_attr( $p_url ); ?>hostbyip.php?ip=<?php esc_attr_e( $spam_ip ); ?>', 'hostbyip', 'width=350,height=500,scrollbars=no,location=no,menubar=no,toolbar=no,directories=no,status=no');"><?php esc_attr_e( $spam_error_type_str ); ?>
1354
+ </a>
1355
  </td>
1356
  </tr>
1357
  <?php
throws_spam_away.php CHANGED
@@ -4,9 +4,25 @@
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';
11
 
12
  /**
@@ -15,7 +31,7 @@ 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
 
4
  Plugin URI: http://gti.jp/tsa/
5
  Description: コメント内に日本語の記述が存在しない場合はあたかも受け付けたように振る舞いながらも捨ててしまうプラグイン
6
  Author: 株式会社ジーティーアイ さとう たけし
7
+ Version: 2.6.3
8
  Author URI: http://gti.jp/
9
+ License: GPL2
10
  */
11
+ /* Copyright 2014 Takeshi Satoh (http://gti.jp/)
12
+
13
+ This program is free software; you can redistribute it and/or modify
14
+ it under the terms of the GNU General Public License, version 2, as
15
+ published by the Free Software Foundation.
16
+
17
+ This program is distributed in the hope that it will be useful,
18
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20
+ GNU General Public License for more details.
21
+
22
+ You should have received a copy of the GNU General Public License
23
+ along with this program; if not, write to the Free Software
24
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25
+ */
26
  require_once 'throws_spam_away.class.php';
27
 
28
  /**
31
  */
32
 
33
  // Throws SPAM Awayバージョン
34
+ $tsa_version = '2.6.3';
35
  // スパムデータベースバージョン
36
  $tsa_db_version = 2.6; // 2.6からデータベース変更 [error_type]追加
37
 
trunk/css/tsa_data_styles.css ADDED
@@ -0,0 +1,141 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @CHARSET "UTF-8";
2
+ /** Throws SPAM Away */
3
+ /** 変更ボタン */
4
+ p.submit .button-primary {
5
+ width: 200px;
6
+ height: 30px;
7
+ margin: 20px auto 50px 20px;
8
+ }
9
+ /** ------ lightbox風 ----- */
10
+ #kotak-dialog {
11
+ position:absolute;
12
+ top:20%;
13
+ left:50%;
14
+ margin:0px 0px 0px -200px;
15
+ width:400px;
16
+ height:auto;
17
+ background-color:#fff;
18
+ -webkit-box-shadow:0px 1px 2px rgba(0,0,0,0.4);
19
+ -moz-box-shadow:0px 1px 2px rgba(0,0,0,0.4);
20
+ box-shadow:0px 1px 2px rgba(0,0,0,0.4);
21
+ z-index:1000;
22
+ display:none;
23
+ }
24
+
25
+ #kotak-dialog *:focus {
26
+ outline:none;
27
+ }
28
+
29
+ #kotak-dialog h3.title {
30
+ background-color:#3B5998;
31
+ padding:10px 15px;
32
+ color:#fff;
33
+ font:normal 16px Arial,Sans-Serif;
34
+ margin:0px 0px 0px 0px;
35
+ position:relative;
36
+ }
37
+
38
+ #kotak-dialog h3.title a {
39
+ position:absolute;
40
+ top:10px;
41
+ right:15px;
42
+ color:#fff;
43
+ text-decoration:none;
44
+ cursor:pointer;
45
+ }
46
+
47
+ #kotak-dialog .isi-dialog {
48
+ margin:15px;
49
+ font:normal 12px Arial,Sans-Serif;
50
+ }
51
+
52
+ #kotak-dialog .button-wrapper {
53
+ padding:10px 15px 0px;
54
+ border-top:1px solid #ddd;
55
+ margin-top:15px;
56
+ }
57
+
58
+ #kotak-dialog .button-wrapper button {
59
+ background-color:#FF0C39;
60
+ border:none;
61
+ font:bold 12px Arial,Sans-Serif;
62
+ color:#fff;
63
+ padding:5px 10px;
64
+ -webkit-border-radius:3px;
65
+ -moz-border-radius:3px;
66
+ border-radius:3px;
67
+ cursor:pointer;
68
+ }
69
+
70
+ #kotak-dialog .button-wrapper button:hover {
71
+ background-color:#aaa;
72
+ }
73
+
74
+ #dialog-overlay {
75
+ position:fixed !important;
76
+ position:absolute;
77
+ z-index:999;
78
+ top:0px;
79
+ right:0px;
80
+ bottom:0px;
81
+ left:0px;
82
+ background-color:#000;
83
+ display:none;
84
+ }
85
+
86
+
87
+ /* Iframe */
88
+ #iframeContainer iframe {
89
+ width:100%;
90
+ height:300px;
91
+ border:none;
92
+ background-color:#ccc;
93
+ overflow:auto;
94
+ }
95
+
96
+ /** スクロール対象テーブルCSS */
97
+ #spam_list {
98
+ background-color: #ffffff;
99
+ border-collapse:;
100
+ font-size: 1em !important;
101
+ }
102
+ /** 全体container */
103
+ #spam_list_container {
104
+ position: relative;
105
+ padding-top: 26px;
106
+ width: 928px; /* 列幅合計+セル間の幅(2px)の合計+20px */
107
+ border: 1px solid #3377b6;
108
+ background-color: #ffffff;
109
+ }
110
+ /** tbody スクロール対象 */
111
+ #spam_list_div {
112
+ overflow: auto;
113
+ height: 600px;
114
+ }
115
+
116
+ #spam_list thead tr {
117
+ position: absolute;
118
+ top: 0;
119
+ left: 0;
120
+ background-color: #ffffff;
121
+ }
122
+ #spam_list thead tr th {
123
+ background-color: #3377b6;
124
+ color: #fff;
125
+ padding: 3px 0px;
126
+ }
127
+ #spam_list tbody tr td {
128
+ background-color: #efefef;
129
+ color: black;
130
+ padding: 3px 6px;
131
+ }
132
+ #spam_list tbody tr.odd td {
133
+ background-color:#F0F0F6;
134
+ }
135
+
136
+ .cols0 { width: 200px; }
137
+ .cols1 { width: 50px; }
138
+ .cols2 { width: 130px; }
139
+ .cols3 { width: 300px; }
140
+ .cols4 { width: 220px; }
141
+
trunk/css/tsa_styles.css ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @CHARSET "UTF-8";
2
+ /**
3
+ Throws SPAM Away
4
+ Option page
5
+ */
6
+
7
+ h2 {
8
+ padding: 10px !important;
9
+ }
10
+
11
+ .wrap h3 {
12
+ background: #fff;
13
+ border-left: 3px solid orange ;
14
+ margin: 0 0 15px 15px;
15
+ padding: 5px 10px;
16
+ }
17
+
18
+ .wrap p {
19
+ margin: 0 0 15px 15px;
20
+ padding: 5px 10px;
21
+ }
22
+
23
+ .wrap table.form-table {
24
+ margin: 0 0 15px 15px;
25
+ padding: 5px 10px;
26
+ border-collapse: separate;
27
+ border-spacing: 5px;
28
+ }
29
+
30
+ .wrap table.form-table tbody tr th {
31
+ background: #fff;
32
+ width: 250px;
33
+ margin: 0 0 15px 15px;
34
+ padding: 5px 10px;
35
+ border: solid 1px #ddd;
36
+ border-radius: 3px;
37
+ box-shadow: 0 1px 3px rgba( 0, 0, 0, 0.1 );
38
+ overflow: hidden;
39
+ }
40
+
trunk/hostbyip.php ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * <p>ThrowsSpamAway</p> hostbyipページ
4
+ * WordPress's Plugin
5
+ * @author Takeshi Satoh@GTI Inc. 2013
6
+ * @version 2.6.3 2014/06/06
7
+ */
8
+ require_once 'throws_spam_away.class.php';
9
+ require_once dirname( __FILE__ ).'/../../../wp-load.php';
10
+ /**
11
+ * ホスト検索
12
+ */
13
+ $spam_ip = htmlspecialchars($_GET['ip']);
14
+ $newThrowsSpamAway = new ThrowsSpamAway(TRUE);
15
+ $last_spam_comment_result = $newThrowsSpamAway->get_last_spam_comment($spam_ip);
16
+ // 最終投稿日
17
+ $last_comment_date = $last_spam_comment_result->post_date;
18
+ $last_comment_post = get_permalink($last_spam_comment_result->post_id);
19
+ $last_comment_post_title = get_the_title(get_post($last_spam_comment_result->post_id));
20
+ $is_spam_champuru = ( $newThrowsSpamAway->reject_spam_ip( $spam_ip ) ? FALSE : TRUE );
21
+ $spam_author = $last_spam_comment_result->spam_author;
22
+ $spam_comment = esc_attr($last_spam_comment_result->spam_comment);
23
+ ?><!DOCTYPE html>
24
+ <!--[if IE 8]>
25
+ <html xmlns="http://www.w3.org/1999/xhtml" class="ie8 wp-toolbar" lang="ja" prefix="og: http://ogp.me/ns#" >
26
+ <![endif]-->
27
+ <!--[if !(IE 8) ]><!-->
28
+ <html xmlns="http://www.w3.org/1999/xhtml" class="wp-toolbar" lang="ja" >
29
+ <!--<![endif]-->
30
+ <head>
31
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
32
+ <title>Throws SPAM Away | Hostbyip[<?php echo htmlspecialchars($_GET['ip']); ?>]</title>
33
+ <script type="text/javascript">
34
+ window.onblur=function(){
35
+ window.close();
36
+ }
37
+ </script>
38
+ </head>
39
+ <body>
40
+ <div style="textalign: center;">
41
+ <h2 style="background:#333; color:#fff;"><?php echo $spam_ip; ?></h2>
42
+ <?php
43
+ $spam_host = gethostbyaddr(htmlspecialchars($spam_ip));
44
+ if ($spam_host != $spam_ip) {
45
+ ?>
46
+ <h3 style="background: #666;color: #fff;">特定のホスト情報が見つかりました。</h3>
47
+ ↓↓↓<br />
48
+
49
+ <h4><?php echo $spam_host; ?></h4>
50
+ Whois: <a href="http://whois.arin.net/rest/ip/<?php echo $spam_ip; ?>" target="_blank"><?php echo $spam_ip; ?></a>
51
+ <?php
52
+ } else {
53
+ ?>
54
+ <h3 style="background: #666;color: #fff;">このIPアドレスから特定のホスト情報は見つかりませんでした。</h3>
55
+ <?php
56
+ }
57
+ ?>
58
+ <?php if ( $last_spam_comment_result != NULL ) { ?>
59
+ <div style="background: #999;color: #fff;margin:3px 0 0 0;">このIPからの最終投稿日時</div><?php echo $last_comment_date; ?><br />
60
+ <div style="background: #999;color: #fff;margin:3px 0 0 0;">このIPからスパム投稿対象となったページ</div><a href="<?php echo $last_comment_post; ?>" target="_blank"><?php echo $last_comment_post_title; ?></a><br />
61
+ <?php } ?>
62
+ <h4>スパムフィルター:<?php echo ($is_spam_champuru ? "スパムちゃんぷるー存在IPアドレス" : "未検出" ); ?></h4>
63
+
64
+ <div style="background: #999;color: #fff;margin:3px 0 0 0;">最新コメント内容</div>
65
+ <div ><?php if ( $spam_author != NULL && $spam_comment != NULL ) {
66
+ ?>
67
+ IP: <?php esc_attr_e( $spam_ip ); ?><br />
68
+ 名前:<?php echo esc_attr( $spam_author ); ?><br />
69
+ 内容:<?php esc_attr_e( $spam_comment ); ?><?php
70
+ } ?>
71
+ </div>
72
+
73
+ <div style="text-align:right;"><a href="javascript:void(0);" onclick="window.close();">閉じる</a></div>
74
+ </div>
75
+ </body>
76
+ </html>
trunk/images/asc.gif ADDED
Binary file
trunk/images/bg.gif ADDED
Binary file
trunk/images/desc.gif ADDED
Binary file
trunk/images/style.css ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ table.tablesorter thead tr .header {
2
+ background-image: url(bg.gif);
3
+ background-repeat: no-repeat;
4
+ background-position: center right;
5
+ cursor: pointer;
6
+ }
7
+ table.tablesorter thead tr .headerSortUp {
8
+ background-image: url(asc.gif);
9
+ }
10
+ table.tablesorter thead tr .headerSortDown {
11
+ background-image: url(desc.gif);
12
+ }
13
+ table.tablesorter thead tr .headerSortDown, table.tablesorter thead tr .headerSortUp {
14
+ background-color: #8dbdd8;
15
+ }
trunk/js/jquery.tablesorter.min.js ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+
2
+ (function($){$.extend({tablesorter:new
3
+ function(){var parsers=[],widgets=[];this.defaults={cssHeader:"header",cssAsc:"headerSortUp",cssDesc:"headerSortDown",cssChildRow:"expand-child",sortInitialOrder:"asc",sortMultiSortKey:"shiftKey",sortForce:null,sortAppend:null,sortLocaleCompare:true,textExtraction:"simple",parsers:{},widgets:[],widgetZebra:{css:["even","odd"]},headers:{},widthFixed:false,cancelSelection:true,sortList:[],headerList:[],dateFormat:"us",decimal:'/\.|\,/g',onRenderHeader:null,selectorHeaders:'thead th',debug:false};function benchmark(s,d){log(s+","+(new Date().getTime()-d.getTime())+"ms");}this.benchmark=benchmark;function log(s){if(typeof console!="undefined"&&typeof console.debug!="undefined"){console.log(s);}else{alert(s);}}function buildParserCache(table,$headers){if(table.config.debug){var parsersDebug="";}if(table.tBodies.length==0)return;var rows=table.tBodies[0].rows;if(rows[0]){var list=[],cells=rows[0].cells,l=cells.length;for(var i=0;i<l;i++){var p=false;if($.metadata&&($($headers[i]).metadata()&&$($headers[i]).metadata().sorter)){p=getParserById($($headers[i]).metadata().sorter);}else if((table.config.headers[i]&&table.config.headers[i].sorter)){p=getParserById(table.config.headers[i].sorter);}if(!p){p=detectParserForColumn(table,rows,-1,i);}if(table.config.debug){parsersDebug+="column:"+i+" parser:"+p.id+"\n";}list.push(p);}}if(table.config.debug){log(parsersDebug);}return list;};function detectParserForColumn(table,rows,rowIndex,cellIndex){var l=parsers.length,node=false,nodeValue=false,keepLooking=true;while(nodeValue==''&&keepLooking){rowIndex++;if(rows[rowIndex]){node=getNodeFromRowAndCellIndex(rows,rowIndex,cellIndex);nodeValue=trimAndGetNodeText(table.config,node);if(table.config.debug){log('Checking if value was empty on row:'+rowIndex);}}else{keepLooking=false;}}for(var i=1;i<l;i++){if(parsers[i].is(nodeValue,table,node)){return parsers[i];}}return parsers[0];}function getNodeFromRowAndCellIndex(rows,rowIndex,cellIndex){return rows[rowIndex].cells[cellIndex];}function trimAndGetNodeText(config,node){return $.trim(getElementText(config,node));}function getParserById(name){var l=parsers.length;for(var i=0;i<l;i++){if(parsers[i].id.toLowerCase()==name.toLowerCase()){return parsers[i];}}return false;}function buildCache(table){if(table.config.debug){var cacheTime=new Date();}var totalRows=(table.tBodies[0]&&table.tBodies[0].rows.length)||0,totalCells=(table.tBodies[0].rows[0]&&table.tBodies[0].rows[0].cells.length)||0,parsers=table.config.parsers,cache={row:[],normalized:[]};for(var i=0;i<totalRows;++i){var c=$(table.tBodies[0].rows[i]),cols=[];if(c.hasClass(table.config.cssChildRow)){cache.row[cache.row.length-1]=cache.row[cache.row.length-1].add(c);continue;}cache.row.push(c);for(var j=0;j<totalCells;++j){cols.push(parsers[j].format(getElementText(table.config,c[0].cells[j]),table,c[0].cells[j]));}cols.push(cache.normalized.length);cache.normalized.push(cols);cols=null;};if(table.config.debug){benchmark("Building cache for "+totalRows+" rows:",cacheTime);}return cache;};function getElementText(config,node){var text="";if(!node)return"";if(!config.supportsTextContent)config.supportsTextContent=node.textContent||false;if(config.textExtraction=="simple"){if(config.supportsTextContent){text=node.textContent;}else{if(node.childNodes[0]&&node.childNodes[0].hasChildNodes()){text=node.childNodes[0].innerHTML;}else{text=node.innerHTML;}}}else{if(typeof(config.textExtraction)=="function"){text=config.textExtraction(node);}else{text=$(node).text();}}return text;}function appendToTable(table,cache){if(table.config.debug){var appendTime=new Date()}var c=cache,r=c.row,n=c.normalized,totalRows=n.length,checkCell=(n[0].length-1),tableBody=$(table.tBodies[0]),rows=[];for(var i=0;i<totalRows;i++){var pos=n[i][checkCell];rows.push(r[pos]);if(!table.config.appender){var l=r[pos].length;for(var j=0;j<l;j++){tableBody[0].appendChild(r[pos][j]);}}}if(table.config.appender){table.config.appender(table,rows);}rows=null;if(table.config.debug){benchmark("Rebuilt table:",appendTime);}applyWidget(table);setTimeout(function(){$(table).trigger("sortEnd");},0);};function buildHeaders(table){if(table.config.debug){var time=new Date();}var meta=($.metadata)?true:false;var header_index=computeTableHeaderCellIndexes(table);$tableHeaders=$(table.config.selectorHeaders,table).each(function(index){this.column=header_index[this.parentNode.rowIndex+"-"+this.cellIndex];this.order=formatSortingOrder(table.config.sortInitialOrder);this.count=this.order;if(checkHeaderMetadata(this)||checkHeaderOptions(table,index))this.sortDisabled=true;if(checkHeaderOptionsSortingLocked(table,index))this.order=this.lockedOrder=checkHeaderOptionsSortingLocked(table,index);if(!this.sortDisabled){var $th=$(this).addClass(table.config.cssHeader);if(table.config.onRenderHeader)table.config.onRenderHeader.apply($th);}table.config.headerList[index]=this;});if(table.config.debug){benchmark("Built headers:",time);log($tableHeaders);}return $tableHeaders;};function computeTableHeaderCellIndexes(t){var matrix=[];var lookup={};var thead=t.getElementsByTagName('THEAD')[0];var trs=thead.getElementsByTagName('TR');for(var i=0;i<trs.length;i++){var cells=trs[i].cells;for(var j=0;j<cells.length;j++){var c=cells[j];var rowIndex=c.parentNode.rowIndex;var cellId=rowIndex+"-"+c.cellIndex;var rowSpan=c.rowSpan||1;var colSpan=c.colSpan||1
4
+ var firstAvailCol;if(typeof(matrix[rowIndex])=="undefined"){matrix[rowIndex]=[];}for(var k=0;k<matrix[rowIndex].length+1;k++){if(typeof(matrix[rowIndex][k])=="undefined"){firstAvailCol=k;break;}}lookup[cellId]=firstAvailCol;for(var k=rowIndex;k<rowIndex+rowSpan;k++){if(typeof(matrix[k])=="undefined"){matrix[k]=[];}var matrixrow=matrix[k];for(var l=firstAvailCol;l<firstAvailCol+colSpan;l++){matrixrow[l]="x";}}}}return lookup;}function checkCellColSpan(table,rows,row){var arr=[],r=table.tHead.rows,c=r[row].cells;for(var i=0;i<c.length;i++){var cell=c[i];if(cell.colSpan>1){arr=arr.concat(checkCellColSpan(table,headerArr,row++));}else{if(table.tHead.length==1||(cell.rowSpan>1||!r[row+1])){arr.push(cell);}}}return arr;};function checkHeaderMetadata(cell){if(($.metadata)&&($(cell).metadata().sorter===false)){return true;};return false;}function checkHeaderOptions(table,i){if((table.config.headers[i])&&(table.config.headers[i].sorter===false)){return true;};return false;}function checkHeaderOptionsSortingLocked(table,i){if((table.config.headers[i])&&(table.config.headers[i].lockedOrder))return table.config.headers[i].lockedOrder;return false;}function applyWidget(table){var c=table.config.widgets;var l=c.length;for(var i=0;i<l;i++){getWidgetById(c[i]).format(table);}}function getWidgetById(name){var l=widgets.length;for(var i=0;i<l;i++){if(widgets[i].id.toLowerCase()==name.toLowerCase()){return widgets[i];}}};function formatSortingOrder(v){if(typeof(v)!="Number"){return(v.toLowerCase()=="desc")?1:0;}else{return(v==1)?1:0;}}function isValueInArray(v,a){var l=a.length;for(var i=0;i<l;i++){if(a[i][0]==v){return true;}}return false;}function setHeadersCss(table,$headers,list,css){$headers.removeClass(css[0]).removeClass(css[1]);var h=[];$headers.each(function(offset){if(!this.sortDisabled){h[this.column]=$(this);}});var l=list.length;for(var i=0;i<l;i++){h[list[i][0]].addClass(css[list[i][1]]);}}function fixColumnWidth(table,$headers){var c=table.config;if(c.widthFixed){var colgroup=$('<colgroup>');$("tr:first td",table.tBodies[0]).each(function(){colgroup.append($('<col>').css('width',$(this).width()));});$(table).prepend(colgroup);};}function updateHeaderSortCount(table,sortList){var c=table.config,l=sortList.length;for(var i=0;i<l;i++){var s=sortList[i],o=c.headerList[s[0]];o.count=s[1];o.count++;}}function multisort(table,sortList,cache){if(table.config.debug){var sortTime=new Date();}var dynamicExp="var sortWrapper = function(a,b) {",l=sortList.length;for(var i=0;i<l;i++){var c=sortList[i][0];var order=sortList[i][1];var s=(table.config.parsers[c].type=="text")?((order==0)?makeSortFunction("text","asc",c):makeSortFunction("text","desc",c)):((order==0)?makeSortFunction("numeric","asc",c):makeSortFunction("numeric","desc",c));var e="e"+i;dynamicExp+="var "+e+" = "+s;dynamicExp+="if("+e+") { return "+e+"; } ";dynamicExp+="else { ";}var orgOrderCol=cache.normalized[0].length-1;dynamicExp+="return a["+orgOrderCol+"]-b["+orgOrderCol+"];";for(var i=0;i<l;i++){dynamicExp+="}; ";}dynamicExp+="return 0; ";dynamicExp+="}; ";if(table.config.debug){benchmark("Evaling expression:"+dynamicExp,new Date());}eval(dynamicExp);cache.normalized.sort(sortWrapper);if(table.config.debug){benchmark("Sorting on "+sortList.toString()+" and dir "+order+" time:",sortTime);}return cache;};function makeSortFunction(type,direction,index){var a="a["+index+"]",b="b["+index+"]";if(type=='text'&&direction=='asc'){return"("+a+" == "+b+" ? 0 : ("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : ("+a+" < "+b+") ? -1 : 1 )));";}else if(type=='text'&&direction=='desc'){return"("+a+" == "+b+" ? 0 : ("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : ("+b+" < "+a+") ? -1 : 1 )));";}else if(type=='numeric'&&direction=='asc'){return"("+a+" === null && "+b+" === null) ? 0 :("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : "+a+" - "+b+"));";}else if(type=='numeric'&&direction=='desc'){return"("+a+" === null && "+b+" === null) ? 0 :("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : "+b+" - "+a+"));";}};function makeSortText(i){return"((a["+i+"] < b["+i+"]) ? -1 : ((a["+i+"] > b["+i+"]) ? 1 : 0));";};function makeSortTextDesc(i){return"((b["+i+"] < a["+i+"]) ? -1 : ((b["+i+"] > a["+i+"]) ? 1 : 0));";};function makeSortNumeric(i){return"a["+i+"]-b["+i+"];";};function makeSortNumericDesc(i){return"b["+i+"]-a["+i+"];";};function sortText(a,b){if(table.config.sortLocaleCompare)return a.localeCompare(b);return((a<b)?-1:((a>b)?1:0));};function sortTextDesc(a,b){if(table.config.sortLocaleCompare)return b.localeCompare(a);return((b<a)?-1:((b>a)?1:0));};function sortNumeric(a,b){return a-b;};function sortNumericDesc(a,b){return b-a;};function getCachedSortType(parsers,i){return parsers[i].type;};this.construct=function(settings){return this.each(function(){if(!this.tHead||!this.tBodies)return;var $this,$document,$headers,cache,config,shiftDown=0,sortOrder;this.config={};config=$.extend(this.config,$.tablesorter.defaults,settings);$this=$(this);$.data(this,"tablesorter",config);$headers=buildHeaders(this);this.config.parsers=buildParserCache(this,$headers);cache=buildCache(this);var sortCSS=[config.cssDesc,config.cssAsc];fixColumnWidth(this);$headers.click(function(e){var totalRows=($this[0].tBodies[0]&&$this[0].tBodies[0].rows.length)||0;if(!this.sortDisabled&&totalRows>0){$this.trigger("sortStart");var $cell=$(this);var i=this.column;this.order=this.count++%2;if(this.lockedOrder)this.order=this.lockedOrder;if(!e[config.sortMultiSortKey]){config.sortList=[];if(config.sortForce!=null){var a=config.sortForce;for(var j=0;j<a.length;j++){if(a[j][0]!=i){config.sortList.push(a[j]);}}}config.sortList.push([i,this.order]);}else{if(isValueInArray(i,config.sortList)){for(var j=0;j<config.sortList.length;j++){var s=config.sortList[j],o=config.headerList[s[0]];if(s[0]==i){o.count=s[1];o.count++;s[1]=o.count%2;}}}else{config.sortList.push([i,this.order]);}};setTimeout(function(){setHeadersCss($this[0],$headers,config.sortList,sortCSS);appendToTable($this[0],multisort($this[0],config.sortList,cache));},1);return false;}}).mousedown(function(){if(config.cancelSelection){this.onselectstart=function(){return false};return false;}});$this.bind("update",function(){var me=this;setTimeout(function(){me.config.parsers=buildParserCache(me,$headers);cache=buildCache(me);},1);}).bind("updateCell",function(e,cell){var config=this.config;var pos=[(cell.parentNode.rowIndex-1),cell.cellIndex];cache.normalized[pos[0]][pos[1]]=config.parsers[pos[1]].format(getElementText(config,cell),cell);}).bind("sorton",function(e,list){$(this).trigger("sortStart");config.sortList=list;var sortList=config.sortList;updateHeaderSortCount(this,sortList);setHeadersCss(this,$headers,sortList,sortCSS);appendToTable(this,multisort(this,sortList,cache));}).bind("appendCache",function(){appendToTable(this,cache);}).bind("applyWidgetId",function(e,id){getWidgetById(id).format(this);}).bind("applyWidgets",function(){applyWidget(this);});if($.metadata&&($(this).metadata()&&$(this).metadata().sortlist)){config.sortList=$(this).metadata().sortlist;}if(config.sortList.length>0){$this.trigger("sorton",[config.sortList]);}applyWidget(this);});};this.addParser=function(parser){var l=parsers.length,a=true;for(var i=0;i<l;i++){if(parsers[i].id.toLowerCase()==parser.id.toLowerCase()){a=false;}}if(a){parsers.push(parser);};};this.addWidget=function(widget){widgets.push(widget);};this.formatFloat=function(s){var i=parseFloat(s);return(isNaN(i))?0:i;};this.formatInt=function(s){var i=parseInt(s);return(isNaN(i))?0:i;};this.isDigit=function(s,config){return/^[-+]?\d*$/.test($.trim(s.replace(/[,.']/g,'')));};this.clearTableBody=function(table){if($.browser.msie){function empty(){while(this.firstChild)this.removeChild(this.firstChild);}empty.apply(table.tBodies[0]);}else{table.tBodies[0].innerHTML="";}};}});$.fn.extend({tablesorter:$.tablesorter.construct});var ts=$.tablesorter;ts.addParser({id:"text",is:function(s){return true;},format:function(s){return $.trim(s.toLocaleLowerCase());},type:"text"});ts.addParser({id:"digit",is:function(s,table){var c=table.config;return $.tablesorter.isDigit(s,c);},format:function(s){return $.tablesorter.formatFloat(s);},type:"numeric"});ts.addParser({id:"currency",is:function(s){return/^[£$€?.]/.test(s);},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/[£$€]/g),""));},type:"numeric"});ts.addParser({id:"ipAddress",is:function(s){return/^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/.test(s);},format:function(s){var a=s.split("."),r="",l=a.length;for(var i=0;i<l;i++){var item=a[i];if(item.length==2){r+="0"+item;}else{r+=item;}}return $.tablesorter.formatFloat(r);},type:"numeric"});ts.addParser({id:"url",is:function(s){return/^(https?|ftp|file):\/\/$/.test(s);},format:function(s){return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\/\//),''));},type:"text"});ts.addParser({id:"isoDate",is:function(s){return/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(s);},format:function(s){return $.tablesorter.formatFloat((s!="")?new Date(s.replace(new RegExp(/-/g),"/")).getTime():"0");},type:"numeric"});ts.addParser({id:"percent",is:function(s){return/\%$/.test($.trim(s));},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/%/g),""));},type:"numeric"});ts.addParser({id:"usLongDate",is:function(s){return s.match(new RegExp(/^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/));},format:function(s){return $.tablesorter.formatFloat(new Date(s).getTime());},type:"numeric"});ts.addParser({id:"shortDate",is:function(s){return/\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}/.test(s);},format:function(s,table){var c=table.config;s=s.replace(/\-/g,"/");if(c.dateFormat=="us"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,"$3/$1/$2");}else if(c.dateFormat=="uk"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,"$3/$2/$1");}else if(c.dateFormat=="dd/mm/yy"||c.dateFormat=="dd-mm-yy"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{2})/,"$1/$2/$3");}return $.tablesorter.formatFloat(new Date(s).getTime());},type:"numeric"});ts.addParser({id:"time",is:function(s){return/^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/.test(s);},format:function(s){return $.tablesorter.formatFloat(new Date("2000/01/01 "+s).getTime());},type:"numeric"});ts.addParser({id:"metadata",is:function(s){return false;},format:function(s,table,cell){var c=table.config,p=(!c.parserMetadataName)?'sortValue':c.parserMetadataName;return $(cell).metadata()[p];},type:"numeric"});ts.addWidget({id:"zebra",format:function(table){if(table.config.debug){var time=new Date();}var $tr,row=-1,odd;$("tr:visible",table.tBodies[0]).each(function(i){$tr=$(this);if(!$tr.hasClass(table.config.cssChildRow))row++;odd=(row%2==0);$tr.removeClass(table.config.widgetZebra.css[odd?0:1]).addClass(table.config.widgetZebra.css[odd?1:0])});if(table.config.debug){$.tablesorter.benchmark("Applying Zebra widget",time);}}});})(jQuery);
trunk/js/tsa_params.js ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * <p>ThrowsSpamAway</p> JavaScript
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($){
12
+ $('.tsa_param_field_tsa_2').hide(); // hide
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
+ });
trunk/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+'" />')}}});
trunk/readme.txt ADDED
@@ -0,0 +1,399 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ === Plugin Name ===
2
+ Contributors: taman777
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.3
8
+ License: GPLv2 or later
9
+ License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
+
11
+ スパムコメントを無視して何もなかったように捨てる強力スパム対策プラグイン
12
+
13
+ == Description ==
14
+ 海外からのコメントスパムに対抗(?)する手段として開発したプラグインですが
15
+ 現在下記のフィルタでスパム判定しています。
16
+
17
+ ・日本語判定(日本語を含むかどうか)
18
+  コメント欄に日本語文字列が含まれていないと投稿出来ない・・・
19
+  といってもエラーにするのではなく「無視」して何事もなかったようにもとの記事に戻ります。
20
+
21
+  ダブルバイトをカウントするのではなく正規表現により日本語を検出しているため、ダブルバイトの他言語も侵入してきません。
22
+  [設定にてON/OFF出来ます。]
23
+
24
+
25
+ ・NGキーワード判定
26
+  NGキーワードを複数設定することが出来ます。(カンマ区切りにて設定)
27
+  日本語の文章であっても設定された「NGキーワード」を含む投稿の場合は、同様に無視します。
28
+  もちろん他の言語のキーワードでもOKです。
29
+
30
+  日本語が一切入っていないコメントでも「NGキーワード」だけ設定したい場合を想定し
31
+  日本語が入っていないと許可しない設定を「オン・オフ」出来るようになっています。
32
+
33
+ ・リンク含有数判定
34
+  リンクと思わしき'http'を含んだ文字列が許容数(初期設定は3つ)を超えて包含される場合にエラーとします。
35
+
36
+ ・ダミー項目による判定(スパムロボット対策)
37
+  空のダミーフィールドを生成しJavaScriptでの制御を行うことでスパム判定します。(停止も可能です)
38
+  ※スパムプログラムによる投稿に有効です。実際に入力しようとしてもその項目は見えないようになっています。
39
+  [設定にてON/OFF出来ます。]
40
+
41
+ ・IPアドレスによる判定
42
+  指定IPアドレスからの投稿をスパムとして処理します。
43
+  以前スパムとしてチェックした投稿のIPアドレス及び、任意のIPアドレスでの制御も出来るようになっています。
44
+
45
+  【ブラックリスト】
46
+   ブラックリストに登録したIPアドレスからの投稿をスパム処理します。
47
+
48
+  【ホワイトリスト】
49
+   ホワイトリストに登録したIPアドレスからの投稿はすべてのフィルタを通しませんので優先的に通常コメントとしてノーチェックで投稿処理がなされます。
50
+ ※ホワイトリストが一番強力にしてありますので、このIPアドレスがAkismetで捉えられていてもスパムちゃんぷるーでスパム扱いになったとしても優先で通過させます。
51
+
52
+ IPアドレスの指定「ブロックリスト」「ホワイトリスト」共に「改行」区切りで複数入力できますが、「192.168.1.0/24」のようにIPアドレスの範囲指定も可能です。
53
+ ※例:192.168.0.1,192.168.1.0/24,69.208.0.0/16 と指定した場合
54
+  [192.168.0.1]と[192.168.1.0 ~ 192.168.1.255]と[69.208.0.0 ~ 69.208.255.255]のIPアドレスを拒否(または優先通過)対象とします。
55
+
56
+ ・スパムフィルタによる判定
57
+  「スパムちゃんぷるー(ベータ)」http://spam-champuru.livedoor.com/dnsbl/ を利用してスパム判定することも可能です。
58
+  設定にてON/OFF出来ます。
59
+
60
+
61
+ ○スパムデータベースでスパム投稿の増減を確認出来ます。
62
+
63
+ 表示期間を設定出来ますのでお好みの周期を設定してください。
64
+
65
+ また表示期間を過ぎたデータを削除することも可能です。
66
+ ※あまりにも解析処理に時間がかかるようでしたら過去のデータを削除することをお試し下さい。
67
+
68
+ テストなどでスパム投稿したIPアドレスはスパム投稿一覧よりボタンひとつで削除出来ます。
69
+
70
+ ※コメント投稿時のスパムコメント対応の煩わしさが原因で作ったものですのでスパム判定されたコメントを保持しておりません。
71
+
72
+ -- これまでの変更点について
73
+
74
+ ・バージョン2.6.3
75
+  2014/06/06
76
+  スパムデータベースの表示速度を向上するため
77
+  スパムコメントの表示を個別画面へ移動(エラーをクリック)
78
+
79
+  スパムの区別が「すぱむちゃんぷるー」でも「指定IP」でも同一「ブロックIPアドレス」であったが
80
+  「すぱむちゃんぷるー」を分けて表示するようにした。これによりブラックリストから外せる場合が増えるはずです。
81
+
82
+  管理画面の見栄えを変更しました。
83
+
84
+ ・バージョン2.6.2
85
+  スパム対策設定の初期値を長年の研究の末の「最適」であろう設定値にしました。
86
+  デフォルト値として項目の下に記載しています。長年ご利用の方は、参考に調整してください。
87
+  IE8にてJavaScriptエラーとなっていた箇所があり、「tsa_param.js」を修正いたしました。大変ご迷惑をお掛けいたしました。
88
+
89
+ ・バージョン2.6.1
90
+  スパムデータベースの表示に時間がかかるため「設定」部分と「スパムデータ」表示画面の2メニュー構成に変更しました。
91
+  すぱむチャンプルーによる捕捉の場合にエラータイプが正しく表示されていない不具合を修正しました。
92
+  スパム投稿内容によって画面が崩れる不具合を修正しました。
93
+
94
+ ・バージョン2.6
95
+  コメント欄に隠しフィールドを生成しその項目に入力があればスパム判定する機能を追加。
96
+  スパムデータベースに[error_type]を追加。なにが原因でスパム判定されたかとスパム投稿の内容をスパムデータベースで保存(255バイトのみ)
97
+  スパム一覧に少し表示するようにしました。
98
+  ※データベースを直接参照すれば最新以外のスパム内容もわかります。(wp_)tsa_spamテーブルです。authorとcommentのみ格納しています。
99
+
100
+  個人的にThrows SPAM Awayの設定内容をどこかに保存しておきたい場合がありましたので、そのためのメモ欄を追加しました。
101
+  これは便利機能なだけで本体機能自体とはなんら関係ありませんのでご自由にお使い下さい。
102
+
103
+ ・バージョン2.5.2.1
104
+  管理画面の微妙な調整を行いました。
105
+
106
+ ・バージョン2.5.2
107
+  バージョン2.5.1でホワイトリスト等機能ブロックが無くなってしまったミステイクがあったため精査し機能を戻しました。
108
+  大変失礼いたしました。設定されていたデータはそのまま残っていると思いますが、保証はいたしかねますのでご確認のほどよろしくお願いいたします。
109
+
110
+ ・バージョン2.5.1
111
+  「日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)」の文言表示する際の表示位置をフォーム内部の「送信」ボタン上かフォームの下に設置出来るように変更。
112
+  この文言は前のバージョンまでは
113
+  「 &lt;div id="throwsSpamAway"&gt;日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)&lt;/div&gt;」
114
+  と表示されるようにしておりましたが、この「div」タグを「p」タグに変更。
115
+  また、「コメント欄の下に表示される注意文言」を空白にした場合はタグ自体が挿入されないようにしました。
116
+  どうしても崩れてしまう方は注意文言を空白にして更新するようお願いいたします。
117
+  ※WordPress3.6以降のWordPressテーマ「Twenty Thirteen」で表示が崩れる事象が起きているための対策です。ご迷惑をお掛けしました。大変申し訳ありません。
118
+
119
+ ・バージョン2.5
120
+  「スパムちゃんぷるー(ベータ)」http://spam-champuru.livedoor.com/dnsbl/ を利用出来ます!スパムちゃんぷるーでスパム判定する機能です。
121
+  「IPアドレス ホワイトリスト」を導入しました。ホワイトリストに登録されたIPアドレスからの投稿はノーチェックで投稿完了されます。
122
+  ※ホワイトリストが一番強力にしてありますので、このIPアドレスがAkismetで捉えられていてもスパムちゃんぷるーでスパム扱いになったとしても優先で通過させます。
123
+  スパムデータベースの表示期間を指定するようにしました。また表示期間を過ぎたデータを削除することも出来るようにしました。
124
+  テストでスパム投稿したIPアドレスなどをスパムデータベースから削除する機能を付けました。
125
+  スパム投稿データに「スパムちゃんぷるー」の結果も付加しました。
126
+
127
+ ・バージョン2.4
128
+  スパム情報収集機能を「スパムコメント情報を保存する」にした場合に限り、「一定時間内スパム認定機能」が作動するように出来ます。
129
+ この「○」を設定します→《○分以内に○回スパムとなったら○分間、当該IPからのコメントはスパム扱いする設定》
130
+ 例えば、「10分以内に2回スパムとなったら10分間、当該IPからのコメントはスパム扱いする」とした場合は
131
+ 過去(今から)10分前から今まで2回スパム扱いとなったIPからの投稿は3回目以降スパム扱いとなります。
132
+ そのため、10分以内に3回目のスパムを作ってしまったためそこから10分以上経過しないとずっとスパム扱いになってしまいます。
133
+ 今までのように「これは・・・・ダメ」「これは・・・・ダメ」「これは・・・・行けた!」「よっしゃーー!突っ込めー!」という風にはできなくなるということです。
134
+ 上記の例はデフォルト値ですが、「1時間(60分)以内に3回スパムになったら24時間(1440分)スパム扱い」という設定の場合は
135
+ 24時間以内に3回スパムがあったら・・・という設定とほぼ同等(完全に同等ではありませんが・・・)ですので
136
+ 24時間の方に合わせる形で24時間以内のスパム回数を算出するようにしています。(今後見直すかもしれません)
137
+ あまり長い時間を指定しますとコメント欄への反映が遅くなりますので気をつけてください。
138
+ 5~10分程度を推奨します。
139
+
140
+  スパム投稿の一覧を見やすくしました。
141
+   これまでスパム投稿情報の表示が日付が一覧で縦表示していたため見づらいものとなっておりました。
142
+   今回、横軸にその情報を追加しました。
143
+   また、スパム投稿リストの表示も改良し、IPアドレス・スパム投稿数・最終投稿日でソートを掛けられるようにしました。
144
+
145
+  IPアドレス指定を「カンマ区切り」から「改行区切り」へ変更。スパム投稿IPアドレス情報に下記データ追加
146
+ ○IPアドレス
147
+ ○ホスト名が特定出来た場合はホスト名
148
+ ○このIPアドレスからの最終投稿日時
149
+ ○このIPアドレスからスパム投稿を受けた記事(リンク)
150
+
151
+  このバージョンよりファイル構成が変更になり、今まで「throws_spam_away.php」にプログラムのすべてが存在しましたが、プロセスの部分を
152
+  「throws_spam_away.php」に残し、クラスの部分を「throws_spam_away.class.php」に移しました。
153
+  これにより、throws_spam_away.class.php」を外部から読込みメソッドを使用することを目論んでいます。
154
+  ※まだ実験段階です。
155
+
156
+ ・バージョン2.3.1, 2.3.2 不具合修正 仕様は2.3のままです。
157
+ ・バージョン2.3スパムコメント数を保持出来るようにしました。設定を変更しないと機能しませんのでご注意ください。
158
+  保持データは下記の通り
159
+ ○投稿日時
160
+ ○投稿された記事ID
161
+ ○投稿元IPアドレス
162
+ となります。
163
+ 作成されるテーブル名は wp_tsa_spam(wp_の部分は設定されたもの) となります。
164
+
165
+ 現在は スパム投稿したIPの件数(ユニーク) と スパム投稿総数 のみ表示中・・・・StatPressのような表示にしました。
166
+ また、現在まで「NGワード」に設定したものが 投稿者の「名前」に存在していた場合でも通っていましたが、「名前」にも効くようにしました。
167
+ (トラックバックでも同様に名前もNGワード対象に追加しています。)
168
+
169
+ ・バージョン2.2 'http'を許容数(初期設定 3)を超えて包含する場合にエラーとする機能を付けました。
170
+  導入後すぐに機能しはじめます。制限数の増減も行えます。
171
+  <strong>(注意!)不要な方は設定の変更でこの機能をOFFにしてください</strong>
172
+  ※インストールしただけで最大限活用できるように初期設定値を設定いたしました。日本語スパム投稿(おもにリンクを多数掲載するもの)に対抗するための追加機能です。ご理解のほど、よろしくお願いします。
173
+
174
+ ・バージョン2.1.1 一部レンタルサーバー等の設定によってコメント投稿後エラーまたは白画面になってしまう不具合を修正
175
+  ※確認したレンタルサーバー(さくらレンタルサーバー)※コメント欄に独自修正を行うような特殊な条件により発生する模様
176
+
177
+ ・バージョン2.1でIPアドレスの範囲指定を可能にしました。
178
+
179
+ ・バージョン2.0で、WordPressのcommentsテーブルを検索し「spam」扱いとなったコメントのIPを収集しそのIPからの投稿を無視出来る機能と任意のIPアドレスからの投稿を無視出来る機能をつけました。
180
+
181
+ ・バージョン1.7で、元の画面に戻ってくる際の挙動を修正しました。
182
+  エラー画面表示の時間を「0」に設定していた場合はエラー画面を一切介さずリダイレクトするようにしました。
183
+  0以上の場合の挙動は以前と変わらずJavaScriptで時間になったら戻ってきます。
184
+
185
+ ・バージョン1.6にてNGキーワードとは逆にコレが入っていないとダメという「必須キーワード」の設定が出来るようにしました。
186
+  日本語を入れれば良いため通ってしまいやすい「中国語」への配慮です。「が」や「の」や「は」など、日本語文章が成り立つ上で必ず使用するであろう「ひらがな」を入れることで効力が発揮されると思います。
187
+
188
+ ・バージョン1.5では「トラックバック」に対しても同様の規制を入れられるようになりました。
189
+  トラックバック記事の内容に日本語を含まないものを無視します。
190
+  加えて、トラックバック記事内にこちらのサイトのURLが含まれない場合、日本語が含まれていても無視するかどうかの設定も出来るようにしました。
191
+
192
+
193
+ 制作:佐藤 毅(さとう たけし) <a href="http://gti.jp/" target="_blank">博多 南福岡 ホームページ制作</a> 株式会社ジーティーアイ代表
194
+
195
+ == Installation ==
196
+
197
+ インストールする場合は、ダッシュボードの「プラグイン」メニューから
198
+ 「新規追加」をクリックして、「キーワード」に「Throws SPAM Away」と入力し「プラグインの検索」を行って
199
+ 結果に現れた「Throws SPAM Away」をインストールしてください。
200
+
201
+ または、ダウンロードした「throws-spam-away」フォルダを
202
+ FTPなどで /wp-content/plugins/ ディレクトリにアップロードし
203
+ 「プラグイン」メニューより「Throws SPAM Away」を「有効化」してご利用ください。
204
+
205
+ e.g.
206
+
207
+ 1. Upload `throws-spam-away` to the `/wp-content/plugins/` directory
208
+ 2. Activate the plugin through the 'Plugins' menu in WordPress
209
+
210
+ == Frequently Asked Questions ==
211
+ 質問やご要望はSupportまたは弊社お問い合わせ(http://gti.jp/)へお願いします!
212
+
213
+ == Screenshots ==
214
+
215
+ == Changelog ==
216
+ = 2.6.3 =
217
+  スパムデータベースの表示速度を向上するため
218
+  スパムコメントの表示を個別画面へ移動(エラーをクリック)
219
+
220
+  スパムの区別が「すぱむちゃんぷるー」でも「指定IP」でも同一「ブロックIPアドレス」であったが
221
+  「すぱむちゃんぷるー」を分けて表示するようにした。これによりブラックリストから外せる場合が増えるはずです。
222
+
223
+  管理画面の見栄えを変更しました。
224
+
225
+ = 2.6.2 =
226
+  IE8でスクリプトエラーが発生していたため、修正しました。
227
+  初期設定値を最適化しました。デフォルトで効果的なスパム対策を提供します。
228
+
229
+ = 2.6 =
230
+  コメント欄に隠しフィールドを生成しその項目に入力があればスパム判定する機能を追加。
231
+  スパムデータベースに[error_type]を追加。なにが原因でスパム判定されたかとスパム投稿の内容をスパムデータベースで保存(255バイトずつ)
232
+  スパム一覧に少し表示するようにしました。
233
+
234
+  個人的にThrows SPAM Awayの設定内容をどこかに保存しておきたい場合がありましたので、そのためのメモ欄を追加しました。
235
+  これは便利機能なだけで本体機能自体とはなんら関係ありませんのでご自由にお使い下さい。
236
+
237
+ = 2.5 =
238
+ ・「スパムちゃんぷるー(ベータ)」http://spam-champuru.livedoor.com/dnsbl/ を利用出来ます。
239
+   スパムちゃんぷるーでスパム判定する機能です。
240
+ ・「IPアドレス ホワイトリスト」を導入しました。
241
+   ホワイトリストに登録されたIPアドレスからの投稿はノーチェックで投稿完了されます。
242
+   ※ホワイトリストが一番強力にしてありますので、このIPアドレスがAkismetで捉えられていてもスパムちゃんぷるーでスパム扱いになったとしても優先で通過させます。
243
+ ・スパムデータベースの表示期間を指定するようにしました。また表示期間を過ぎたデータを削除することも出来るようにしました。
244
+ ・テストでスパム投稿したIPアドレスなどをスパムデータベースから削除する機能を付けました。
245
+ ・スパム投稿データに「スパムちゃんぷるー」の結果も付加しました。
246
+
247
+ = 2.4 =
248
+ 制御IPアドレスの入力方式を「カンマ区切り」から「改行」へ変更しました。
249
+ 従来のデータ(カンマ区切り)は自動的に改行区切りに変更されます。
250
+
251
+ スパム投稿の一覧を見やすくしました。
252
+   これまでスパム投稿情報の表示が日付が一覧で縦表示していたため見づらいものとなっておりました。
253
+   今回、横軸にその情報を追加しました。
254
+   また、スパム投稿リストの表示も改良し、IPアドレス・スパム投稿数・最終投稿日でソートを掛けられるようにしました。
255
+
256
+ スパムコメント情報のIP一覧からIPアドレスをクリックした際に表示していた情報を下記のようにしました。
257
+ ・IPアドレス
258
+ ・ホスト名が特定出来た場合はホスト名
259
+ ・このIPアドレスからの最終投稿日時
260
+ ・このIPアドレスからスパム投稿を受けた記事(リンク)
261
+
262
+ スパム情報収集機能を「スパムコメント情報を保存する」にした場合に限り、「一定時間内スパム認定機能」が作動するように出来ます。
263
+ この「○」を設定します→《○分以内に○回スパムとなったら○分間、当該IPからのコメントはスパム扱いする設定》
264
+ 例えば、「10分以内に2回スパムとなったら10分間、当該IPからのコメントはスパム扱いする」とした場合は
265
+ 過去(今から)10分前から今まで2回スパム扱いとなったIPからの投稿は3回目以降スパム扱いとなります。
266
+ そのため、10分以内に3回目のスパムを作ってしまったためそこから10分以上経過しないとずっとスパム扱いになってしまいます。
267
+ 今までのように「これは・・・・ダメ」「これは・・・・ダメ」「これは・・・・行けた!」「よっしゃーー!突っ込めー!」という風にはできなくなるということです。
268
+ 上記の例はデフォルト値ですが、「1時間(60分)以内に3回スパムになったら24時間(1440分)スパム扱い」という設定の場合は
269
+ 24時間以内に3回スパムがあったら・・・という設定とほぼ同等(完全に同等ではありませんが・・・)ですので
270
+ 24時間の方に合わせる形で24時間以内のスパム回数を算出するようにしています。(今後見直すかもしれません)
271
+ あまり長い時間を指定しますとコメント欄への反映が遅くなりますので気をつけてください。
272
+ 5~10分程度を推奨します。
273
+
274
+ IPアドレス指定を「カンマ区切り」から「改行区切り」へ変更。スパム投稿IPアドレス情報に下記データ追加
275
+ ○IPアドレス
276
+ ○ホスト名が特定出来た場合はホスト名
277
+ ○このIPアドレスからの最終投稿日時
278
+ ○このIPアドレスからスパム投稿を受けた記事(リンク)
279
+
280
+
281
+ = 2.3.1, 2.3.2, 2.3.3 =
282
+ 不具合の修正をしました。ご迷惑をおかけいたしまして申し訳ありません。
283
+ テーブルに書き込まれない不具合、テーブル読み込みの不具合を修正しました。
284
+
285
+ = 2.3 =
286
+ スパムコメント数を保持出来るようにしました。設定を変更しないと機能しませんのでご注意ください。
287
+  保持データは下記の通り
288
+ ○投稿日時
289
+ ○投稿された記事ID
290
+ ○投稿元IPアドレス
291
+ となります。
292
+ 作成されるテーブル名は wp_tsa_spam(wp_の部分は設定されたもの) となります。
293
+
294
+ 現在は スパム投稿したIPの件数(ユニーク) と スパム投稿総数 のみ表示中・・・・StatPressのような表示にしました。
295
+ また、現在まで「NGワード」に設定したものが 投稿者の「名前」に存在していた場合でも通っていましたが、「名前」にも効くようにしました。
296
+ (トラックバックでも同様に名前もNGワード対象に追加しています。)
297
+
298
+ = 2.2 =
299
+ URL文字列(単純に'http'文字列)が許容数(初期設定3つまで)を超えて包含される場合エラーとする機能を追加
300
+ 制限するかどうかと許容数の設定及びエラー文言を設定可能。
301
+
302
+ <strong>(注意!)導入後すぐに機能しはじめます。不要な方は設定の変更でこの機能をOFFにしてください</strong>
303
+  ※インストールしただけで最大限活用できるように初期設定値を設定いたしました。日本語スパム投稿(おもにリンクを多数掲載するもの)に対抗するための追加機能です。ご理解のほど、よろしくお願いします。
304
+
305
+ = 2.1.1 =
306
+ 一部レンタルサーバー等の設定によってコメント投稿後エラーまたは白画面になってしまう不具合を修正
307
+  ※確認したレンタルサーバー(さくらレンタルサーバー)※コメント欄に独自修正を行うような特殊な条件により発生する模様
308
+  これまで「comment_form」にて処理していた動作を「comment_form_after」にて処理するよう変更しました。
309
+
310
+ = 2.1 =
311
+ IPアドレスの指定に「192.168.1.0/24」のようにIPアドレス範囲指定出来るようにしました。
312
+ ※例:192.168.0.1,192.168.1.0/24,69.208.0.0/16 と指定した場合
313
+  [192.168.0.1]と[192.168.1.0 ~ 192.168.1.255]と[69.208.0.0 ~ 69.208.255.255]のIPアドレスを拒否対象とします。
314
+
315
+ = 2.0 =
316
+ 下記の機能を追加しました。
317
+ ・コメント投稿者のIPアドレスが以前スパム扱いとなったものと同じIPアドレスからの投稿であれば無視するようにする機能
318
+ ・任意のIPアドレスからの投稿を無視するようにする機能
319
+
320
+ = 1.7 =
321
+ エラー文言画面から戻ってくる時間の設定が「0」だった場合は一切エラー画面を介さずリダイレクトするようにしました。
322
+ より「何もなかった感」があると思います。(スパム投稿者はなにが起きたかわからない・・・ではなくなにごとも起きてないと思うはず・・・)
323
+
324
+ = 1.6.1 =
325
+ 日本語文字が何文字以上入っていないとNGかのしきい値とちらっと現れるエラー文言画面から元の記事に戻ってくる時間の設定が
326
+ 「ミリ秒」だったのをわかりやすいように「秒」設定に変更します。
327
+
328
+ ~現在、この設定をしている方へ!!!~
329
+ 今までの設定値が有効の場合に1000秒以上待つことになりかねないため変数名を変更しました。
330
+ 再度設定を、「秒単位」にてお願い致します。
331
+
332
+ = 1.6 =
333
+ 必須キーワードの設定ができるようにしました。※複数指定可能
334
+ これにより漢字などが入り込んでなんとか通ってきた言語に対しても「ひらがな」等の指定によりより一層厳しくチェックできるようになります。
335
+
336
+ = 1.5 =
337
+ トラックバック・ピンバックに対しても同様のチェックを行う機能をつけました。
338
+ (オン・オフ設定出来ます。)
339
+ また、その際、トラックバック記事の中に自サイトのURLが含まれているかどうかをチェックすることも出来るようにしています。
340
+ (オン・オフ設定出来ます。)
341
+ ※トラックバックに対しては使用しないで従来通りご利用いただけます。
342
+ ※インストール時はトラックバック記事には適用しない設定になっておりますのでご利用時には「設定」メニューより「Throws SPAM Away」をクリックしていただき
343
+  「上記設定をトラックバック記事にも採用する」を「する」に
344
+  「トラックバック記事にも採用する場合、ついでにこちらのURLが含まれているか判断する」を適宜 変更してご使用ください。
345
+
346
+ = 1.4.2 =
347
+ バグ修正
348
+
349
+ = 1.4.1 =
350
+ バグ修正
351
+
352
+ = 1.4 =
353
+ 機能のオン・オフをつけました。
354
+ NGキーワードの設定が出来るようになりました。
355
+ 日本語でも他の言語でもNGキーワードが入っていれば同様に処理するようにしました。
356
+ NGキーワードに引っかかってしまった場合のエラー文言は別途設定できます。
357
+
358
+ = 1.3 =
359
+ コメント欄下の注意文言及びエラー文言を設定可能にしました。
360
+
361
+ = 1.2.1 =
362
+ バージョン表記修正。機能は変更ありません。
363
+
364
+ = 1.2 =
365
+ 設定画面を設けました。こちらで、日本語文字が何文字以上入っていないとNGかのしきい値とちらっと現れるエラー文言画面から元の記事に戻ってくる時間(ミリ秒)を設定することが出来ます。
366
+
367
+ = 1.1 =
368
+ マルチバイト文字が存在していても日本語文字列を含まないとNGとするよう
369
+ 正規表現を入れて精査するように修正
370
+
371
+ = 1.0 =
372
+ 新規作成
373
+
374
+ == Upgrade Notice ==
375
+ = 2.0 =
376
+ 以前スパム扱いとなったコメントの投稿IPアドレスからの投稿を無視機能追加
377
+ 任意IPアドレスからの投稿を無視機能追加
378
+
379
+ = 1.4 =
380
+ 機能のオン・オフ設定追加
381
+ NGキーワード(日本語及びその他言語)の設定による無視機能追加
382
+
383
+ = 1.3 =
384
+ コメント欄下の注意文言及びエラー文言を設定可能にしました。
385
+
386
+ = 1.2.1 =
387
+ バージョン表記修正
388
+
389
+ = 1.2 =
390
+ 日本語が1文字でも含まれると通ってしまうのを何文字以上含まれていないといけないのかを設定出来るようにしました。
391
+
392
+ = 1.1 =
393
+ 正規表現を使いロシア語や他のマルチバイト文字列を使用する言語からの攻撃に対応
394
+
395
+ = 1.0 =
396
+ とりあえず作りました!
397
+ == Arbitrary section ==
398
+
399
+ == A brief Markdown Example ==
trunk/throws_spam_away.class.php ADDED
@@ -0,0 +1,1385 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ *
4
+ * <p>ThrowsSpamAway</p> Class
5
+ * WordPress's Plugin
6
+ * @author Takeshi Satoh@GTI Inc. 2014
7
+ * @version 2.6.3
8
+ */
9
+ class ThrowsSpamAway {
10
+
11
+ // データベースのversion
12
+ var $version = '2.6';
13
+ var $table_name = NULL;
14
+
15
+ public function __construct() {
16
+ global $default_spam_data_save;
17
+ global $wpdb;
18
+ // 接頭辞(wp_)を付けてテーブル名を設定
19
+ $this->table_name = $wpdb->prefix . 'tsa_spam';
20
+
21
+ add_action( 'admin_menu', array( $this, 'admin_menu' ) );
22
+
23
+ global $default_spam_keep_day_count;
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
+ }
36
+
37
+ /**
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
+ }
51
+
52
+ //DBのバージョン
53
+ //$tsa_db_version
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),
63
+ post_date timestamp,
64
+ error_type varchar(255),
65
+ author varchar(255),
66
+ comment varchar(255),
67
+ UNIQUE KEY meta_id (meta_id)
68
+ )
69
+ CHARACTER SET 'utf8';";
70
+ require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
71
+ dbDelta( $sql );
72
+ //オプションにDBバージョン保存
73
+ update_option( 'tsa_meta_version', $tsa_db_version );
74
+ }
75
+ }
76
+
77
+ /**
78
+ * スパム投稿の記録
79
+ * @param string $post_id
80
+ * @param string $ip_address
81
+ */
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(
95
+ 'post_id' => $post_id,
96
+ 'ip_address' => $ip_address,
97
+ 'error_type' => $error_type,
98
+ 'author' => $author,
99
+ 'comment' => $comment,
100
+ );
101
+
102
+ //レコード新規追加
103
+ $wpdb->insert( $this->table_name, $set_arr );
104
+ $wpdb->show_errors();
105
+ return;
106
+ }
107
+
108
+ // JS読み込み部
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
+
117
+ function comment_form() {
118
+ global $default_caution_msg;
119
+ // 注意文言表示
120
+ $caution_msg = get_option( 'tsa_caution_message', $default_caution_msg );
121
+ // 注意文言が設定されている場合のみ表示する
122
+ if ( strlen( trim( $caution_msg ) ) > 0 ) {
123
+ echo '<p id="throwsSpamAway">'.$caution_msg.'</p>'; // div から p タグへ変更
124
+ }
125
+ return TRUE;
126
+ }
127
+
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;
139
+ }
140
+
141
+ function comment_post( $id ) {
142
+ global $newThrowsSpamAway;
143
+ global $user_ID;
144
+ global $default_back_second;
145
+ global $default_error_msg;
146
+ global $default_ng_key_error_msg;
147
+ global $default_must_key_error_msg;
148
+ global $default_block_ip_address_error_msg;
149
+ global $default_url_count_over_error_msg;
150
+ global $default_spam_limit_over_interval_error_msg;
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
+ }
178
+ } elseif ( trim( $_ip ) == trim( $ip ) ) {
179
+ // 通過対象
180
+ return $id;
181
+ }
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 'spam_champuru' :
204
+ $error_msg = get_option( 'tsa_block_ip_address_error_message', $default_block_ip_address_error_msg );
205
+ case 'url_count_over' :
206
+ $error_msg = get_option( 'tsa_url_count_over_error_message', $default_url_count_over_error_msg );
207
+ break;
208
+ case 'spam_limit_over' :
209
+ $error_msg = get_option( 'tsa_spam_limit_over_interval_error_message', $default_spam_limit_over_interval_error_msg );
210
+ break;
211
+ case 'dummy_param_field' : // ダミーフィールドの場合は通常メッセージ
212
+ default :
213
+ $error_msg = get_option( 'tsa_error_message', $default_error_msg );
214
+ }
215
+ // 記録する場合はDB記録
216
+ if ( get_option( 'tsa_spam_data_save', $default_spam_data_save ) == '1' ) {
217
+ $spam_contents = array();
218
+ $spam_contents['error_type'] = $error_type;
219
+ $spam_contents['author'] = mb_strcut( $author, 0, 255 );
220
+ $spam_contents['comment'] = mb_strcut( $comment, 0, 255 );
221
+
222
+ $this->save_post_meta( $id, $ip, $spam_contents );
223
+ }
224
+ // 元画面へ戻るタイム計算
225
+ $back_time = ( (int) get_option( 'tsa_back_second', $default_back_second ) ) * 1000;
226
+ // タイム値が0なら元画面へそのままリダイレクト
227
+ if ( $back_time == 0 ) {
228
+ header( 'Location:'.$_SERVER['HTTP_REFERER'] );
229
+ die;
230
+ } else {
231
+ wp_die( __( $error_msg.'<script type="text/javascript">window.setTimeout(location.href=\''.$_SERVER['HTTP_REFERER'].'\', '.$back_time.');</script>', 'throws-spam-away' ) );
232
+ }
233
+ }
234
+
235
+ /**
236
+ * IPアドレスのチェックメソッド
237
+ * @param string $target_ip
238
+ */
239
+ function ip_check( $target_ip ) {
240
+ global $wpdb; // WordPress DBアクセス
241
+ global $default_spam_champuru_flg; // すぱむちゃんぷるー利用初期値
242
+ global $newThrowsSpamAway;
243
+ global $error_type;
244
+ // スパムフィルター利用あれば始めに通す
245
+ // 1.スパムちゃんぷるー
246
+ $spam_filter_spam_champuru_flg = get_option( 'tsa_spam_champuru_flg', $default_spam_champuru_flg );
247
+ if ( get_option( 'tsa_spam_champuru_flg', '' ) == '1' ) {
248
+ return $this->reject_spam_ip( $target_ip );
249
+ }
250
+ // 2.以降あれば追加
251
+
252
+ // IP制御 WordPressのスパムチェックにてスパム扱いしている投稿のIPをブロックするか
253
+ $ip_block_from_spam_chk_flg = get_option( 'tsa_ip_block_from_spam_chk_flg' );
254
+
255
+ if ( $ip_block_from_spam_chk_flg === '1' ) {
256
+ // wp_commentsの comment_approved カラムが「spam」のIP_ADDRESSからの投稿は無視する
257
+ $results = $wpdb->get_results( "SELECT DISTINCT comment_author_IP FROM $wpdb->comments WHERE comment_approved = 'spam' ORDER BY comment_author_IP ASC " );
258
+ foreach ( $results as $item ) {
259
+ if ( trim( $item->comment_author_IP ) == trim( $target_ip ) ) {
260
+ // ブロックしたいIP
261
+ $error_type = 'block_ip';
262
+ return FALSE;
263
+ }
264
+ }
265
+ }
266
+ // IP制御 任意のIPアドレスをあればブロックする
267
+ $block_ip_addresses = get_option( 'tsa_block_ip_addresses', '' );
268
+ if ( $block_ip_addresses != NULL && $block_ip_addresses != '' ) {
269
+ // 改行区切りの場合はカンマ区切りに文字列置換後リスト化
270
+ $block_ip_addresses = str_replace( "\n", ',', $block_ip_addresses );
271
+ $ip_list = mb_split( ',', $block_ip_addresses );
272
+ foreach ( $ip_list as $ip ) {
273
+ // 指定IPが範囲指定の場合 例:192.168.1.0/24
274
+ if ( strpos( $ip, '/' ) != FALSE ) {
275
+ if ( $this->in_cidr( $target_ip, $ip ) ) {
276
+ // ブロックしたいIP
277
+ $error_type = 'block_ip';
278
+ return FALSE;
279
+ }
280
+ } elseif ( trim( $ip ) == trim( $target_ip ) ) {
281
+ // ブロックしたいIP
282
+ $error_type = 'block_ip';
283
+ return FALSE;
284
+ } else {
285
+ // セーフIP
286
+ }
287
+ }
288
+ }
289
+ return TRUE;
290
+ }
291
+
292
+ /**
293
+ * スパムちゃんぷるー利用ブロック
294
+ */
295
+ function reject_spam_ip( $ip ) {
296
+ global $spam_champuru_host;
297
+ global $error_type;
298
+
299
+ $spam_def_ip = '127.0.0.2';
300
+ $host = $spam_champuru_host;
301
+ $pattern = '/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/';
302
+ $check_IP = trim( preg_match( $pattern, $ip ) ? $ip : $_SERVER['REMOTE_ADDR'] );
303
+ $spam = false;
304
+ if ( preg_match( $pattern, $check_IP ) ) {
305
+ $host = implode( '.',array_reverse( split( '\.',$check_IP ) ) ) . '.' . $host;
306
+ if ( function_exists( 'dns_get_record' ) ) {
307
+ $check_recs = dns_get_record( $host, DNS_A );
308
+ if ( isset( $check_recs[0]['ip'] ) ) $spam = ( $check_recs[0]['ip'] === $spam_def_ip );
309
+ unset( $check_recs );
310
+ } elseif ( function_exists( 'gethostbyname' ) ) {
311
+ $checked = ( gethostbyname( $host ) === $spam_def_ip );
312
+ } elseif ( class_exists( 'Net_DNS_Resolver' ) ) {
313
+ $resolver = new Net_DNS_Resolver();
314
+ $response = $resolver->query( $host, 'A' );
315
+ if ( $response ) {
316
+ foreach ( $response->answer as $rr ) {
317
+ if ( $rr->type === 'A' ) {
318
+ $spam = ( $rr->address === $spam_def_ip );
319
+ break;
320
+ }
321
+ }
322
+ }
323
+ unset( $response );
324
+ unset( $resolver );
325
+ } elseif ( function_exists( 'checkdnsrr' ) ) {
326
+ $spam = ( checkdnsrr( $host, 'A' ) === true );
327
+ }
328
+ }
329
+ if ( $spam ) {
330
+ $error_type = 'spam_champuru';
331
+ return FALSE;
332
+ }
333
+ return TRUE;
334
+ }
335
+
336
+ /**
337
+ * CIDRチェック
338
+ * @param string $ip
339
+ * @param string $cidr
340
+ * @return boolean
341
+ */
342
+ function in_cidr( $ip, $cidr ) {
343
+ list( $network, $mask_bit_len ) = explode( '/', $cidr );
344
+ if ( ! is_nan( $mask_bit_len ) && $mask_bit_len <= 32 ) {
345
+ $host = 32 - $mask_bit_len;
346
+ $net = ip2long($network) >> $host << $host; // 11000000101010000000000000000000
347
+ $ip_net = ip2long($ip) >> $host << $host; // 11000000101010000000000000000000
348
+ return $net === $ip_net;
349
+ } else {
350
+ // 形式が不正ならば無視するためFALSE
351
+ return FALSE;
352
+ }
353
+ }
354
+
355
+ /**
356
+ * 日本語が含まれているかチェックメソッド
357
+ * @param string $comment
358
+ * @param string $author
359
+ */
360
+ function validation( $comment, $author ) {
361
+ global $newThrowsSpamAway;
362
+ global $error_type;
363
+ global $default_on_flg; // 日本語以外を弾くかどうか初期値
364
+ global $default_dummy_param_field_flg; // ダミー項目によるスパム判定初期値
365
+ global $default_url_count_check_flg; // URL数を制御するか初期設定値
366
+ global $default_ok_url_count; // 制限する場合のURL数初期設定値
367
+ global $default_japanese_string_min_count; // 日本語文字最小含有数
368
+
369
+ // Throws SPAM Away 起動フラグ '1':起動 "2":オフ
370
+ $tsa_on_flg = get_option( 'tsa_on_flg', $default_tsa_on );
371
+
372
+ // 一定時間制限チェック
373
+ // 一定時間内スパム認定機能<br />○分以内に○回スパムとなったら○分間、当該IPからのコメントはスパム扱いする設定+スパム情報保存
374
+
375
+ // ○分以内に○回スパムとなったら○分間そのIPからのコメントははじくかの設定
376
+ //$default_spam_limit_flg = 2; // 1:する 2:しない ※スパム情報保存がデフォルトではないのでこちらも基本はしない方向です。
377
+ // ※スパム情報保存していないと機能しません。
378
+ //$default_spam_limit_minutes = 60; // 60分(1時間)以内に・・・
379
+ //$default_spam_limit_count = 2; // 2回までは許そうか。
380
+ //$default_spam_limit_over_interval = 60; // だがそれを超えたら(デフォルト3回目以降)60分はOKコメントでもスパム扱いするんでよろしく!
381
+ // tsa_spam_limit_flg,tsa_spam_limit_minutes,tsa_spam_limit_count,tsa_spam_limit_over_interval,tsa_spam_limit_over_interval_error_message
382
+
383
+ // スパム情報保存フラグ
384
+ $tsa_spam_data_save = get_option( 'tsa_spam_data_save' );
385
+ // 一定時間制限チェック
386
+ $tsa_spam_limit_flg = get_option( 'tsa_spam_limit_flg', '' );
387
+ if ( $tsa_spam_data_save == '1' && $tsa_spam_limit_flg == '1' ) {
388
+ global $default_spam_limit_minutes;
389
+ global $default_spam_limit_over_interval;
390
+ global $default_spam_limit_count;
391
+ global $wpdb;
392
+ $tsa_spam_limit_minutes = intval(get_option( 'tsa_spam_limit_minutes', $default_spam_limit_minutes ) );
393
+ $tsa_spam_limit_over_interval = intval(get_option( 'tsa_spam_limit_over_interval', $default_spam_limit_over_interval ) );
394
+ // ○分以内(インターバルの方が長い場合はインターバル値を利用する)の同一IPからのスパム投稿回数を調べる
395
+ $interval_minutes = ( $tsa_spam_limit_minutes >= $tsa_spam_limit_over_interval ? $tsa_spam_limit_minutes : $tsa_spam_limit_over_interval );
396
+
397
+ // 上記が○回を超えているかチェック
398
+ $ip = htmlspecialchars( $_SERVER['REMOTE_ADDR'] );
399
+ $this_ip_spam_cnt = "
400
+ SELECT ip_address, count(ppd) as spam_count, max(post_date)
401
+ FROM (select ip_address, post_date as ppd, post_date from $this->table_name) as A
402
+ WHERE A.ip_address = '".$ip."' AND
403
+ ppd >= '".gmdate( 'Y-m-d H:i:s', current_time( 'timestamp' ) - 60 * $interval_minutes )."'
404
+ GROUP BY ip_address LIMIT 1";
405
+ $query = $wpdb->get_row( $this_ip_spam_cnt );
406
+ $spam_count = intval( $query->spam_count );
407
+
408
+
409
+ // 最後のスパム投稿から○分超えていなければ アウト!!
410
+ $tsa_spam_limit_count = intval( get_option( 'tsa_spam_limit_count', $default_spam_limit_count ) );
411
+ if ( $spam_count > $tsa_spam_limit_count ) {
412
+ // アウト!
413
+ $error_type = 'spam_limit_over';
414
+ return FALSE;
415
+ }
416
+ }
417
+ // ダミーフィールド使用する場合、ダミーフィールドに入力値があればエラー
418
+ $tsa_dummy_param_field_flg = get_option( 'tsa_dummy_param_field_flg', $default_dummy_param_field_flg );
419
+ if ( $tsa_dummy_param_field_flg == '1') {
420
+ if ( ! empty( $_POST['tsa_param_field_tsa_3'] ) ) { // このフィールドにリクエストパラメータが入る場合はスパム判定
421
+ $error_type = 'dummy_param_field';
422
+ return FALSE;
423
+ }
424
+ }
425
+ // シングルバイトだけならエラー
426
+ if ( $tsa_on_flg != '2' && strlen( bin2hex( $comment ) ) / 2 == mb_strlen( $comment ) ) {
427
+ $error_type = 'not_japanese';
428
+ return FALSE;
429
+ } else {
430
+ // 日本語文字列必須含有数
431
+ $tsa_japanese_string_min_count = intval( get_option( 'tsa_japanese_string_min_count', $default_japanese_string_min_count ) );
432
+ // NGキーワード文字列群
433
+ $tsa_ng_keywords = get_option( 'tsa_ng_keywords', '' );
434
+ // キーワード文字列群 ※ブラックリストと重複するものはブラックリストのほうが優先です。
435
+ $tsa_must_keywords = get_option( 'tsa_must_keywords', '' );
436
+ // URL数チェック
437
+ $tsa_url_count_check = get_option( 'tsa_url_count_on_flg', $default_url_count_check_flg );
438
+ // 許容URL数設定値
439
+ $tsa_ok_url_count = intval( get_option( 'tsa_ok_url_count', $default_ok_url_count ) ); // デフォルト値3(3つまで許容)
440
+
441
+ // OKフラグ
442
+ $flg = FALSE;
443
+ // マルチバイト文字が含まれている場合は日本語が含まれていればOK
444
+ if ( $tsa_on_flg != '2' ) {
445
+ $count_flg = 0;
446
+ mb_regex_encoding('UTF-8');
447
+ $com_split = $newThrowsSpamAway->mb_str_split( $comment );
448
+ foreach ( $com_split as $it ) {
449
+ if ( preg_match('/[一-龠]+/u', $it ) ){
450
+ $count_flg += 1;
451
+ }
452
+ if ( preg_match('/[ァ-ヶー]+/u', $it ) ){
453
+ $count_flg += 1;
454
+ }
455
+ if ( preg_match('/[ぁ-ん]+/u', $it ) ){
456
+ $count_flg += 1;
457
+ }
458
+ }
459
+ $flg = ( $tsa_japanese_string_min_count < $count_flg );
460
+ if ($flg == FALSE) {
461
+ $error_type = 'not_japanese';
462
+ return FALSE;
463
+ }
464
+ }
465
+ // 日本語文字列チェック抜けたらキーワードチェックを行う
466
+ if ( $tsa_ng_keywords != '' ) {
467
+ $keyword_list = mb_split( ',', $tsa_ng_keywords );
468
+ foreach ( $keyword_list as $key ) {
469
+ if ( preg_match('/'.trim( $key ).'/u', $author.$comment) ) {
470
+ $error_type = 'ng_word';
471
+ return FALSE;
472
+ }
473
+ }
474
+ }
475
+ // キーワードチェック(ブラックリスト)を抜けたら必須キーワードチェックを行う
476
+ if ( $tsa_must_keywords != '' ) {
477
+ $keyword_list = mb_split( ',', $tsa_must_keywords );
478
+ foreach ( $keyword_list as $key ) {
479
+ if ( preg_match( '/'.trim( $key ).'/u', $author.$comment ) ) {
480
+ // OK
481
+ } else {
482
+ // 必須ワードがなかったためエラー
483
+ $error_type = 'must_word';
484
+ return FALSE;
485
+ }
486
+ }
487
+ }
488
+ // 含有URL数チェック
489
+ if ( $tsa_url_count_check != '2' ) {
490
+ if ( substr_count( strtolower( $author.$comment ), 'http') > $tsa_ok_url_count) {
491
+ // URL文字列(httpの数)が多いエラー
492
+ $error_type = 'url_count_over';
493
+ return FALSE;
494
+ }
495
+ }
496
+
497
+ return TRUE;
498
+ }
499
+ }
500
+
501
+ function mb_str_split( $string ) {
502
+ return preg_split( '/(?<!^)(?!$)/u', $string );
503
+ }
504
+
505
+ /**
506
+ * Callback admin_menu
507
+ */
508
+ function admin_menu() {
509
+ $mincap = 'level_8';
510
+ $spam_mincap = 'level_7';
511
+ if (function_exists('add_menu_page')) {
512
+ add_menu_page(__('Throws SPAM Away', 'throws-spam-away'), __('Throws SPAM Away', 'throws-spam-away'), $mincap, 'throws-spam-away', array( $this, 'options_page'));
513
+ }
514
+
515
+ if (function_exists('add_submenu_page')) {
516
+ if ( get_option( 'tsa_spam_data_save' ) == '1' ) {
517
+ 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' ) );
518
+ }
519
+ // 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' ) );
520
+ }
521
+ // 従来通りスパムデータ保存しない場合はスルーする
522
+ if ( get_option( 'tsa_spam_data_save' ) != 1 ) {
523
+ // N/A
524
+ } else {
525
+ // プラグインアップデート時もチェックするため常に・・・
526
+ $this->tsa_create_tbl();
527
+ }
528
+
529
+ }
530
+
531
+ /**
532
+ * Admin options page
533
+ */
534
+ function options_page() {
535
+ global $wpdb; // WordPress DBアクセス
536
+ global $default_on_flg;
537
+ global $default_dummy_param_field_flg;
538
+ global $default_japanese_string_min_count;
539
+ global $default_caution_msg;
540
+ global $default_caution_msg_point;
541
+ global $default_back_second;
542
+ global $default_error_msg;
543
+ global $default_ng_key_error_msg;
544
+ global $default_must_key_error_msg;
545
+ global $default_tb_on_flg;
546
+ global $default_tb_url_flg;
547
+ global $default_block_ip_address_error_msg;
548
+ global $default_ip_block_from_spam_chk_flg;
549
+ global $default_spam_data_save;
550
+ global $default_url_count_over_error_msg;
551
+ global $default_ok_url_count;
552
+ global $default_spam_champuru_flg;
553
+
554
+ global $default_spam_limit_flg;
555
+ global $default_spam_limit_minutes;
556
+ global $default_spam_limit_count;
557
+ global $default_spam_limit_over_interval;
558
+ global $default_spam_limit_over_interval_error_msg;
559
+
560
+ global $default_spam_data_delete_flg;
561
+ global $default_spam_display_day_count;
562
+ global $default_spam_keep_day_count;
563
+
564
+ // 設定完了の場合はメッセージ表示
565
+ $_saved = FALSE;
566
+ if ( esc_attr( $_GET['settings-updated'] ) == 'true' ) {
567
+ $_saved = TRUE;
568
+ }
569
+ wp_enqueue_style( 'thorows-spam-away-styles', plugins_url( '/css/tsa_styles.css', __FILE__ ) );
570
+ ?>
571
+ <style>
572
+ table.form-table {
573
+
574
+ }
575
+
576
+ table.form-table th {
577
+ width: 200px;
578
+ }
579
+ </style>
580
+ <script type="text/Javascript">
581
+ // 配列重複チェック
582
+ var isDuplicate = function( ary, str ) {
583
+ for ( i = 0; i < ary.length; i++ ) {
584
+ if ( str == ary[i] ) {
585
+ return true;
586
+ }
587
+ }
588
+ return false;
589
+ };
590
+ function addIpAddresses(newAddressStr) {
591
+ // チェック用配列
592
+ var test_newAddress_list = newAddressStr.split(",");
593
+ var str = document.getElementById('tsa_block_ip_addresses').value;
594
+ // 現在の配列(テスト用)
595
+ str = str.replace(/\,/g, "\n");
596
+ var test_oldAddress_list = str.split("\n");
597
+
598
+ if (str.length > 0) { str += "\n"; }
599
+ if (newAddressStr.length > 0) {
600
+ newAddressStr = newAddressStr.replace(/\,/g, "\n");
601
+ }
602
+ str += newAddressStr;
603
+ str = str.replace(/\,/g, "\n");
604
+
605
+ var ary = str.split("\n");
606
+ var newAry = new Array;
607
+ var ret = "";
608
+
609
+ upd_flg = false;
610
+ upd_ip_str = "";
611
+ for ( var i=0; i < test_newAddress_list.length; i++) {
612
+ if (!isDuplicate(test_oldAddress_list, test_newAddress_list[i]) && test_newAddress_list[i] != "") {
613
+ upd_flg = true;
614
+ upd_ip_str = upd_ip_str + "・"+test_newAddress_list[i]+"\n";
615
+ }
616
+ }
617
+ if ( upd_flg == true ) {
618
+
619
+ for ( var i=0 ; i < ary.length ; i++ ) {
620
+ if ( ! isDuplicate( newAry, ary[i] ) && ary[i] != "" ){
621
+ newAry.push(ary[i]);
622
+ }
623
+ }
624
+ document.getElementById( 'tsa_block_ip_addresses' ).value = newAry.join( '\n' );
625
+ alert('新たにIPアドレスを追加しました。\n'+upd_ip_str);
626
+ } else {
627
+ alert('指定されたIPアドレスは\nすでに追加されています。');
628
+ }
629
+ return false;
630
+ }
631
+ </script>
632
+ <div class="wrap">
633
+ <h2 id="option_setting">Throws SPAM Away設定</h2>
634
+ <?php if ( $_saved ) { ?>
635
+ <div class="updated" style="padding: 10px; width: 50%;" id="message">設定の更新が完了しました。</div>
636
+ <?php } ?>
637
+ <form method="post" action="options.php">
638
+ <p>
639
+ <a href="spam_opt">スパム対策機能設定</a> | <a href="#url_opt">URL文字列除外 設定</a> | <a href="#keyword_opt">NGキーワード / 必須キーワード 制御設定</a> | <a href="#tb_opt">トラックバックへの対応設定</a> | <a href="#ip_opt">投稿IPアドレスによる制御設定</a> | <a href="#memo_opt">メモ</a> | <a href="#spam_data_opt">スパムデータベース</a>
640
+ </p>
641
+ <h3 id="spam_opt">スパム対策機能 設定</h3>
642
+ <?php wp_nonce_field( 'update-options' ); ?>
643
+ <table class="form-table">
644
+ <tr valign="top">
645
+ <th scope="row">人の目には見えないダミーの入力項目を作成し、そこに入力があれば無視対象とする<br />(スパムプログラム投稿に有効です)</th>
646
+ <td><?php
647
+ $chk_1 = '';
648
+ $chk_2 = '';
649
+ if ( get_option( 'tsa_dummy_param_field_flg', $default_dummy_param_field_flg ) == '2' ) {
650
+ $chk_2 = ' checked="checked"';
651
+ } else {
652
+ $chk_1 = ' checked="checked"';
653
+ }
654
+ ?>
655
+ <label><input type="radio" name="tsa_dummy_param_field_flg" value="1"<?php esc_attr_e( $chk_1 ); ?> />&nbsp;する</label>&nbsp;
656
+ <label><input type="radio" name="tsa_dummy_param_field_flg" value="2"<?php esc_attr_e( $chk_2 ); ?> />&nbsp;しない</label><br />
657
+ ※ダミー項目の制御にJavaScriptを使用しますのでJavaScriptが動作しない環境からの投稿はスパム判定されてしまいます。ご注意の上、ご利用ください。<br />
658
+ (初期設定:<?php echo ( $default_dummy_param_field_flg == '2' ? "しない" : "する" ); ?>)
659
+ </td>
660
+ </tr>
661
+ </table>
662
+ <table class="form-table">
663
+ <tr valign="top">
664
+ <th scope="row">日本語が存在しない場合、無視対象とする<br />(日本語文字列が存在しない場合無視対象となります。)</th>
665
+ <td><?php
666
+ $chk_1 = '';
667
+ $chk_2 = '';
668
+ if ( get_option( 'tsa_on_flg', $default_on_flg ) == '2' ) {
669
+ $chk_2 = ' checked="checked"';
670
+ } else {
671
+ $chk_1 = ' checked="checked"';
672
+ }
673
+ ?> <label><input type="radio" name="tsa_on_flg" value="1" <?php esc_attr_e( $chk_1 ); ?> />&nbsp;する</label>&nbsp;
674
+ <label><input type="radio" name="tsa_on_flg" value="2" <?php esc_attr_e( $chk_2 );?> />&nbsp;しない</label><br />
675
+ (初期設定:<?php echo ( $default_on_flg == '2' ? "しない" : "する" ); ?>)
676
+ </td>
677
+ </tr>
678
+ <tr valign="top">
679
+ <th scope="row">日本語文字列含有数<br />(この文字列に達していない場合無視対象となります。)
680
+ </th>
681
+ <td><input type="text" name="tsa_japanese_string_min_count"
682
+ value="<?php echo get_option( 'tsa_japanese_string_min_count', $default_japanese_string_min_count ); ?>" /><br />
683
+ (初期設定:<?php echo $default_japanese_string_min_count; ?>)
684
+ </td>
685
+ </tr>
686
+ <tr valign="top">
687
+ <th scope="row">元の記事に戻ってくる時間<br />(秒)※0の場合エラー画面表示しません。
688
+ </th>
689
+ <td><input type="text" name="tsa_back_second"
690
+ value="<?php echo get_option( 'tsa_back_second', $default_back_second );?>" /><br />
691
+ (初期設定:<?php echo $default_back_second; ?>)
692
+ </td>
693
+ </tr>
694
+ <tr valign="top">
695
+ <th scope="row" id="tsa_caution_message">コメント欄の下に表示される注意文言</th>
696
+ <td><input type="text" name="tsa_caution_message" size="80"
697
+ value="<?php echo get_option( 'tsa_caution_message', $default_caution_msg );?>" /><br />
698
+ (初期設定:<?php echo $default_caution_msg;?>)</td>
699
+ </tr>
700
+ <tr valign="top">
701
+ <th scope="row" id="tsa_caution_msg_point">コメント注意文言の表示位置</th>
702
+ <td><?php
703
+ $chk_1 = '';
704
+ $chk_2 = '';
705
+ if ( get_option( 'tsa_caution_msg_point', $default_caution_msg_point ) == '2' ) {
706
+ $chk_2 = ' checked="checked"';
707
+ } else {
708
+ $chk_1 = ' checked="checked"';
709
+ }
710
+ ?> <label><input type="radio"
711
+ name="tsa_caution_msg_point" value='1' <?php esc_attr_e( $chk_1 ); ?> />&nbsp;コメント送信ボタンの上</label>&nbsp;
712
+ <label><input type="radio" name="tsa_caution_msg_point" value="2"
713
+ <?php esc_attr_e( $chk_2 );?> />&nbsp;コメント送信フォームの下</label><br />
714
+ (初期設定:<?php echo ( $default_caution_msg_point == '2' ? "コメント送信フォームの下" : "コメント送信ボタンの上" ); ?>)
715
+ </td>
716
+ </tr>
717
+ </table>
718
+ <p>※表示が崩れる場合、<a href="#tsa_caution_msg_point">「コメント注意文言の表示位置」</a>の変更 や <a href="#tsa_caution_message">「コメント欄の下に表示される注意文言」</a>を空白にすること を試してみて下さい。<br />
719
+ 「コメント欄の下に表示される注意文言」が空白の場合は文言表示のタグ自体が挿入されないようになります。</p>
720
+ <table class="form-table">
721
+ <tr valign="top">
722
+ <th scope="row">日本語文字列規定値未満エラー時に表示される文言<br />(元の記事に戻ってくる時間の間のみ表示)</th>
723
+ <td><input type="text" name="tsa_error_message" size="80"
724
+ value="<?php echo get_option( 'tsa_error_message', $default_error_msg );?>" /><br />(初期設定:<?php echo $default_error_msg; ?>)</td>
725
+ </tr>
726
+ </table>
727
+ <a href="#option_setting" class="alignright">▲ 上へ</a>
728
+ <h3 id="url_opt">URL文字列除外 設定</h3>
729
+ <table class="form-table">
730
+ <tr valign="top">
731
+ <th scope="row">URLらしき文字列が混入している場合エラーとするか</th>
732
+ <td><?php
733
+ $chk_1 = '';
734
+ $chk_2 = '';
735
+ if (get_option( 'tsa_url_count_on_flg', '1') == '2') {
736
+ $chk_2 = ' checked="checked"';
737
+ } else {
738
+ $chk_1 = ' checked="checked"';
739
+ }
740
+ ?> <label><input type="radio"
741
+ name="tsa_url_count_on_flg" value='1' <?php esc_attr_e( $chk_1 ); ?> />&nbsp;する</label>&nbsp;
742
+ <label><input type="radio" name="tsa_url_count_on_flg" value="2"
743
+ <?php esc_attr_e( $chk_2 );?> />&nbsp;しない</label><br /> する場合の制限数(入力数値まで許容):<input
744
+ type="text" name="tsa_ok_url_count" size="2"
745
+ value="<?php echo get_option( 'tsa_ok_url_count', $default_ok_url_count);?>" /><br />
746
+ (初期設定: <?php echo $default_ok_url_count; ?>)
747
+ </td>
748
+ </tr>
749
+ <tr valign="top">
750
+ <th scope="row">URLらしき文字列混入数オーバーエラー時に表示される文言 (元の記事に戻ってくる時間の間のみ表示)</th>
751
+ <td><input type="text" name="tsa_url_count_over_error_message"
752
+ size="80"
753
+ value="<?php echo get_option( 'tsa_url_count_over_error_message', $default_url_count_over_error_msg);?>" /><br />
754
+ (初期設定:<?php echo $default_url_count_over_error_msg;?>)</td>
755
+ </tr>
756
+ </table>
757
+ <a href="#option_setting" class="alignright">▲ 上へ</a>
758
+
759
+ <h3 id="keyword_opt">NGキーワード / 必須キーワード 制御設定</h3>
760
+ <table class="form-table">
761
+ <tr valign="top">
762
+ <th scope="row">その他NGキーワード<br />(日本語でも英語(その他)でもNGとしたいキーワードを半角カンマ区切りで複数設定できます。<br />挙動は同じです。NGキーワードだけでも使用できます。)
763
+ </th>
764
+ <td><input type="text" name="tsa_ng_keywords" size="80"
765
+ value="<?php echo get_option( 'tsa_ng_keywords', '');?>" /></td>
766
+ </tr>
767
+ <tr valign="top">
768
+ <th scope="row">NGキーワードエラー時に表示される文言<br />(元の記事に戻ってくる時間の間のみ表示)
769
+ </th>
770
+ <td><input type="text" name="tsa_ng_key_error_message" size="80"
771
+ value="<?php echo get_option( 'tsa_ng_key_error_message', $default_ng_key_error_msg);?>" /><br />
772
+ (初期設定:<?php echo $default_ng_key_error_msg;?>)</td>
773
+ </tr>
774
+ <tr valign="top">
775
+ <th scope="row">その上での必須キーワード<br />(日本語でも英語(その他)でも必須としたいキーワードを半角カンマ区切りで複数設定できます。<br />指定文字列を含まない場合はエラーとなります。※複数の方が厳しくなります。<br />必須キーワードだけでも使用できます。)
776
+ </th>
777
+ <td><input type="text" name="tsa_must_keywords" size="80"
778
+ value="<?php echo get_option( 'tsa_must_keywords', '');?>" /></td>
779
+ </tr>
780
+ <tr valign="top">
781
+ <th scope="row">必須キーワードエラー時に表示される文言<br />(元の記事に戻ってくる時間の間のみ表示)
782
+ </th>
783
+ <td><input type="text" name="tsa_must_key_error_message" size="80"
784
+ value="<?php echo get_option( 'tsa_must_key_error_message', $default_must_key_error_msg);?>" /><br />
785
+ (初期設定:<?php echo $default_must_key_error_msg;?>)</td>
786
+ </tr>
787
+ </table>
788
+ <a href="#option_setting" class="alignright">▲ 上へ</a>
789
+
790
+ <h3 id="tb_opt">トラックバックへの対応設定</h3>
791
+ <table class="form-table">
792
+ <tr valign="top">
793
+ <th scope="row">上記設定をトラックバック記事にも採用する</th>
794
+ <td><?php
795
+ $chk_1 = '';
796
+ $chk_2 = '';
797
+ if (get_option( 'tsa_tb_on_flg', $default_tb_on_flg) == "2") {
798
+ $chk_2 = ' checked="checked"';
799
+ } else {
800
+ $chk_1 = ' checked="checked"';
801
+ }
802
+ ?> <label><input type="radio" name="tsa_tb_on_flg"
803
+ value='1' <?php esc_attr_e( $chk_1 ); ?> />&nbsp;する</label>&nbsp; <label><input
804
+ type="radio" name="tsa_tb_on_flg" value="2" <?php esc_attr_e( $chk_2 );?> />&nbsp;しない</label><br />
805
+ (初期設定:<?php echo ( $default_tb_on_flg == '2' ? "しない" : "する" ); ?>)
806
+ </td>
807
+ </tr>
808
+ <tr valign="top">
809
+ <th scope="row">トラックバック記事にも採用する場合、ついでにこちらのURLが含まれているか判断する
810
+ </th>
811
+ <td><?php
812
+ $chk_1 = '';
813
+ $chk_2 = '';
814
+ if ( get_option( 'tsa_tb_url_flg', $default_tb_url_flg) == '2' ) {
815
+ $chk_2 = ' checked="checked"';
816
+ } else {
817
+ $chk_1 = ' checked="checked"';
818
+ }
819
+ ?> <label><input type="radio" name="tsa_tb_url_flg"
820
+ value='1' <?php esc_attr_e( $chk_1 ); ?> />&nbsp;する</label>&nbsp; <label><input
821
+ type="radio" name="tsa_tb_url_flg" value="2" <?php esc_attr_e( $chk_2 );?> />&nbsp;しない</label><br />
822
+ (初期設定:<?php echo ( $default_tb_url_flg == '2' ? "しない" : "する" ); ?>)
823
+ </td>
824
+ </tr>
825
+ </table>
826
+ <a href="#option_setting" class="alignright">▲ 上へ</a>
827
+
828
+ <h3 id="ip_opt">投稿IPアドレスによる制御設定</h3>
829
+ <table class="form-table">
830
+ <tr valign="top">
831
+ <th scope="row">SPAMブラックリスト利用</th>
832
+ <td><?php
833
+ $chk = '';
834
+ if ( get_option( 'tsa_spam_champuru_flg', $default_spam_champuru_flg) == '1' ) {
835
+ $chk = ' checked="checked"';
836
+ }
837
+ ?>
838
+ <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 />
839
+ (初期設定:<?php echo ( $default_spam_champuru_flg == '2' ? "しない" : "する" ); ?>)
840
+ </td>
841
+ </tr>
842
+ <tr valign="top">
843
+ <th scope="row">WordPressのコメントで「スパム」にしたIPからの投稿にも採用する</th>
844
+ <td><?php
845
+ $chk = '';
846
+ if ( get_option( 'tsa_ip_block_from_spam_chk_flg', $default_ip_block_from_spam_chk_flg) == '1' ) {
847
+ $chk = ' checked="checked"';
848
+ }
849
+ ?> <label><input type="checkbox"
850
+ name="tsa_ip_block_from_spam_chk_flg" value='1'
851
+ <?php esc_attr_e( $chk ); ?> />&nbsp;スパム投稿設定したIPアドレスからの投稿も無視する</label>&nbsp;※Akismet等で自動的にスパムマークされたものも含む<br />
852
+ (初期設定:<?php echo ( $default_ip_block_from_spam_chk_flg != '1' ? "しない" : "する" ); ?>)<br />
853
+ <?php
854
+ // wp_commentsの comment_approved カラムが「spam」のIP_ADDRESSからの投稿は無視する
855
+ $results = $wpdb->get_results("SELECT DISTINCT comment_author_IP FROM $wpdb->comments WHERE comment_approved = 'spam' ORDER BY comment_author_IP ASC ");
856
+ ?>現在「spam」フラグが付いているIPアドレス:<br />
857
+ <blockquote>
858
+ <?php
859
+ $add_ip_addresses = '';
860
+ foreach ( $results as $item ) {
861
+ $spam_ip = esc_attr($item->comment_author_IP);
862
+ // ブロックしたいIP
863
+ if ( strlen( $add_ip_addresses ) > 0 ) {
864
+ $add_ip_addresses .= ',';
865
+ }
866
+ $add_ip_addresses .= $spam_ip;
867
+ ?>
868
+ <b><?php esc_attr_e( $spam_ip ); ?> </b><br />
869
+ <?php
870
+ }
871
+ ?>
872
+ &nbsp;<input type="button"
873
+ onclick="javascript:addIpAddresses('<?php echo $add_ip_addresses; ?>');"
874
+ value="これらのIPアドレスを任意のブロック対象IPアドレスにコピーする" /><br />
875
+ </blockquote>
876
+ </td>
877
+ </tr>
878
+ <tr valign="top">
879
+ <th scope="row">任意のIPアドレスからの投稿も無視したい場合、対象となるIPアドレスを記述してください。<br />改行区切りで複数設定できます。(半角数字とスラッシュ、ドットのみ)<br />※カンマは自動的に改行に変換されます
880
+ </th>
881
+ <td><textarea name="tsa_block_ip_addresses"
882
+ id="tsa_block_ip_addresses" cols="80" rows="10"><?php echo get_option( 'tsa_block_ip_addresses', '' );?></textarea></td>
883
+ </tr>
884
+ <tr valign="top">
885
+ <th scope="row">ブロック対象のIPアドレスからの投稿時に表示される文言<br />(元の記事に戻ってくる時間の間のみ表示)
886
+ </th>
887
+ <td><input type="text" name="tsa_block_ip_address_error_message"
888
+ size="80"
889
+ 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>
890
+ </tr>
891
+ </table>
892
+ <p>※上記のスパムチェックから除外するIPアドレスがあれば下記に設定してください。優先的に通過させます。<br />※トラックバックは優先通過ではありません。</p>
893
+ <table class="form-table">
894
+ <tr style="background-color: #fefefe;" valign="top">
895
+ <th scope="row"><strong>IP制御免除<br />ホワイトリスト</strong></th>
896
+ <td>
897
+ ※ここに登録したIPアドレスはスパムフィルタを掛けず優先的に通します。<br />※日本語以外の言語でご利用になられるお客様のIPアドレスを登録するなどご利用ください。<br />改行区切りで複数設定できます。範囲指定も可能です。(半角数字とスラッシュ、ドットのみ)
898
+ <textarea name="tsa_white_ip_addresses"
899
+ id="tsa_white_ip_addresses" cols="80" rows="10"><?php echo get_option( 'tsa_white_ip_addresses', '' );?></textarea>
900
+ </td>
901
+ </tr>
902
+
903
+ </table>
904
+ <a href="#option_setting" class="alignright">▲ 上へ</a>
905
+
906
+ <h3 id="memo_opt">メモ(スパム対策情報や IPアドレス・NGワードその他メモ備忘録としてご自由にお使い下さい)</h3>
907
+ <p>この欄の内容が表示されることはありません。</p>
908
+ <table class="form-table">
909
+ <tr valign="top">
910
+ <td>
911
+ <textarea name="tsa_memo" style="width: 80%;" rows="10"><?php echo get_option( 'tsa_memo', '' ); ?></textarea>
912
+
913
+ </td>
914
+ </tr>
915
+ </table>
916
+ <a href="#option_setting" class="alignright">▲ 上へ</a>
917
+
918
+ <h3 id="spam_data_opt">スパムデータベース</h3>
919
+ <table class="form-table">
920
+ <tr valign="top">
921
+ <th scope="row">スパムコメント投稿情報を保存しますか?</th>
922
+ <td><?php
923
+ $chk = '';
924
+ if ( get_option( 'tsa_spam_data_save', $default_spam_data_save) == '1' ) {
925
+ $chk = ' checked="checked"';
926
+ }
927
+ ?> <label><input type="checkbox"
928
+ name="tsa_spam_data_save" value='1' <?php esc_attr_e( $chk ); ?> />&nbsp;スパムコメント情報を保存する</label><br />※Throws
929
+ SPAM Away設定画面表示時に時間がかかることがあります。<br />※「保存する」を解除した場合でもテーブルは残りますので<?php echo get_option( 'tsa_spam_keep_day_count', $default_spam_keep_day_count); ?>日以内の取得データは表示されます。<br />
930
+ (初期設定:<?php echo ( $default_spam_data_save != '1' ? "しない" : "する" ); ?>)
931
+ </td>
932
+ </tr>
933
+ <tr>
934
+ <th scope="row">スパムデータを表示する期間</th>
935
+ <td>
936
+ <input
937
+ type="text" name="tsa_spam_keep_day_count" size="3"
938
+ 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;
939
+ <?php
940
+ $chk = '';
941
+ if ( get_option( 'tsa_spam_data_delete_flg', $default_spam_data_delete_flg) == '1' ) {
942
+ $chk = ' checked="checked"';
943
+ }
944
+ ?>
945
+ <label><input type="checkbox" name="tsa_spam_data_delete_flg" value='1'
946
+ <?php esc_attr_e( $chk ); ?> />&nbsp;期間が過ぎたデータを削除する</label><br />
947
+ ※一度消したデータは復活出来ませんのでご注意ください。また最低7日分は保存されます。
948
+ </td>
949
+ </tr>
950
+ </table>
951
+ <p>一定時間内スパム認定機能<br />○分以内に○回スパムとなったら○分間、当該IPからのコメントはスパム扱いする設定<br />
952
+ <b>※一定時間以内にスパム投稿された回数を測定していますので「スパムコメント情報を保存する」機能がオフの場合は機能しません。</b></p>
953
+ <table class="form-table">
954
+ <tr>
955
+ <th scope="row">機能設定</th>
956
+ <td><?php
957
+ $chk = '';
958
+ if ( get_option( 'tsa_spam_limit_flg', $default_spam_limit_flg) == '1' ) {
959
+ $chk = ' checked="checked"';
960
+ }
961
+ ?> <label><input type="checkbox" name="tsa_spam_limit_flg" value='1'
962
+ <?php esc_attr_e( $chk ); ?> />&nbsp;機能させる</label> (初期設定: <?php echo ( $default_spam_limit_flg != '1' ? "しない" : "する" ); ?>)<br /> 一定時間:<input
963
+ type="text" name="tsa_spam_limit_minutes" size="3"
964
+ value="<?php echo get_option( 'tsa_spam_limit_minutes', $default_spam_limit_minutes); ?>" />分以内に
965
+ 一定回数:<input type="text" name="tsa_spam_limit_count" size="3"
966
+ value="<?php echo get_option( 'tsa_spam_limit_count', $default_spam_limit_count); ?>" />回スパムとなったら<b>次から</b>
967
+ 一定時間:<input type="text" name="tsa_spam_limit_over_interval" size="3"
968
+ value="<?php echo get_option( 'tsa_spam_limit_over_interval', $default_spam_limit_over_interval); ?>" />分間<br />
969
+ (初期設定:一定時間「<?php echo $default_spam_limit_minutes; ?>」分以内に一定回数「<?php echo $default_spam_limit_count; ?>」回スパムとなったら次から「<?php echo $default_spam_limit_over_interval; ?>」分間)<br />
970
+ 当該IPアドレスからのコメントを強制スパム扱いします。<br /> エラーメッセージは:<input type="text"
971
+ name="tsa_spam_limit_over_interval_error_message" size="80"
972
+ value="<?php echo get_option( 'tsa_spam_limit_over_interval_error_message', $default_spam_limit_over_interval_error_msg); ?>" /><br />
973
+ (初期設定:<?php echo $default_spam_limit_over_interval_error_msg; ?>)
974
+ </td>
975
+ </tr>
976
+ </table>
977
+ <a href="#option_setting" class="alignright">▲ 上へ</a>
978
+
979
+ <input type="hidden" name="action" value="update" /> <input
980
+ type="hidden" name="page_options"
981
+ value="tsa_on_flg,tsa_japanese_string_min_count,tsa_back_second,tsa_caution_message,tsa_caution_msg_point,tsa_error_message,tsa_ng_keywords,tsa_ng_key_error_message,tsa_must_keywords,tsa_must_key_error_message,tsa_tb_on_flg,tsa_tb_url_flg,tsa_block_ip_addresses,tsa_ip_block_from_spam_chk_flg,tsa_block_ip_address_error_message,tsa_url_count_on_flg,tsa_ok_url_count,tsa_url_count_over_error_message,tsa_spam_data_save,tsa_spam_limit_flg,tsa_spam_limit_minutes,tsa_spam_limit_count,tsa_spam_limit_over_interval,tsa_spam_limit_over_interval_error_message,tsa_spam_champuru_flg,tsa_spam_keep_day_count,tsa_spam_data_delete_flg,tsa_white_ip_addresses,tsa_dummy_param_field_flg,tsa_memo" />
982
+ <p class="submit" id="tsa_submit_button">
983
+ <input type="submit" class="button-primary"
984
+ value="<?php _e('Save Changes') ?>" />
985
+ </p>
986
+ </form>
987
+ </div>
988
+ <?php
989
+ }
990
+
991
+ function trackback_spam_away( $tb ) {
992
+ global $newThrowsSpamAway;
993
+
994
+ $tsa_tb_on_flg = get_option( 'tsa_tb_on_flg' );
995
+ $tsa_tb_url_flg = get_option( 'tsa_tb_url_flg' );
996
+ $siteurl = get_option( 'siteurl');
997
+ // トラックバック OR ピンバック時にフィルタ発動
998
+ if ( $tsa_tb_on_flg == "2" || ( $tb['comment_type'] != 'trackback' && $tb['comment_type'] != 'pingback' ) ) return $tb;
999
+
1000
+ // SPAMかどうかフラグ
1001
+ $tb_val['is_spam'] = FALSE;
1002
+
1003
+ // コメント判定
1004
+ $author = $tb["comment_author"];
1005
+ $comment = $tb["comment_content"];
1006
+ $post_id = $tb["comment_post_ID"];
1007
+ // IP系の検査
1008
+ $ip = $_SERVER['REMOTE_ADDR'];
1009
+ if ( ! $newThrowsSpamAway->ip_check( $ip ) ) {
1010
+ $tb_val['is_spam'] = TRUE;
1011
+ } else
1012
+ // 検査します!
1013
+ if ( ! $newThrowsSpamAway->validation( $comment, $author ) ) {
1014
+ $tb_val['is_spam'] = TRUE;
1015
+ } else
1016
+ // URL検索する場合、URL包含検査 (このブログのURLを含んでない場合エラー
1017
+ if ( $tsa_tb_url_flg == '1' && stripos( $comment, $siteurl ) == FALSE ) {
1018
+ $tb_val['is_spam'] = TRUE; // スパム扱い
1019
+ }
1020
+ // トラックバックスパムがなければ返却・あったら捨てちゃう
1021
+ if ( ! $tb_val['is_spam'] ) {
1022
+ // トラックバック内に日本語存在(または禁止語句混入なし)
1023
+ return $tb;
1024
+ } else {
1025
+ if ( get_option( 'tsa_spam_data_save', $default_spam_data_save ) == '1' ) {
1026
+ $spam_contents = array();
1027
+ $spam_contents['error_type'] = 'spam_trackback';
1028
+ $spam_contents['author'] = mb_strcut( strip_tags( $author ), 0, 255 );
1029
+ $spam_contents['comment'] = mb_strcut( strip_tags( $comment ), 0, 255 );
1030
+
1031
+ $this->save_post_meta( $post_id, $ip, $spam_contents );
1032
+ }
1033
+ die( 'Your Trackback Throws Away.' );
1034
+ }
1035
+ }
1036
+
1037
+ /**
1038
+ * 当該IPアドレスからの最終投稿日時取得
1039
+ * @param string ip_address
1040
+ * @return 最終投稿日時 Y-m-d H:i:s
1041
+ */
1042
+ function get_last_spam_comment( $ip_address = NULL ) {
1043
+ global $wpdb;
1044
+ // IPアドレスがなければNULL返却
1045
+ if ( $ip_address == NULL ) {
1046
+ return NULL;
1047
+ }
1048
+ // 最終コメント情報取得
1049
+ $qry_str = "SELECT A.post_date, A.post_id, B.error_type, B.author as spam_author, B.comment as spam_comment FROM $this->table_name as A
1050
+ INNER JOIN $this->table_name as B ON A.ip_address = B.ip_address AND A.post_date = B.post_date
1051
+ WHERE A.ip_address = '".htmlspecialchars( $ip_address )."' ORDER BY A.post_date DESC LIMIT 1 ";
1052
+ $results = $wpdb->get_results( $qry_str );
1053
+ if ( count( $results ) > 0 ) {
1054
+ return $results[0];
1055
+ }
1056
+ return NULL;
1057
+ }
1058
+
1059
+ /**
1060
+ * スパムデータベース表示
1061
+ * @param
1062
+ * @return HTML
1063
+ */
1064
+ function spams_list() {
1065
+ global $wpdb;
1066
+ $_saved = FALSE;
1067
+
1068
+ // ブラックIPリスト
1069
+ $block_ip_addresses_str = get_option( 'tsa_block_ip_addresses', '');
1070
+ $block_ip_addresses = str_replace("\n", ",", $block_ip_addresses_str);
1071
+ $ip_list = mb_split( ",", $block_ip_addresses );
1072
+
1073
+ // スパム情報から 特定IPアドレス削除
1074
+ if ( $_POST['act'] != NULL && $_POST['act'] == "remove_ip" ) {
1075
+ $remove_ip_address = @htmlspecialchars( $_POST['ip_address'] );
1076
+ if ( !isset( $remove_ip_address ) || strlen( $remove_ip_address ) == 0 ) {
1077
+ // N/A
1078
+ } else {
1079
+ // スパムデータベースから特定IP情報削除
1080
+ $wpdb->query(
1081
+ "DELETE FROM ".$this->table_name." WHERE ip_address = '".$remove_ip_address."' "
1082
+ );
1083
+ $_saved = TRUE;
1084
+ $message = "スパムデータから $remove_ip_address のデータを削除しました。";
1085
+ }
1086
+ } elseif ( $_POST['act'] != NULL && $_POST['act'] == "add_ip" ) {
1087
+ $add_ip_address = @htmlspecialchars( $_POST['ip_address'] );
1088
+ if ( ! isset( $add_ip_address ) || strlen( $add_ip_address ) == 0 ) {
1089
+ // N/A
1090
+ } else {
1091
+ // 対象IPアドレスに一つ追加
1092
+ $dup_flg = FALSE;
1093
+ foreach ( $ip_list as $ip ) {
1094
+ if ( $ip == trim($add_ip_address) ) {
1095
+ $_saved = TRUE;
1096
+ $message = "$add_ip_address はすでに設定されています。";
1097
+ $dup_flg = TRUE;
1098
+ break;
1099
+ }
1100
+ }
1101
+ if ( $dup_flg == FALSE ) {
1102
+ $added_block_ip_addresses_str = $block_ip_addresses_str . "\n" .$add_ip_address;
1103
+ update_option("tsa_block_ip_addresses", $added_block_ip_addresses_str);
1104
+ $_saved = TRUE;
1105
+ $message = "$add_ip_address を追加設定しました。";
1106
+ }
1107
+ }
1108
+ }
1109
+
1110
+ // ブラックIPリスト もう一度取得
1111
+ // $block_ip_addresses_str = get_option( 'tsa_block_ip_addresses', '' );
1112
+ // $block_ip_addresses = str_replace( "\n", ',', $block_ip_addresses_str );
1113
+ // $ip_list = mb_split( ",", $block_ip_addresses );
1114
+
1115
+ if ( $_GET['settings-updated'] == 'true' ) {
1116
+ $_saved = TRUE;
1117
+ }
1118
+ ?>
1119
+ <div class="wrap">
1120
+ <?php
1121
+ if ( get_option( 'tsa_spam_data_save' ) == '1' ) {
1122
+ // 日数
1123
+ $gdays = get_option( 'tsa_spam_keep_day_count', $default_spam_keep_day_count);
1124
+ if ( $gdays < $lower_spam_keep_day_count ) { $gdays = $lower_spam_keep_day_count; }
1125
+ // 表カラー
1126
+ $unique_color="#114477";
1127
+ $web_color="#3377B6";
1128
+ ?>
1129
+ <h2>Throws SPAM Away スパムデータ</h2>
1130
+ <h3>スパム投稿<?php echo $gdays; ?>日間の推移</h3>
1131
+ <?php if ( $_saved ) { ?>
1132
+ <div class="updated" style="padding: 10px; width: 50%;" id="message"><?php esc_attr_e( $message ); ?></div>
1133
+ <?php } ?>
1134
+ <div style="background-color: #efefef;">
1135
+ <table style="width: 100%; border: none;">
1136
+ <tr>
1137
+ <?php
1138
+ $total_qry = "
1139
+ SELECT count(ppd) as pageview, ppd
1140
+ FROM (select ip_address, SUBSTRING(post_date,1,10) as ppd from $this->table_name) as A
1141
+ GROUP BY ppd HAVING ppd >= '".gmdate( 'Y-m-d', current_time( 'timestamp' ) - 86400 * $gdays )."'
1142
+ ORDER BY pageview DESC
1143
+ LIMIT 1
1144
+ ";
1145
+ $qry = $wpdb->get_row( $total_qry );
1146
+ $maxxday = $qry->pageview;
1147
+
1148
+ $total_vis = "
1149
+ SELECT count(distinct ip_address) as vis, ppd
1150
+ FROM (select ip_address, SUBSTRING(post_date,1,10) as ppd from $this->table_name) as B
1151
+ GROUP BY ppd HAVING ppd >= '" . gmdate( 'Y-m-d', current_time( 'timestamp' ) - 86400 * $gdays ) . "'
1152
+ ORDER BY vis DESC
1153
+ LIMIT 1
1154
+ ";
1155
+ $qry_vis = $wpdb->get_row( $total_vis );
1156
+ $maxxday += $qry_vis->vis;
1157
+
1158
+ if ( $maxxday == 0 ) {
1159
+ $maxxday = 1;
1160
+ }
1161
+
1162
+ // Y
1163
+ $gd = ( 100 / $gdays ).'%';
1164
+ for ( $gg = $gdays - 1; $gg >= 0; $gg-- ) {
1165
+ // TOTAL SPAM COUNT
1166
+ $visitor_qry = "
1167
+ SELECT count(DISTINCT ip_address) AS total
1168
+ FROM (select ip_address, SUBSTRING(post_date,1,10) as ppd from $this->table_name) as B
1169
+ WHERE ppd = '".gmdate( 'Y-m-d', current_time( 'timestamp' ) - 86400 * $gg )."'
1170
+ ";
1171
+ $qry_visitors = $wpdb->get_row( $visitor_qry );
1172
+ $px_visitors = round( $qry_visitors->total * 100 / $maxxday );
1173
+ // TOTAL
1174
+ $pageview_qry = "
1175
+ SELECT count(ppd) as total
1176
+ FROM (select ip_address, SUBSTRING(post_date,1,10) as ppd from $this->table_name) as C
1177
+ WHERE ppd = '".gmdate( 'Y-m-d', current_time( 'timestamp' ) - 86400 * $gg )."'
1178
+ ";
1179
+ $qry_pageviews = $wpdb->get_row( $pageview_qry );
1180
+ $px_pageviews = round( $qry_pageviews->total * 100 / $maxxday );
1181
+ $px_white = 100 - $px_pageviews - $px_visitors;
1182
+ if ( $px_white < 0 ) {
1183
+ $px_white = 0;
1184
+ }
1185
+
1186
+ print '<td width="'.$gd.'" valign="bottom"';
1187
+ if ( $start_of_week == gmdate( 'w', current_time( 'timestamp' ) - 86400 * $gg ) ) {
1188
+ print ' style="border-left:2px dotted gray;"';
1189
+ } # week-cut
1190
+ print "><div style='float:left;width:100%;font-family:Helvetica;font-size:7pt;text-align:center;border-right:1px solid white;color:black;'>
1191
+ <div style='background:#ffffff;width:100%;height:".$px_white."px;'></div>
1192
+ <div style='background:$unique_color;width:100%;height:".$px_visitors."px;' title='".$qry_visitors->total." ip_addresses'></div>
1193
+ <div style='background:$web_color;width:100%;height:".$px_pageviews."px;' title='".$qry_pageviews->total." spam comments'></div>
1194
+ <div style='background:gray;width:100%;height:1px;'></div>
1195
+ <br />".gmdate( 'd', current_time( 'timestamp' ) - 86400 * $gg ) . '<br />' . gmdate( 'M', current_time( 'timestamp' ) - 86400 * $gg ) ."
1196
+ <div style='background:$ffffff;width:100%;height:2.2em;'>".$qry_visitors->total."<br />".$qry_pageviews->total."</div>
1197
+ <br clear=\"all\" /></div>
1198
+ </td>\n";
1199
+ } ?>
1200
+ </tr>
1201
+ </table>
1202
+ </div>
1203
+ &nbsp;※&nbsp;数値は
1204
+ &lt;上段&gt;がSPAM投稿したユニークIPアドレス数、&nbsp;&lt;下段&gt;が破棄したスパム投稿数<br />
1205
+
1206
+ <?php
1207
+ // wp_tsa_spam の ip_address カラムに存在するIP_ADDRESS投稿は無視するか
1208
+ $results = $wpdb->get_results(
1209
+ "SELECT D.cnt as cnt,E.ip_address as ip_address, D.ppd as post_date, E.error_type as error_type, E.author as author, E.comment as comment FROM
1210
+ ((select count(ip_address) as cnt, ip_address, max(post_date) as ppd, error_type, author, comment from $this->table_name
1211
+ WHERE post_date >= '". gmdate( 'Y-m-d', current_time( 'timestamp' ) - 86400 * $gdays )."'
1212
+ GROUP BY ip_address) as D INNER JOIN $this->table_name as E ON D.ip_address = E.ip_address AND D.ppd = E.post_date)
1213
+ ORDER BY post_date DESC"
1214
+ );
1215
+ ?>
1216
+ <h4>
1217
+ 過去
1218
+ <?php echo $gdays; ?>
1219
+ 日間に無視投稿されたIPアドレス
1220
+ </h4>
1221
+ <p>※IPアドレスをクリックすると特定のホストが存在するか確認し存在する場合は表示されます。</p>
1222
+ <p>「スパムデータから削除する」ボタンを押しますと該当IPアドレスのスパム投稿データが削除されます。テストしたあとの削除などに使用してください。</p>
1223
+ <?php if ( count( $results ) > 0 ) {
1224
+ $p_url = WP_PLUGIN_URL.'/'.str_replace( basename( __FILE__ ), '', plugin_basename( __FILE__ ) );
1225
+ wp_enqueue_script( 'jquery.tablesorter', $p_url.'js/jquery.tablesorter.min.js', array( 'jquery' ), FALSE );
1226
+ wp_enqueue_style( 'jquery.tablesorter', $p_url.'images/style.css' );
1227
+ wp_enqueue_style( 'thorows-spam-away-styles', $p_url.'css/tsa_data_styles.css' );
1228
+ ?>
1229
+ <script type="text/JavaScript">
1230
+ <!--
1231
+ jQuery(function() {
1232
+ jQuery('#spam_list').tablesorter({
1233
+ widgets: ['zebra'],
1234
+ headers: {
1235
+ 0: { id: "ipAddress" },
1236
+ 1: { sorter: "digit" },
1237
+ 2: { sorter: "shortDate" },
1238
+ 3: { sorter: false }
1239
+ }
1240
+ });
1241
+ });
1242
+
1243
+ function removeIpAddressOnData(ipAddressStr) {
1244
+ if (confirm('['+ipAddressStr+'] をスパムデータベースから削除します。よろしいですか?この操作は取り消せません')) {
1245
+ jQuery('#remove_ip_address').val(ipAddressStr);
1246
+ jQuery('#remove').submit();
1247
+ } else {
1248
+ return false;
1249
+ }
1250
+ }
1251
+
1252
+ function addIpAddressOnData(ipAddressStr) {
1253
+ if (confirm('['+ipAddressStr+'] を無視対象に追加します。よろしいですか?削除は設定から行ってください')) {
1254
+ jQuery('#add_ip_address').val(ipAddressStr);
1255
+ jQuery('#adding').submit();
1256
+ } else {
1257
+ return false;
1258
+ }
1259
+ }
1260
+ -->
1261
+ </script>
1262
+ <p><strong>投稿内容の判定</strong></p>
1263
+ ※最新1件のコメント内容はIPアドレスまたはエラー判定のリンク先を参照してください。
1264
+ <div id="spam_list_container">
1265
+ <div id="spam_list_div">
1266
+ <table id="spam_list" class="tablesorter">
1267
+ <colgroup class="cols0"></colgroup>
1268
+ <colgroup class="cols1"></colgroup>
1269
+ <colgroup class="cols2"></colgroup>
1270
+ <colgroup class="cols3"></colgroup>
1271
+ <colgroup class="cols4"></colgroup>
1272
+ <thead>
1273
+ <tr>
1274
+ <th class="cols0">IPアドレス</th>
1275
+ <th class="cols1">投稿数</th>
1276
+ <th class="cols2">最終投稿日時</th>
1277
+ <th class="cols3">スパムIP登録</th>
1278
+ <th class="cols4">エラー判定(最新)</th>
1279
+ </tr>
1280
+ </thead>
1281
+ <tbody>
1282
+ <?php
1283
+ foreach ( $results as $item ) {
1284
+ $spam_ip = $item->ip_address;
1285
+ $spam_cnt = $item->cnt;
1286
+ $last_post_date = $item->post_date;
1287
+ $spam_error_type = $item->error_type;
1288
+ $spam_author = strip_tags( $item->author );
1289
+ $spam_comment = strip_tags( $item->comment );
1290
+
1291
+ // エラー変換
1292
+ $spam_error_type_str = $spam_error_type;
1293
+ switch ( $spam_error_type ) {
1294
+ case 'not_japanese':
1295
+ $spam_error_type_str = '日本語以外';
1296
+ break;
1297
+ case 'must_word':
1298
+ $spam_error_type_str = '必須キーワード無し';
1299
+ break;
1300
+ case 'ng_word':
1301
+ $spam_error_type_str = 'NGキーワード混入';
1302
+ break;
1303
+ case 'block_ip':
1304
+ $spam_error_type_str = 'ブロック対象IPアドレス';
1305
+ break;
1306
+ case 'spam_champuru':
1307
+ $spam_error_type_str = 'すぱむちゃんぷるー';
1308
+ break;
1309
+ case 'spam_trackback':
1310
+ $spam_error_type_str = 'トラックバックスパム';
1311
+ break;
1312
+ case 'url_count_over':
1313
+ $spam_error_type_str = 'URL文字列混入数オーバー';
1314
+ break;
1315
+ case 'spam_limit_over':
1316
+ $spam_error_type_str = '一定時間スパム判定エラー';
1317
+ break;
1318
+ case 'dummy_param_field':
1319
+ $spam_error_type_str = 'ダミー項目エラー';
1320
+ break;
1321
+ }
1322
+ ?>
1323
+ <tr>
1324
+ <td>
1325
+ <b><a href="javascript:void(0);"
1326
+ onclick="window.open('<?php echo esc_attr( $p_url ); ?>hostbyip.php?ip=<?php esc_attr_e( $spam_ip ); ?>', 'hostbyip', 'width=350,height=500,scrollbars=no,location=no,menubar=no,toolbar=no,directories=no,status=no');"><?php esc_attr_e( $spam_ip ); ?>
1327
+ </a></b><br clear="all" />
1328
+ <input type="button"
1329
+ onclick="javascript:removeIpAddressOnData('<?php esc_attr_e( $spam_ip ); ?>');"
1330
+ value="スパムデータから削除する" />
1331
+ </td>
1332
+ <td><?php esc_attr_e( $spam_cnt ); ?>回</td>
1333
+ <td><?php esc_attr_e( $last_post_date ); ?></td>
1334
+ <td>
1335
+ <?php // if ( ! in_array( $spam_ip, $ip_list ) ) { ?>
1336
+ <input type="button"
1337
+ onclick="javascript:addIpAddressOnData('<?php esc_attr_e( $spam_ip ); ?>');"
1338
+ value="ブロック対象IPアドレス追加[<?php esc_attr_e( $spam_ip ); ?>]" />
1339
+ <?php /*} else { ?>
1340
+ ブロック対象IP
1341
+ <?php } */ ?>
1342
+ </td>
1343
+ <td>
1344
+ <a href="javascript:void(0);"
1345
+ onclick="window.open('<?php echo esc_attr( $p_url ); ?>hostbyip.php?ip=<?php esc_attr_e( $spam_ip ); ?>', 'hostbyip', 'width=350,height=500,scrollbars=no,location=no,menubar=no,toolbar=no,directories=no,status=no');"><?php esc_attr_e( $spam_error_type_str ); ?>
1346
+ </a>
1347
+ </td>
1348
+ </tr>
1349
+ <?php
1350
+ }
1351
+ ?>
1352
+ </tbody>
1353
+ </table>
1354
+ </div>
1355
+ </div>
1356
+ <?php } ?>
1357
+ <?php } else { ?>
1358
+ <p>スパムデータベースを使用するにはThrows SPAM Awayのメニュー「設定」から<br />
1359
+ 「スパムコメント投稿情報を保存しますか?」項目を<strong>「スパムコメント情報を保存する」</strong>に設定してください</p>
1360
+ <?php } ?>
1361
+ <form method="post" id="remove">
1362
+ <input type="hidden" name="ip_address" id="remove_ip_address" value="" />
1363
+ <input type="hidden" name="act" value="remove_ip" />
1364
+ </form>
1365
+ <form method="post" id="adding">
1366
+ <input type="hidden" name="ip_address" id="add_ip_address" value="" />
1367
+ <input type="hidden" name="act" value="add_ip" />
1368
+ </form>
1369
+ <p>スパム投稿IPアドレスを参考にアクセス禁止対策を行なってください。</p>
1370
+ </div>
1371
+ <br clear="all" />
1372
+ <?php
1373
+ }
1374
+
1375
+ /**
1376
+ * おすすめ設定ページ
1377
+ */
1378
+ function recommend_setting() {
1379
+ global $wpdb;
1380
+ ?>
1381
+ 制作中
1382
+ <?php
1383
+ }
1384
+
1385
+ }
trunk/throws_spam_away.php ADDED
@@ -0,0 +1,188 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Plugin Name: Throws SPAM Away
4
+ Plugin URI: http://gti.jp/tsa/
5
+ Description: コメント内に日本語の記述が存在しない場合はあたかも受け付けたように振る舞いながらも捨ててしまうプラグイン
6
+ Author: 株式会社ジーティーアイ さとう たけし
7
+ Version: 2.6.3
8
+ Author URI: http://gti.jp/
9
+ License: GPL2
10
+ */
11
+ /* Copyright 2014 Takeshi Satoh (http://gti.jp/)
12
+
13
+ This program is free software; you can redistribute it and/or modify
14
+ it under the terms of the GNU General Public License, version 2, as
15
+ published by the Free Software Foundation.
16
+
17
+ This program is distributed in the hope that it will be useful,
18
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20
+ GNU General Public License for more details.
21
+
22
+ You should have received a copy of the GNU General Public License
23
+ along with this program; if not, write to the Free Software
24
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25
+ */
26
+ require_once 'throws_spam_away.class.php';
27
+
28
+ /**
29
+ * 設定値一覧
30
+ * デフォルト設定
31
+ */
32
+
33
+ // Throws SPAM Awayバージョン
34
+ $tsa_version = '2.6.3';
35
+ // スパムデータベースバージョン
36
+ $tsa_db_version = 2.6; // 2.6からデータベース変更 [error_type]追加
37
+
38
+ // エラー種別
39
+ $error_type = '';
40
+
41
+ /** 初期設定 */
42
+ /**
43
+ * 設定値変更 2.6.2から
44
+ */
45
+
46
+ // ダミー項目でのスパム判定をするか
47
+ $default_dummy_param_field_flg = '1'; // 1: する 2:しない
48
+
49
+ // 日本語が存在しない場合無視対象とするか
50
+ $default_on_flg = 1; // 1:する
51
+
52
+ // 日本語文字最小含有数
53
+ $default_japanese_string_min_count = 3;
54
+
55
+ // 無視後、元画面に戻る時間
56
+ $default_back_second = 0;
57
+
58
+ // コメント欄下に表示される注意文言(初期設定)
59
+ $default_caution_msg = '日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)';
60
+
61
+ // コメント欄下に表示する位置(初期設定)1:コメント送信ボタンの上 2:コメント送信フォームの下
62
+ $default_caution_msg_point = '1'; //1:"comment_form", 2:"comment_form_after"
63
+
64
+ // エラー時に表示されるエラー文言(初期設定)
65
+ $default_error_msg = '日本語を規定文字数以上含まない記事は投稿できませんよ。';
66
+
67
+ /** URL文字列除外 設定 */
68
+ // URL数の制限をするか
69
+ $default_url_count_check_flg = '1'; // 1:する
70
+
71
+ // URL数の制限数
72
+ $default_ok_url_count = 3; // 3つまで許容
73
+
74
+ // URL数制限値オーバーのエラー文言(初期設定)
75
+ $default_url_count_over_error_msg = '';
76
+
77
+ /** NGキーワード/必須キーワード 制御設定 */
78
+
79
+ // キーワードNGエラー時に表示されるエラー文言(初期設定)
80
+ $default_ng_key_error_msg = 'NGキーワードが含まれているため投稿できません。';
81
+
82
+ // 必須キーワードが含まれないエラー文言(初期設定)
83
+ $default_must_key_error_msg = '必須キーワードが含まれていないため投稿できません。';
84
+
85
+ /** トラックバックへの対応設定 */
86
+
87
+ // トラックバックへの対応 1: する
88
+ $default_tb_on_flg = '1';
89
+
90
+ // トラックバック記事に当サイトURLがなければ無視するか
91
+ $default_tb_url_flg = '1';
92
+
93
+ /** 投稿IPアドレスによる制御設定 */
94
+
95
+ // スパムちゃんぷるーホスト
96
+ $spam_champuru_host = 'dnsbl.spam-champuru.livedoor.com';
97
+
98
+ // すぱむちゃんぷるー利用初期設定
99
+ $default_spam_champuru_flg = '1'; // "1":する
100
+
101
+ // WordPressのcommentsテーブルで「spam」判定されたことがあるIPアドレスからの投稿を無視するか
102
+ $default_ip_block_from_spam_chk_flg = '1'; // "1":する
103
+
104
+ // ブロックIPアドレスからの投稿の場合に表示されるエラー文言(初期設定)
105
+ $default_block_ip_address_error_msg = '';
106
+
107
+ /** スパムデータベース */
108
+
109
+ // スパムデータベース保存するか "1":保存
110
+ $default_spam_data_save = '1';
111
+
112
+ // 期間が過ぎたデータを削除するか? "1":する
113
+ $default_spam_data_delete_flg = '1';
114
+
115
+ // スパムデータ保持期間(日)
116
+ $default_spam_keep_day_count = 30;
117
+
118
+ // 最低保存期間(日)
119
+ $lower_spam_keep_day_count = 7;
120
+
121
+ // 機能設定
122
+ $default_spam_limit_flg = '1';
123
+
124
+ // ○分以内に○回スパムとなったら○分間そのIPからのコメントははじくかの設定
125
+ $default_spam_limit_flg = 1; // 1:する Other:しない ※スパム情報保存がデフォルトではないのでこちらも基本はしない方向です。
126
+ // ※スパム情報保存していないと機能しません。
127
+ $default_spam_limit_minutes = 10; // 10分以内に・・・
128
+ $default_spam_limit_count = 2; // 2回までは許そうか。
129
+ $default_spam_limit_over_interval = 10; // だがそれを超えたら(デフォルト3回目以降)10分はOKコメントでもスパム扱いするんでよろしく!
130
+ $default_spam_limit_over_interval_error_msg = ''; // そしてその際のエラーメッセージは・・・
131
+
132
+
133
+
134
+ /** オプションキー */
135
+ // ダミーフィールドを生成しそこに入力がある場合はエラーとするかフラグ [tsa_dummy_param_field_flg] 1:する 2:しない
136
+ // 日本語が存在しない時エラーとするかフラグ [tsa_on_flg] 1:する 2:しない
137
+ // 日本語文字列含有数 (入力値以下ならエラー) [tsa_japanese_string_min_count] 数値型
138
+ // 元の記事に戻ってくる時間(秒) [tsa_back_second] 数値型
139
+ // コメント欄の下に表示される注意文言 [tsa_caution_message] 文字列型
140
+ // コメント欄の下に表示される注意文言の位置 [tsa_caution_message_point] 文字列型("1" or "2")
141
+ // 日本語文字列規定値未満エラー時に表示される文言(元の記事に戻ってくる時間の間のみ表示)
142
+ // [tsa_error_message] 文字列型
143
+ // その他NGキーワード(日本語でも英語(その他)でもNGとしたいキーワードを半角カンマ区切りで複数設定できます。挙動は同じです。NGキーワードだけでも使用できます。)
144
+ // [tsa_ng_keywords] 文字列型(半角カンマ区切り文字列)
145
+ // NGキーワードエラー時に表示される文言(元の記事に戻ってくる時間の間のみ表示)
146
+ // [tsa_ng_key_error_message] 文字列型
147
+ // 必須キーワード(日本語でも英語(その他)でも必須としたいキーワードを半角カンマ区切りで複数設定できます。指定文字列を含まない場合はエラーとなります。※複数の方が厳しくなります。必須キーワードだけでも使用できます。)
148
+ // [tsa_must_keywords] 文字列型(半角カンマ区切り文字列)
149
+ // 必須キーワードエラー時に表示される文言(元の記事に戻ってくる時間の間のみ表示)
150
+ // [tsa_must_key_error_message] 文字列型
151
+ // この設定をトラックバック記事にも採用するか [tsa_tb_on_flg] 1:する 2:しない
152
+ // トラックバック記事にも採用する場合、ついでにこちらのURLが含まれているか判断するか
153
+ // [tsa_tb_url_flg] 1:する 2:しない
154
+ // WordPressのcommentsテーブルで「spam」判定されたことがあるIPアドレスからの投稿を無視するか
155
+ // [tsa_ip_block_from_spam_chk_flg] 1:する その他:しない
156
+ // ブロックしたいIPアドレスを任意で入力(半角カンマ区切りで複数設定できます。)
157
+ // [tsa_block_ip_addresses] 文字列型
158
+ // ブロック対象IPアドレスからの投稿時に表示される文言(元の記事に戻ってくる時間の間のみ表示)
159
+ // [tsa_block_ip_address_error_message] 文字列型
160
+ // URL(単純に'http'文字列のチェックのみ)文字列数を制限するか [tsa_url_count_on_flg] 1:する その他:しない
161
+ // URL(単純に'http'文字列のチェックのみ)文字列の許容数 [tsa_ok_url_count] 数値型
162
+ // URL(単純に'http'文字列のチェックのみ)文字列許容数オーバー時に表示される文言(元の記事に戻ってくる時間の間のみ表示)
163
+ // [tsa_url_count_over_error_message] 文字列型
164
+
165
+
166
+
167
+ /** プロセス */
168
+ $newThrowsSpamAway = new ThrowsSpamAway;
169
+ // トラックバックチェックフィルター
170
+ add_filter( 'preprocess_comment', array( &$newThrowsSpamAway, 'trackback_spam_away' ), 1, 1 );
171
+ // ダミーフィールド作成
172
+ $dummy_param_field_flg = get_option( 'tsa_dummy_param_field_flg', $default_dummy_param_field_flg );
173
+ if ( '1' == $dummy_param_field_flg ) {
174
+ add_action( 'init', array( &$newThrowsSpamAway, 'tsa_scripts_init' ), 9997 );
175
+ add_action( "comment_form", array(&$newThrowsSpamAway, "comment_form_dummy_param_field" ), 9998);
176
+ }
177
+ // 注意文言表示
178
+ // コメントフォーム表示
179
+ $comment_disp_point = 'comment_form';
180
+ $comment_form_action_point = get_option( 'tsa_caution_msg_point', $default_caution_msg_point );
181
+ // フォーム内かフォーム外か判断する
182
+ if ( '2' == $comment_form_action_point ) {
183
+ $comment_disp_point = 'comment_form_after';
184
+ }
185
+ add_action( $comment_disp_point, array( &$newThrowsSpamAway, 'comment_form' ), 9999 );
186
+ // コメントチェックフィルター
187
+ add_action( 'pre_comment_on_post', array( &$newThrowsSpamAway, 'comment_post' ), 1 );
188
+
trunk/uninstall.php ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Throws SPAM Awayプラグインアンインストール
4
+ 2.3 追加
5
+ 2.4 追記
6
+ 2.6 追記
7
+ */
8
+
9
+ if(!defined('ABSPATH') && !defined('WP_UNINSTALL_PLUGIN')) { exit(); }
10
+
11
+ delete_option('tsa_back_content_second'); // ver.1.6以下の方用
12
+ delete_option('tsa_on_flg');
13
+ delete_option('tsa_japanese_string_min_count');
14
+ delete_option('tsa_back_second');
15
+ delete_option('tsa_caution_message');
16
+ delete_option('tsa_error_message');
17
+ delete_option('tsa_ng_keywords');
18
+ delete_option('tsa_ng_key_error_message');
19
+ delete_option('tsa_must_keywords');
20
+ delete_option('tsa_must_key_error_message');
21
+ delete_option('tsa_tb_on_flg');
22
+ delete_option('tsa_tb_url_flg');
23
+ // ver.2.0
24
+ delete_option('tsa_ip_block_from_spam_chk_flg');
25
+ delete_option('tsa_block_ip_addresses');
26
+ delete_option('tsa_block_ip_address_error_message');
27
+ // ver.2.2
28
+ delete_option('tsa_url_count_on_flg');
29
+ delete_option('tsa_ok_url_count');
30
+ delete_option('tsa_url_count_over_error_message');
31
+ // ver.2.3
32
+ delete_option('tsa_meta_version');
33
+ delete_option('tsa_spam_data_save');
34
+ // ver.2.4
35
+ delete_option('tsa_spam_limit_flg');
36
+ delete_option('tsa_spam_limit_minutes');
37
+ delete_option('tsa_spam_limit_count');
38
+ delete_option('tsa_spam_limit_over_interval');
39
+ delete_option('tsa_spam_limit_over_interval_error_message');
40
+ // ver.2.5
41
+ delete_option('tsa_spam_champuru_flg');
42
+ delete_option('tsa_spam_keep_day_count');
43
+ delete_option('tsa_spam_data_delete_flg');
44
+ delete_option('tsa_white_ip_addresses');
45
+ // ver.2.5.1
46
+ delete_option('tsa_caution_msg_point');
47
+ // ver.2.6
48
+ delete_option('tsa_empty_param_field_flg');
49
+ delete_option('tsa_memo');