Throws SPAM Away - Version 2.4

Version Description

IP

IP

IPIP IP

IP IP

IP IP IP

601440 243 2424

IPIP IP

IP IP

Download this release

Release Info

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

Code changes from version 2.3.3 to 2.4

hostbyip.php CHANGED
@@ -1,8 +1,21 @@
1
  <?php
 
 
 
 
 
 
 
2
  /**
3
  * ホスト検索
4
  */
5
  $spam_ip = htmlspecialchars($_GET['ip']);
 
 
 
 
 
 
6
  ?>
7
  <!DOCTYPE html>
8
  <!--[if IE 8]>
@@ -22,11 +35,12 @@ window.onblur=function(){
22
  </head>
23
  <body>
24
  <div style="textalign: center;">
 
25
  <?php
26
  $spam_host = gethostbyaddr(htmlspecialchars($spam_ip));
27
  if ($spam_host != $spam_ip) {
28
  ?>
29
- 特定のホスト情報が見つかりました。<br />
30
  ↓↓↓<br />
31
 
32
  <h4><?php echo $spam_host; ?></h4>
@@ -34,12 +48,15 @@ Whois: <a href="http://whois.arin.net/rest/ip/<?php echo $spam_ip; ?>" target="_
34
  <?php
35
  } else {
36
  ?>
37
- 特定のホスト情報は見つかりませんでした。
38
  <?php
39
  }
40
  ?>
41
-
42
- <a href="javascript:void(0);" onclick="window.close();">閉じる</a>
 
 
 
43
  </div>
44
  </body>
45
  </html>
1
  <?php
2
+ /**
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';
9
  /**
10
  * ホスト検索
11
  */
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
  ?>
20
  <!DOCTYPE html>
21
  <!--[if IE 8]>
35
  </head>
36
  <body>
37
  <div style="textalign: center;">
38
+ <h2 style="background:#333; color:#fff;"><?php echo $spam_ip; ?></h2>
39
  <?php
40
  $spam_host = gethostbyaddr(htmlspecialchars($spam_ip));
41
  if ($spam_host != $spam_ip) {
42
  ?>
43
+ <h3 style="background: #666;color: #fff;">特定のホスト情報が見つかりました。</h3>
44
  ↓↓↓<br />
45
 
46
  <h4><?php echo $spam_host; ?></h4>
48
  <?php
49
  } else {
50
  ?>
51
+ <h3 style="background: #666;color: #fff;">このIPアドレスから特定のホスト情報は見つかりませんでした。</h3>
52
  <?php
53
  }
54
  ?>
55
+ <?php if ( $last_spam_comment_result != NULL ) { ?>
56
+ <div style="background: #999;color: #fff;margin:3px 0 0 0;">このIPからの最終投稿日時</div><?php echo $last_comment_date; ?><br />
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
+ <div style="text-align:right;"><a href="javascript:void(0);" onclick="window.close();">閉じる</a></div>
60
  </div>
61
  </body>
62
  </html>
images/asc.gif ADDED
Binary file
images/bg.gif ADDED
Binary file
images/desc.gif ADDED
Binary file
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
+ }
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);
readme.txt CHANGED
@@ -4,7 +4,7 @@ Donate link: http://gti.jp/
4
  Tags: comments, spam
5
  Requires at least: 3.1
6
  Tested up to: 3.5.1
7
- Stable tag: 2.3.2
8
 
9
  コメントに日本語が使用されていないものや任意のIPアドレスからの投稿を無視するプラグイン
10
 
@@ -25,9 +25,34 @@ Stable tag: 2.3.2
25
  リンクと思わしき'http'を含んだ文字列が許容数(初期設定は3つ)を超えて包含される場合にエラーとします。
26
 
27
  以前にスパムとしてチェックした投稿のIPアドレス及び、任意のIPアドレスでの制御も出来るようになっています。
28
- IPアドレスの指定は「,(半角カンマ)」区切りで複数入力できますが、「192.168.1.0/24」のようにIPアドレスの範囲指定も可能です。
29
  ※例:192.168.0.1,192.168.1.0/24,69.208.0.0/16 と指定した場合
30
   [192.168.0.1]と[192.168.1.0 ~ 192.168.1.255]と[69.208.0.0 ~ 69.208.255.255]のIPアドレスを拒否対象とします。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  ・バージョン2.3.1, 2.3.2 不具合修正 仕様は2.3のままです。
32
  ・バージョン2.3スパムコメント数を保持出来るようにしました。設定を変更しないと機能しませんのでご注意ください。
33
   保持データは下記の通り
@@ -88,6 +113,40 @@ e.g.
88
  == Screenshots ==
89
 
90
  == Changelog ==
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
91
  = 2.3.1, 2.3.2, 2.3.3 =
92
  不具合の修正をしました。ご迷惑をおかけいたしまして申し訳ありません。
93
  テーブルに書き込まれない不具合、テーブル読み込みの不具合を修正しました。
4
  Tags: comments, spam
5
  Requires at least: 3.1
6
  Tested up to: 3.5.1
7
+ Stable tag: 2.4
8
 
9
  コメントに日本語が使用されていないものや任意のIPアドレスからの投稿を無視するプラグイン
10
 
25
  リンクと思わしき'http'を含んだ文字列が許容数(初期設定は3つ)を超えて包含される場合にエラーとします。
26
 
27
  以前にスパムとしてチェックした投稿のIPアドレス及び、任意のIPアドレスでの制御も出来るようになっています。
28
+ IPアドレスの指定は「改行」区切りで複数入力できますが、「192.168.1.0/24」のようにIPアドレスの範囲指定も可能です。
29
  ※例:192.168.0.1,192.168.1.0/24,69.208.0.0/16 と指定した場合
30
   [192.168.0.1]と[192.168.1.0 ~ 192.168.1.255]と[69.208.0.0 ~ 69.208.255.255]のIPアドレスを拒否対象とします。
31
+
32
+ ・バージョン2.4
33
+  スパム情報収集機能を「スパムコメント情報を保存する」にした場合に限り、「一定時間内スパム認定機能」が作動するように出来ます。
34
+ この「○」を設定します→《○分以内に○回スパムとなったら○分間、当該IPからのコメントはスパム扱いする設定》
35
+ 例えば、「10分以内に2回スパムとなったら10分間、当該IPからのコメントはスパム扱いする」とした場合は
36
+ 過去(今から)10分前から今まで2回スパム扱いとなったIPからの投稿は3回目以降スパム扱いとなります。
37
+ そのため、10分以内に3回目のスパムを作ってしまったためそこから10分以上経過しないとずっとスパム扱いになってしまいます。
38
+ 今までのように「これは・・・・ダメ」「これは・・・・ダメ」「これは・・・・行けた!」「よっしゃーー!突っ込めー!」という風にはできなくなるということです。
39
+ 上記の例はデフォルト値ですが、「1時間(60分)以内に3回スパムになったら24時間(1440分)スパム扱い」という設定の場合は
40
+ 24時間以内に3回スパムがあったら・・・という設定とほぼ同等(完全に同等ではありませんが・・・)ですので
41
+ 24時間の方に合わせる形で24時間以内のスパム回数を算出するようにしています。(今後見直すかもしれません)
42
+ あまり長い時間を指定しますとコメント欄への反映が遅くなりますので気をつけてください。
43
+ 5~10分程度を推奨します。
44
+
45
+  スパム投稿の一覧を見やすくしました。
46
+   これまでスパム投稿情報の表示が日付が一覧で縦表示していたため見づらいものとなっておりました。
47
+   今回、横軸にその情報を追加しました。
48
+   また、スパム投稿リストの表示も改良し、IPアドレス・スパム投稿数・最終投稿日でソートを掛けられるようにしました。
49
+
50
+  IPアドレス指定を「カンマ区切り」から「改行区切り」へ変更。スパム投稿IPアドレス情報に下記データ追加
51
+ ○IPアドレス
52
+ ○ホスト名が特定出来た場合はホスト名
53
+ ○このIPアドレスからの最終投稿日時
54
+ ○このIPアドレスからスパム投稿を受けた記事(リンク)
55
+
56
  ・バージョン2.3.1, 2.3.2 不具合修正 仕様は2.3のままです。
57
  ・バージョン2.3スパムコメント数を保持出来るようにしました。設定を変更しないと機能しませんのでご注意ください。
58
   保持データは下記の通り
113
  == Screenshots ==
114
 
115
  == Changelog ==
116
+ = 2.4 =
117
+ 制御IPアドレスの入力方式を「カンマ区切り」から「改行」へ変更しました。
118
+ 従来のデータ(カンマ区切り)は自動的に改行区切りに変更されます。
119
+
120
+ スパム投稿の一覧を見やすくしました。
121
+   これまでスパム投稿情報の表示が日付が一覧で縦表示していたため見づらいものとなっておりました。
122
+   今回、横軸にその情報を追加しました。
123
+   また、スパム投稿リストの表示も改良し、IPアドレス・スパム投稿数・最終投稿日でソートを掛けられるようにしました。
124
+
125
+ スパムコメント情報のIP一覧からIPアドレスをクリックした際に表示していた情報を下記のようにしました。
126
+ ・IPアドレス
127
+ ・ホスト名が特定出来た場合はホスト名
128
+ ・このIPアドレスからの最終投稿日時
129
+ ・このIPアドレスからスパム投稿を受けた記事(リンク)
130
+
131
+ スパム情報収集機能を「スパムコメント情報を保存する」にした場合に限り、「一定時間内スパム認定機能」が作動するように出来ます。
132
+ この「○」を設定します→《○分以内に○回スパムとなったら○分間、当該IPからのコメントはスパム扱いする設定》
133
+ 例えば、「10分以内に2回スパムとなったら10分間、当該IPからのコメントはスパム扱いする」とした場合は
134
+ 過去(今から)10分前から今まで2回スパム扱いとなったIPからの投稿は3回目以降スパム扱いとなります。
135
+ そのため、10分以内に3回目のスパムを作ってしまったためそこから10分以上経過しないとずっとスパム扱いになってしまいます。
136
+ 今までのように「これは・・・・ダメ」「これは・・・・ダメ」「これは・・・・行けた!」「よっしゃーー!突っ込めー!」という風にはできなくなるということです。
137
+ 上記の例はデフォルト値ですが、「1時間(60分)以内に3回スパムになったら24時間(1440分)スパム扱い」という設定の場合は
138
+ 24時間以内に3回スパムがあったら・・・という設定とほぼ同等(完全に同等ではありませんが・・・)ですので
139
+ 24時間の方に合わせる形で24時間以内のスパム回数を算出するようにしています。(今後見直すかもしれません)
140
+ あまり長い時間を指定しますとコメント欄への反映が遅くなりますので気をつけてください。
141
+ 5~10分程度を推奨します。
142
+
143
+ IPアドレス指定を「カンマ区切り」から「改行区切り」へ変更。スパム投稿IPアドレス情報に下記データ追加
144
+ ○IPアドレス
145
+ ○ホスト名が特定出来た場合はホスト名
146
+ ○このIPアドレスからの最終投稿日時
147
+ ○このIPアドレスからスパム投稿を受けた記事(リンク)
148
+
149
+
150
  = 2.3.1, 2.3.2, 2.3.3 =
151
  不具合の修正をしました。ご迷惑をおかけいたしまして申し訳ありません。
152
  テーブルに書き込まれない不具合、テーブル読み込みの不具合を修正しました。
throws_spam_away.class.php ADDED
@@ -0,0 +1,1070 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ *
4
+ * <p>ThrowsSpamAway</p> Class
5
+ * WordPress's Plugin
6
+ * @author Takeshi Satoh@GTI Inc. 2013
7
+ *
8
+ */
9
+ class ThrowsSpamAway {
10
+
11
+ // version
12
+ var $version = '2.4';
13
+ var $table_name = "";
14
+
15
+ public function __construct($flg = FALSE) {
16
+ global $default_spam_data_save;
17
+ if ($flg == FALSE) {
18
+ add_action( 'admin_menu', array( $this, 'admin_menu' ) );
19
+ }
20
+ global $wpdb;
21
+ // 接頭辞(wp_)を付けてテーブル名を設定
22
+ $this->table_name = $wpdb->prefix . 'tsa_spam';
23
+ }
24
+
25
+ /**
26
+ * スパム投稿テーブル作成
27
+ * $flg がTRUEなら強制的にテーブル作成
28
+ */
29
+ function tsa_createTbl() {
30
+ global $wpdb;
31
+ global $tsa_db_version;
32
+
33
+ // テーブル作成要フラグ
34
+ $flg = FALSE;
35
+ if($wpdb->get_var("SHOW TABLES LIKE '$this->table_name'") != $this->table_name) {
36
+ // テーブルが存在しないため作成する
37
+ $flg = TRUE;
38
+ }
39
+
40
+ //DBのバージョン
41
+ //$tsa_db_version
42
+ //現在のDBバージョン取得
43
+ $installed_ver = get_option( 'tsa_meta_version', 0 );
44
+ // DBバージョンが低い または テーブルが存在しない場合は作成
45
+ if( $installed_ver < $tsa_db_version || $flg == TRUE) {
46
+ // DBバージョンは 2.3未満が存在しないためSQLはCREATE文のみ
47
+ $sql = "CREATE TABLE " . $this->table_name . " (
48
+ meta_id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
49
+ post_id bigint(20) UNSIGNED DEFAULT '0' NOT NULL,
50
+ ip_address text,
51
+ post_date timestamp,
52
+ UNIQUE KEY meta_id (meta_id)
53
+ )
54
+ CHARACTER SET 'utf8';";
55
+ require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
56
+ dbDelta( $sql );
57
+ //オプションにDBバージョン保存
58
+ update_option( 'tsa_meta_version', $tsa_db_version );
59
+ }
60
+ }
61
+
62
+ /**
63
+ * スパム投稿の記録
64
+ * @param string $post_id
65
+ * @param string $ip_address
66
+ */
67
+ function save_post_meta( $post_id, $ip_address ) {
68
+ if ( get_option('tsa_spam_data_save', $default_spam_data_save) != "1" ) return;
69
+
70
+ global $wpdb;
71
+
72
+ //保存するために配列にする
73
+ $set_arr = array(
74
+ 'post_id' => $post_id,
75
+ 'ip_address' => $ip_address
76
+ );
77
+
78
+ //レコード新規追加
79
+ $wpdb->insert( $this->table_name, $set_arr );
80
+ $wpdb->show_errors();
81
+ return;
82
+ }
83
+
84
+ function comment_form() {
85
+ global $default_caution_msg;
86
+ // 注意文言表示
87
+ $caution_msg = get_option( 'tsa_caution_message', $default_caution_msg );
88
+ echo '<div id="throwsSpamAway">'.$caution_msg.'</div>';
89
+ return TRUE;
90
+ }
91
+
92
+ function comment_post( $id ) {
93
+ global $newThrowsSpamAway;
94
+ global $user_ID;
95
+ global $default_back_second;
96
+ global $default_error_msg;
97
+ global $default_ng_key_error_msg;
98
+ global $default_must_key_error_msg;
99
+ global $default_block_ip_address_error_msg;
100
+ global $default_url_count_over_error_msg;
101
+ global $default_spam_limit_over_interval_error_msg;
102
+ global $error_type;
103
+
104
+ if( $user_ID ) {
105
+ return $id;
106
+ }
107
+ // コメント(comment)及び名前(author)の中も検査
108
+ $author = $_POST["author"];
109
+ $comment = $_POST["comment"];
110
+ // IP系の検査
111
+ $ip = $_SERVER['REMOTE_ADDR'];
112
+ if ( !$newThrowsSpamAway->ip_check( $ip ) ) {
113
+ // アウト!
114
+ } else
115
+ // コメント検査
116
+ if ( $newThrowsSpamAway->validation( $comment, $author ) ) {
117
+ return $id;
118
+ }
119
+ $error_msg = "";
120
+ switch ( $error_type ) {
121
+ case "must_word" :
122
+ $error_msg = get_option( 'tsa_must_key_error_message', $default_must_key_error_msg );
123
+ break;
124
+ case "ng_word" :
125
+ $error_msg = get_option( 'tsa_ng_key_error_message', $default_ng_key_error_msg );
126
+ break;
127
+ case "block_ip" :
128
+ $error_msg = get_option( 'tsa_block_ip_address_error_message', $default_block_ip_address_error_msg );
129
+ break;
130
+ case "url_count_over" :
131
+ $error_msg = get_option( 'tsa_url_count_over_error_message', $default_url_count_over_error_msg );
132
+ break;
133
+ case "spam_limit_over" :
134
+ $error_msg = get_option( 'tsa_spam_limit_over_interval_error_message', $default_spam_limit_over_interval_error_msg );
135
+ break;
136
+ default :
137
+ $error_msg = get_option( 'tsa_error_message', $default_error_msg );
138
+ }
139
+ // 記録する場合はDB記録
140
+ if ( get_option( 'tsa_spam_data_save', $default_spam_data_save ) == "1" ) $this->save_post_meta( $id, $ip );
141
+ // 元画面へ戻るタイム計算
142
+ $back_time = ( (int) get_option( 'tsa_back_second', $default_back_second ) ) * 1000;
143
+ // タイム値が0なら元画面へそのままリダイレクト
144
+ if ( $back_time == 0 ) {
145
+ header( "Location:".$_SERVER['HTTP_REFERER'] );
146
+ die;
147
+ } else {
148
+ wp_die( __($error_msg."<script type=\"text/javascript\">window.setTimeout(location.href='".$_SERVER['HTTP_REFERER']."', ".$back_time.");</script>", 'throws-spam-away'));
149
+ }
150
+ }
151
+
152
+ /**
153
+ * IPアドレスのチェックメソッド
154
+ * @param string $target_ip
155
+ */
156
+ function ip_check( $target_ip ) {
157
+ global $wpdb; // WordPress DBアクセス
158
+ global $newThrowsSpamAway;
159
+ global $error_type;
160
+ // IP制御 WordPressのスパムチェックにてスパム扱いしている投稿のIPをブロックするか
161
+ $ip_block_from_spam_chk_flg = get_option( 'tsa_ip_block_from_spam_chk_flg' );
162
+
163
+ if ($ip_block_from_spam_chk_flg === "1") {
164
+ // wp_commentsの comment_approved カラムが「spam」のIP_ADDRESSからの投稿は無視する
165
+ $results = $wpdb->get_results( "SELECT DISTINCT comment_author_IP FROM $wpdb->comments WHERE comment_approved = 'spam' ORDER BY comment_author_IP ASC " );
166
+ foreach ( $results as $item ) {
167
+ if ( trim( $item->comment_author_IP ) == trim( $target_ip ) ) {
168
+ // ブロックしたいIP
169
+ $error_type = "block_ip";
170
+ return FALSE;
171
+ }
172
+ }
173
+ }
174
+ // IP制御 任意のIPアドレスをあればブロックする
175
+ $block_ip_addresses = get_option( 'tsa_block_ip_addresses', "" );
176
+ if ( $block_ip_addresses != NULL && $block_ip_addresses != "" ) {
177
+ // 改行区切りの場合はカンマ区切りに文字列置換後リスト化
178
+ $block_ip_addresses = str_replace("\n", ",", $block_ip_addresses);
179
+ $ip_list = mb_split( ",", $block_ip_addresses );
180
+ foreach ( $ip_list as $ip ) {
181
+ // 指定IPが範囲指定の場合 例:192.168.1.0/24
182
+ if ( strpos( $ip, "/" ) != FALSE ) {
183
+ if ( $this->inCIDR( $target_ip, $ip ) ) {
184
+ // ブロックしたいIP
185
+ $error_type = "block_ip";
186
+ return FALSE;
187
+ }
188
+ } elseif ( trim( $ip ) == trim( $target_ip ) ) {
189
+ // ブロックしたいIP
190
+ $error_type = "block_ip";
191
+ return FALSE;
192
+ } else {
193
+ // セーフIP
194
+ }
195
+ }
196
+ }
197
+ return TRUE;
198
+ }
199
+
200
+ /**
201
+ * CIDRチェック
202
+ * @param string $ip
203
+ * @param string $cidr
204
+ * @return boolean
205
+ */
206
+ function inCIDR($ip, $cidr) {
207
+ list($network, $mask_bit_len) = explode('/', $cidr);
208
+ if ( !is_nan($mask_bit_len) && $mask_bit_len <= 32) {
209
+ $host = 32 - $mask_bit_len;
210
+ $net = ip2long($network) >> $host << $host; // 11000000101010000000000000000000
211
+ $ip_net = ip2long($ip) >> $host << $host; // 11000000101010000000000000000000
212
+ return $net === $ip_net;
213
+ } else {
214
+ // 形式が不正ならば無視するためFALSE
215
+ return FALSE;
216
+ }
217
+ }
218
+
219
+ /**
220
+ * 日本語が含まれているかチェックメソッド
221
+ * @param string $comment
222
+ * @param string $author
223
+ */
224
+ function validation( $comment, $author ) {
225
+ global $newThrowsSpamAway;
226
+ global $error_type;
227
+ global $default_url_count_check_flg; // URL数を制御するか初期設定値
228
+ global $default_ok_url_count; // 制限する場合のURL数初期設定値
229
+ global $default_japanese_string_min_count; // 日本語文字最小含有数
230
+
231
+ // Throws SPAM Away 起動フラグ "1":起動 "2":オフ
232
+ $tsa_on_flg = get_option( 'tsa_on_flg', "" );
233
+
234
+ // 一定時間制限チェック
235
+ // 一定時間内スパム認定機能<br />○分以内に○回スパムとなったら○分間、当該IPからのコメントはスパム扱いする設定+スパム情報保存
236
+
237
+ // ○分以内に○回スパムとなったら○分間そのIPからのコメントははじくかの設定
238
+ //$default_spam_limit_flg = 2; // 1:する 2:しない ※スパム情報保存がデフォルトではないのでこちらも基本はしない方向です。
239
+ // ※スパム情報保存していないと機能しません。
240
+ //$default_spam_limit_minutes = 60; // 60分(1時間)以内に・・・
241
+ //$default_spam_limit_count = 2; // 2回までは許そうか。
242
+ //$default_spam_limit_over_interval = 60; // だがそれを超えたら(デフォルト3回目以降)60分はOKコメントでもスパム扱いするんでよろしく!
243
+ // tsa_spam_limit_flg,tsa_spam_limit_minutes,tsa_spam_limit_count,tsa_spam_limit_over_interval,tsa_spam_limit_over_interval_error_message
244
+
245
+ // スパム情報保存フラグ
246
+ $tsa_spam_data_save = get_option( 'tsa_spam_data_save' );
247
+ // 一定時間制限チェック
248
+ $tsa_spam_limit_flg = get_option( 'tsa_spam_limit_flg', "" );
249
+ if ( $tsa_spam_data_save == "1" && $tsa_spam_limit_flg == "1" ) {
250
+ global $default_spam_limit_minutes;
251
+ global $default_spam_limit_over_interval;
252
+ global $default_spam_limit_count;
253
+ global $wpdb;
254
+ $tsa_spam_limit_minutes = intval(get_option( 'tsa_spam_limit_minutes', $default_spam_limit_minutes ) );
255
+ $tsa_spam_limit_over_interval = intval(get_option( 'tsa_spam_limit_over_interval', $default_spam_limit_over_interval ) );
256
+ // ○分以内(インターバルの方が長い場合はインターバル値を利用する)の同一IPからのスパム投稿回数を調べる
257
+ $interval_minutes = ($tsa_spam_limit_minutes >= $tsa_spam_limit_over_interval ? $tsa_spam_limit_minutes : $tsa_spam_limit_over_interval );
258
+
259
+ // 上記が○回を超えているかチェック
260
+ $ip = htmlspecialchars($_SERVER['REMOTE_ADDR']);
261
+ $this_ip_spam_cnt = "
262
+ SELECT ip_address, count(ppd) as spam_count, max(post_date)
263
+ FROM (select ip_address, post_date as ppd, post_date from $this->table_name) as A
264
+ WHERE A.ip_address = '".$ip."' AND
265
+ ppd >= '".gmdate('Y-m-d H:i:s', current_time('timestamp')-60 * $interval_minutes)."'
266
+ GROUP BY ip_address LIMIT 1";
267
+ $query = $wpdb->get_row( $this_ip_spam_cnt );
268
+ $spam_count = intval($query->spam_count);
269
+
270
+
271
+ // 最後のスパム投稿から○分超えていなければ アウト!!
272
+ $tsa_spam_limit_count = intval( get_option( 'tsa_spam_limit_count', $default_spam_limit_count ) );
273
+ if ( $spam_count > $tsa_spam_limit_count ) {
274
+ // アウト!
275
+ $error_type = "spam_limit_over";
276
+ return FALSE;
277
+ }
278
+ }
279
+ // まずはシングルバイトだけならエラー
280
+ if ($tsa_on_flg != "2" && strlen( bin2hex( $comment ) ) / 2 == mb_strlen( $comment ) ) {
281
+ return FALSE;
282
+ } else {
283
+ // 日本語文字列必須含有数
284
+ $tsa_japanese_string_min_count = intval( get_option( 'tsa_japanese_string_min_count', $default_japanese_string_min_count ) );
285
+ // NGキーワード文字列群
286
+ $tsa_ng_keywords = get_option( 'tsa_ng_keywords', "" );
287
+ // キーワード文字列群 ※ブラックリストと重複するものはブラックリストのほうが優先です。
288
+ $tsa_must_keywords = get_option( 'tsa_must_keywords', "" );
289
+ // URL数チェック
290
+ $tsa_url_count_check = get_option( 'tsa_url_count_on_flg', $default_url_count_check_flg );
291
+ // 許容URL数設定値
292
+ $tsa_ok_url_count = intval( get_option( 'tsa_ok_url_count', $default_ok_url_count ) ); // デフォルト値3(3つまで許容)
293
+
294
+ // OKフラグ
295
+ $flg = FALSE;
296
+ // マルチバイト文字が含まれている場合は日本語が含まれていればOK
297
+ if ($tsa_on_flg != "2") {
298
+ $count_flg = 0;
299
+ mb_regex_encoding('UTF-8');
300
+ $com_split = $newThrowsSpamAway->mb_str_split($comment);
301
+ foreach ($com_split as $it) {
302
+ if (preg_match('/[一-龠]+/u', $it)){
303
+ $count_flg += 1;
304
+ }
305
+ if (preg_match('/[ァ-ヶー]+/u', $it)){
306
+ $count_flg += 1;
307
+ }
308
+ if (preg_match('/[ぁ-ん]+/u', $it)){
309
+ $count_flg += 1;
310
+ }
311
+ }
312
+ $flg = ($tsa_japanese_string_min_count < $count_flg);
313
+ if ($flg == FALSE) {
314
+ return FALSE;
315
+ }
316
+ }
317
+ // 日本語文字列チェック抜けたらキーワードチェックを行う
318
+ if ( $tsa_ng_keywords != "" ) {
319
+ $keyword_list = mb_split( ",", $tsa_ng_keywords );
320
+ foreach ( $keyword_list as $key ) {
321
+ if ( preg_match('/'.trim($key)."/u", $author.$comment) ) {
322
+ $error_type = "ng_word";
323
+ return FALSE;
324
+ }
325
+ }
326
+ }
327
+ // キーワードチェック(ブラックリスト)を抜けたら必須キーワードチェックを行う
328
+ if ( $tsa_must_keywords != "" ) {
329
+ $keyword_list = mb_split( ",", $tsa_must_keywords );
330
+ foreach ( $keyword_list as $key ) {
331
+ if ( preg_match( '/'.trim($key)."/u", $author.$comment ) ) {
332
+ // OK
333
+ } else {
334
+ // 必須ワードがなかったためエラー
335
+ $error_type = "must_word";
336
+ return FALSE;
337
+ }
338
+ }
339
+ }
340
+ // 含有URL数チェック
341
+ if ( $tsa_url_count_check != "2" ) {
342
+ if ( substr_count( strtolower( $author.$comment ), 'http') > $tsa_ok_url_count) {
343
+ // URL文字列(httpの数)が多いエラー
344
+ $error_type = "url_count_over";
345
+ return FALSE;
346
+ }
347
+ }
348
+
349
+ return TRUE;
350
+ }
351
+ }
352
+
353
+ function mb_str_split( $string ) {
354
+ return preg_split( '/(?<!^)(?!$)/u', $string );
355
+ }
356
+
357
+ /**
358
+ * Callback admin_menu
359
+ */
360
+ function admin_menu() {
361
+ $mincap="level_8";
362
+ add_menu_page(__( 'Throws SPAM Away', $this->domain ), __( 'Throws SPAM Away', $this->domain ), $mincap, __FILE__, array( $this, 'options_page' ) );
363
+
364
+ // 従来通りスパムデータ保存しない場合はスルーする
365
+ if ( get_option( 'tsa_spam_data_save' ) != 1 ) {
366
+ // N/A
367
+ } else {
368
+ // プラグインアップデート時もチェックするため常に・・・
369
+ $this->tsa_createTbl(TRUE);
370
+ }
371
+
372
+ }
373
+
374
+ /**
375
+ * Admin options page
376
+ */
377
+ function options_page() {
378
+ global $wpdb; // WordPress DBアクセス
379
+ global $default_japanese_string_min_count;
380
+ global $default_caution_msg;
381
+ global $default_back_second;
382
+ global $default_error_msg;
383
+ global $default_ng_key_error_msg;
384
+ global $default_must_key_error_msg;
385
+ global $default_block_ip_address_error_msg;
386
+ global $default_url_count_over_error_msg;
387
+ global $default_ok_url_count;
388
+ global $default_spam_data_save;
389
+
390
+ global $default_spam_limit_minutes;
391
+ global $default_spam_limit_count;
392
+ global $default_spam_limit_over_interval;
393
+ global $default_spam_limit_over_interval_error_msg;
394
+
395
+ // 設定完了の場合はメッセージ表示
396
+ $_saved = FALSE;
397
+ if ( $_GET['settings-updated'] == "true" ) {
398
+ $_saved = TRUE;
399
+ }
400
+ ?>
401
+ <style>
402
+ table.form-table {
403
+
404
+ }
405
+
406
+ table.form-table th {
407
+ width: 200px;
408
+ }
409
+ </style>
410
+ <script type="text/Javascript">
411
+ // 配列重複チェック
412
+ var isDuplicate = function(ary, str) {
413
+ for (i = 0; i < ary.length; i++) {
414
+ if(str == ary[i]) {
415
+ return true;
416
+ }
417
+ }
418
+ return false;
419
+ };
420
+ function addIpAddresses(newAddressStr) {
421
+ // チェック用配列
422
+ var test_newAddress_list = newAddressStr.split(",");
423
+ var str = document.getElementById('tsa_block_ip_addresses').value;
424
+ // 現在の配列(テスト用)
425
+ str = str.replace(/\,/g, "\n");
426
+ var test_oldAddress_list = str.split("\n");
427
+
428
+ if (str.length > 0) { str += "\n"; }
429
+ if (newAddressStr.length > 0) {
430
+ newAddressStr = newAddressStr.replace(/\,/g, "\n");
431
+ }
432
+ str += newAddressStr;
433
+ str = str.replace(/\,/g, "\n");
434
+
435
+ var ary = str.split("\n");
436
+ var newAry = new Array;
437
+ var ret = "";
438
+
439
+ upd_flg = false;
440
+ upd_ip_str = "";
441
+ for ( var i=0; i < test_newAddress_list.length; i++) {
442
+ if (!isDuplicate(test_oldAddress_list, test_newAddress_list[i]) && test_newAddress_list[i] != "") {
443
+ upd_flg = true;
444
+ upd_ip_str = upd_ip_str + "・"+test_newAddress_list[i]+"\n";
445
+ }
446
+ }
447
+ if (upd_flg == true) {
448
+
449
+ for( var i=0 ; i < ary.length ; i++ ) {
450
+ if( !isDuplicate(newAry, ary[i]) && ary[i] != ""){
451
+ newAry.push(ary[i]);
452
+ }
453
+ }
454
+ document.getElementById('tsa_block_ip_addresses').value = newAry.join('\n');
455
+ alert('新たにIPアドレスを追加しました。\n'+upd_ip_str);
456
+ } else {
457
+ alert('指定されたIPアドレスは\nすでに追加されています。');
458
+ }
459
+ return false;
460
+ }
461
+ </script>
462
+ <div class="wrap">
463
+ <h2>Throws SPAM Away設定</h2>
464
+ <?php if ($_saved) { ?>
465
+ <div class="updated" style="padding: 10px; width: 50%;" id="message">設定の更新が完了しました。</div>
466
+ <?php } ?>
467
+ <form method="post" action="options.php">
468
+ <h3>スパム対策機能 設定</h3>
469
+ <?php wp_nonce_field('update-options'); ?>
470
+ <table class="form-table">
471
+ <tr valign="top">
472
+ <th scope="row">日本語が存在しない場合、無視対象とする<br />(日本語文字列が存在しない場合無視対象となります。)
473
+ </th>
474
+ <td><?php
475
+ $chk_1 = "";
476
+ $chk_2 = "";
477
+ if (get_option('tsa_on_flg', "1") == "2") {
478
+ $chk_2 = " checked=\"checked\"";
479
+ } else {
480
+ $chk_1 = " checked=\"checked\"";
481
+ }
482
+ ?> <label><input type="radio" name="tsa_on_flg"
483
+ value="1" <?php echo $chk_1;?> />&nbsp;する</label>&nbsp; <label><input
484
+ type="radio" name="tsa_on_flg" value="2" <?php echo $chk_2;?> />&nbsp;しない</label>
485
+ </td>
486
+ </tr>
487
+ <tr valign="top">
488
+ <th scope="row">日本語文字列含有数<br />(この文字列に達していない場合無視対象となります。)
489
+ </th>
490
+ <td><input type="text" name="tsa_japanese_string_min_count"
491
+ value="<?php echo get_option('tsa_japanese_string_min_count', $default_japanese_string_min_count); ?>" />
492
+ </td>
493
+ </tr>
494
+ <tr valign="top">
495
+ <th scope="row">元の記事に戻ってくる時間<br />(秒)※0の場合エラー画面表示しません。
496
+ </th>
497
+ <td><input type="text" name="tsa_back_second"
498
+ value="<?php echo get_option('tsa_back_second', $default_back_second);?>" />
499
+ </td>
500
+ </tr>
501
+ <tr valign="top">
502
+ <th scope="row">コメント欄の下に表示される注意文言</th>
503
+ <td><input type="text" name="tsa_caution_message" size="80"
504
+ value="<?php echo get_option('tsa_caution_message', $default_caution_msg);?>" /><br />(初期設定:<?php echo $default_caution_msg;?>)</td>
505
+ </tr>
506
+ <tr valign="top">
507
+ <th scope="row">日本語文字列規定値未満エラー時に表示される文言<br />(元の記事に戻ってくる時間の間のみ表示)
508
+ </th>
509
+ <td><input type="text" name="tsa_error_message" size="80"
510
+ value="<?php echo get_option('tsa_error_message', $default_error_msg);?>" /><br />(初期設定:<?php echo $default_error_msg;?>)</td>
511
+ </tr>
512
+ </table>
513
+ <h3>URL文字列除外 設定</h3>
514
+ <table class="form-table">
515
+ <tr valign="top">
516
+ <th scope="row">URLらしき文字列が混入している場合エラーとするか</th>
517
+ <td><?php
518
+ $chk_1 = "";
519
+ $chk_2 = "";
520
+ if (get_option('tsa_url_count_on_flg', "1") == "2") {
521
+ $chk_2 = " checked=\"checked\"";
522
+ } else {
523
+ $chk_1 = " checked=\"checked\"";
524
+ }
525
+ ?> <label><input type="radio"
526
+ name="tsa_url_count_on_flg" value="1" <?php echo $chk_1;?> />&nbsp;する</label>&nbsp;
527
+ <label><input type="radio" name="tsa_url_count_on_flg" value="2"
528
+ <?php echo $chk_2;?> />&nbsp;しない</label><br /> する場合の制限数(入力数値まで許容):<input
529
+ type="text" name="tsa_ok_url_count" size="2"
530
+ value="<?php echo get_option('tsa_ok_url_count', $default_ok_url_count);?>" />
531
+ </td>
532
+ </tr>
533
+ <tr valign="top">
534
+ <th scope="row">URLらしき文字列混入数オーバーエラー時に表示される文言 (元の記事に戻ってくる時間の間のみ表示)</th>
535
+ <td><input type="text" name="tsa_url_count_over_error_message"
536
+ size="80"
537
+ value="<?php echo get_option('tsa_url_count_over_error_message', $default_url_count_over_error_msg);?>" /><br />(初期設定:<?php echo $default_url_count_over_error_msg;?>)</td>
538
+ </tr>
539
+ </table>
540
+ <h3>NGキーワード / 必須キーワード 制御設定</h3>
541
+ <table class="form-table">
542
+ <tr valign="top">
543
+ <th scope="row">その他NGキーワード<br />(日本語でも英語(その他)でもNGとしたいキーワードを半角カンマ区切りで複数設定できます。<br />挙動は同じです。NGキーワードだけでも使用できます。)
544
+ </th>
545
+ <td><input type="text" name="tsa_ng_keywords" size="80"
546
+ value="<?php echo get_option('tsa_ng_keywords', "");?>" /></td>
547
+ </tr>
548
+ <tr valign="top">
549
+ <th scope="row">NGキーワードエラー時に表示される文言<br />(元の記事に戻ってくる時間の間のみ表示)
550
+ </th>
551
+ <td><input type="text" name="tsa_ng_key_error_message" size="80"
552
+ value="<?php echo get_option('tsa_ng_key_error_message', $default_ng_key_error_msg);?>" /><br />(初期設定:<?php echo $default_ng_key_error_msg;?>)</td>
553
+ </tr>
554
+ <tr valign="top">
555
+ <th scope="row">その上での必須キーワード<br />(日本語でも英語(その他)でも必須としたいキーワードを半角カンマ区切りで複数設定できます。<br />指定文字列を含まない場合はエラーとなります。※複数の方が厳しくなります。<br />必須キーワードだけでも使用できます。)
556
+ </th>
557
+ <td><input type="text" name="tsa_must_keywords" size="80"
558
+ value="<?php echo get_option('tsa_must_keywords', "");?>" /></td>
559
+ </tr>
560
+ <tr valign="top">
561
+ <th scope="row">必須キーワードエラー時に表示される文言<br />(元の記事に戻ってくる時間の間のみ表示)
562
+ </th>
563
+ <td><input type="text" name="tsa_must_key_error_message" size="80"
564
+ value="<?php echo get_option('tsa_must_key_error_message', $default_must_key_error_msg);?>" /><br />(初期設定:<?php echo $default_must_key_error_msg;?>)</td>
565
+ </tr>
566
+ </table>
567
+ <h3>トラックバックへの対応設定</h3>
568
+ <table class="form-table">
569
+ <tr valign="top">
570
+ <th scope="row">上記設定をトラックバック記事にも採用する</th>
571
+ <td><?php
572
+ $chk_1 = "";
573
+ $chk_2 = "";
574
+ if (get_option('tsa_tb_on_flg', "2") == "2") {
575
+ $chk_2 = " checked=\"checked\"";
576
+ } else {
577
+ $chk_1 = " checked=\"checked\"";
578
+ }
579
+ ?> <label><input type="radio" name="tsa_tb_on_flg"
580
+ value="1" <?php echo $chk_1;?> />&nbsp;する</label>&nbsp; <label><input
581
+ type="radio" name="tsa_tb_on_flg" value="2" <?php echo $chk_2;?> />&nbsp;しない</label>
582
+ </td>
583
+ </tr>
584
+ <tr valign="top">
585
+ <th scope="row">トラックバック記事にも採用する場合、ついでにこちらのURLが含まれているか判断する<br />(初期設定:「しない」)
586
+ </th>
587
+ <td><?php
588
+ $chk_1 = "";
589
+ $chk_2 = "";
590
+ if (get_option('tsa_tb_url_flg', "2") == "2") {
591
+ $chk_2 = " checked=\"checked\"";
592
+ } else {
593
+ $chk_1 = " checked=\"checked\"";
594
+ }
595
+ ?> <label><input type="radio" name="tsa_tb_url_flg"
596
+ value="1" <?php echo $chk_1;?> />&nbsp;する</label>&nbsp; <label><input
597
+ type="radio" name="tsa_tb_url_flg" value="2" <?php echo $chk_2;?> />&nbsp;しない</label>
598
+ </td>
599
+ </tr>
600
+ </table>
601
+ <h3>投稿IPアドレスによる制御設定</h3>
602
+ <table class="form-table">
603
+ <tr valign="top">
604
+ <th scope="row">WordPressのコメントで「スパム」にしたIPからの投稿にも採用する</th>
605
+ <td><?php
606
+ $chk = "";
607
+ if (get_option('tsa_ip_block_from_spam_chk_flg', "") == "1") {
608
+ $chk = "checked=\"checked\"";
609
+ }
610
+ ?> <label><input type="checkbox"
611
+ name="tsa_ip_block_from_spam_chk_flg" value="1"
612
+ <?php echo $chk; ?> />&nbsp;スパム投稿設定したIPアドレスからの投稿も無視する</label><br />
613
+ <?php
614
+ // wp_commentsの comment_approved カラムが「spam」のIP_ADDRESSからの投稿は無視する
615
+ $results = $wpdb->get_results("SELECT DISTINCT comment_author_IP FROM $wpdb->comments WHERE comment_approved = 'spam' ORDER BY comment_author_IP ASC ");
616
+ ?>現在「spam」フラグが付いているIPアドレス:<br />
617
+ <blockquote>
618
+ <?php
619
+ $add_ip_addresses = "";
620
+ foreach ($results as $item) {
621
+ $spam_ip = $item->comment_author_IP;
622
+ // ブロックしたいIP
623
+ if ( strlen( $add_ip_addresses ) > 0 ) {
624
+ $add_ip_addresses .= ",";
625
+ }
626
+ $add_ip_addresses .= $spam_ip;
627
+ ?>
628
+ <b><?php echo $spam_ip; ?> </b><br />
629
+ <?php
630
+ }
631
+ ?>
632
+ &nbsp;<input type="button"
633
+ onclick="javascript:addIpAddresses('<?php echo $add_ip_addresses; ?>');"
634
+ value="これらのIPアドレスを任意のブロック対象IPアドレスにコピーする" /><br />
635
+ </blockquote>
636
+ </td>
637
+ </tr>
638
+ <tr valign="top">
639
+ <th scope="row">任意のIPアドレスからの投稿も無視したい場合、対象となるIPアドレスを記述してください。<br />改行区切りで複数設定できます。(半角数字とスラッシュ、ドットのみ)<br />※カンマは自動的に改行に変換されます
640
+ </th>
641
+ <td><textarea name="tsa_block_ip_addresses"
642
+ id="tsa_block_ip_addresses" cols="80" rows="10"><?php echo get_option('tsa_block_ip_addresses', "");?></textarea></td>
643
+ </tr>
644
+ <tr valign="top">
645
+ <th scope="row">ブロック対象のIPアドレスからの投稿時に表示される文言<br />(元の記事に戻ってくる時間の間のみ表示)
646
+ </th>
647
+ <td><input type="text" name="tsa_block_ip_address_error_message"
648
+ size="80"
649
+ 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>
650
+ </tr>
651
+ </table>
652
+ <h3>スパムデータベース</h3>
653
+ <table class="form-table">
654
+ <tr valign="top">
655
+ <th scope="row">スパムコメント投稿情報を保存しますか?</th>
656
+ <td><?php
657
+ $chk = "";
658
+ if (get_option('tsa_spam_data_save', "") == "1") {
659
+ $chk = "checked=\"checked\"";
660
+ }
661
+ ?> <label><input type="checkbox"
662
+ name="tsa_spam_data_save" value="1" <?php echo $chk; ?> />&nbsp;スパムコメント情報を保存する</label><br />※Throws
663
+ SPAM Away設定画面表示時に時間がかかることがあります。<br />※「保存する」を解除した場合でもテーブルは残りますので30日以内の取得データは表示されます。
664
+ </td>
665
+ </tr>
666
+ <tr valign="top">
667
+ <th scope="row" colspan="2">一定時間内スパム認定機能<br />○分以内に○回スパムとなったら○分間、当該IPからのコメントはスパム扱いする設定<br />
668
+ <b>※一定時間以内にスパム投稿された回数を測定していますので「スパムコメント情報を保存する」機能がオフの場合は機能しません。</b>
669
+ </th>
670
+ </tr>
671
+ <tr>
672
+ <th scope="row">機能設定</th>
673
+ <td><?php
674
+ $chk = "";
675
+ if (get_option('tsa_spam_limit_flg', "") == "1") {
676
+ $chk = "checked=\"checked\"";
677
+ }
678
+ ?> <label><input type="checkbox" name="tsa_spam_limit_flg" value="1"
679
+ <?php echo $chk; ?> />&nbsp;機能させる</label><br /> 一定時間:<input
680
+ type="text" name="tsa_spam_limit_minutes" size="3"
681
+ value="<?php echo get_option('tsa_spam_limit_minutes', $default_spam_limit_minutes); ?>" />分以内に
682
+ 一定回数:<input type="text" name="tsa_spam_limit_count" size="3"
683
+ value="<?php echo get_option('tsa_spam_limit_count', $default_spam_limit_count); ?>" />回スパムとなったら<b>次から</b>
684
+ 一定時間:<input type="text" name="tsa_spam_limit_over_interval" size="3"
685
+ value="<?php echo get_option('tsa_spam_limit_over_interval', $default_spam_limit_over_interval); ?>" />分間<br />
686
+ 当該IPアドレスからのコメントを強制スパム扱いします。<br /> エラーメッセージは:<input type="text"
687
+ name="tsa_spam_limit_over_interval_error_message" size="80"
688
+ value="<?php echo get_option('tsa_spam_limit_over_interval_error_message', $default_spam_limit_over_interval_error_msg); ?>" /><br />
689
+ (初期設定:<?php echo $default_spam_limit_over_interval_error_msg; ?>)
690
+ </td>
691
+ </tr>
692
+ </table>
693
+
694
+ <input type="hidden" name="action" value="update" /> <input
695
+ type="hidden" name="page_options"
696
+ value="tsa_on_flg,tsa_japanese_string_min_count,tsa_back_second,tsa_caution_message,tsa_error_message,tsa_ng_keywords,tsa_ng_key_error_message,tsa_must_keywords,tsa_must_key_error_message,tsa_tb_on_flg,tsa_tb_url_flg,tsa_block_ip_addresses,tsa_ip_block_from_spam_chk_flg,tsa_block_ip_address_error_message,tsa_url_count_on_flg,tsa_ok_url_count,tsa_url_count_over_error_message,tsa_spam_data_save,tsa_spam_limit_flg,tsa_spam_limit_minutes,tsa_spam_limit_count,tsa_spam_limit_over_interval,tsa_spam_limit_over_interval_error_message" />
697
+ <p class="submit">
698
+ <input type="submit" class="button-primary"
699
+ value="<?php _e('Save Changes') ?>" />
700
+ </p>
701
+
702
+ <?php
703
+ if ( get_option( 'tsa_spam_data_save' ) == "1" ) {
704
+ // 日数
705
+ $gdays = 30;
706
+ // 表カラー
707
+ $unique_color="#114477";
708
+ $web_color="#3377B6";
709
+ ?>
710
+ <h3>スパム投稿30日間の推移</h3>
711
+ <div class="clear"></div>
712
+
713
+ <div class="clear" style="background-color: #efefef;">
714
+ <table style="width: 100%; border: none;">
715
+ <tr>
716
+ <?php
717
+ $total_qry = "
718
+ SELECT count(ppd) as pageview, ppd
719
+ FROM (select ip_address, SUBSTRING(post_date,1,10) as ppd from $this->table_name) as A
720
+ GROUP BY ppd HAVING ppd >= '".gmdate('Y-m-d', current_time('timestamp')-86400*$gdays)."'
721
+ ORDER BY pageview DESC
722
+ LIMIT 1
723
+ ";
724
+ $qry = $wpdb->get_row($total_qry);
725
+ $maxxday=$qry->pageview;
726
+
727
+ $total_vis = "
728
+ SELECT count(distinct ip_address) as vis, ppd
729
+ FROM (select ip_address, SUBSTRING(post_date,1,10) as ppd from $this->table_name) as B
730
+ GROUP BY ppd HAVING ppd >= '" . gmdate( 'Y-m-d', current_time( 'timestamp' ) - 86400 * $gdays ) . "'
731
+ ORDER BY vis DESC
732
+ LIMIT 1
733
+ ";
734
+ $qry_vis = $wpdb->get_row($total_vis);
735
+ $maxxday += $qry_vis->vis;
736
+
737
+ if ( $maxxday == 0 ) {
738
+ $maxxday = 1;
739
+ }
740
+
741
+ // Y
742
+ $gd = ( 100 / $gdays ).'%';
743
+ for ( $gg = $gdays - 1; $gg >= 0; $gg-- ) {
744
+ // TOTAL SPAM COUNT
745
+ $visitor_qry = "
746
+ SELECT count(DISTINCT ip_address) AS total
747
+ FROM (select ip_address, SUBSTRING(post_date,1,10) as ppd from $this->table_name) as B
748
+ WHERE ppd = '".gmdate('Y-m-d', current_time('timestamp')-86400*$gg)."'
749
+ ";
750
+ $qry_visitors = $wpdb->get_row($visitor_qry);
751
+ $px_visitors = round($qry_visitors->total*100/$maxxday);
752
+ // TOTAL
753
+ $pageview_qry = "
754
+ SELECT count(ppd) as total
755
+ FROM (select ip_address, SUBSTRING(post_date,1,10) as ppd from $this->table_name) as C
756
+ WHERE ppd = '".gmdate('Y-m-d', current_time('timestamp')-86400*$gg)."'
757
+ ";
758
+ $qry_pageviews = $wpdb->get_row($pageview_qry);
759
+ $px_pageviews = round($qry_pageviews->total*100/$maxxday);
760
+ $px_white = 100 - $px_pageviews - $px_visitors;
761
+ if ($px_white < 0) {
762
+ $px_white = 0;
763
+ }
764
+
765
+ print '<td width="'.$gd.'" valign="bottom"';
766
+ if($start_of_week == gmdate('w',current_time('timestamp')-86400*$gg)) {
767
+ print ' style="border-left:2px dotted gray;"';
768
+ } # week-cut
769
+ print "><div style='float:left;width:100%;font-family:Helvetica;font-size:7pt;text-align:center;border-right:1px solid white;color:black;'>
770
+ <div style='background:#ffffff;width:100%;height:".$px_white."px;'></div>
771
+ <div style='background:$unique_color;width:100%;height:".$px_visitors."px;' title='".$qry_visitors->total." ip_addresses'></div>
772
+ <div style='background:$web_color;width:100%;height:".$px_pageviews."px;' title='".$qry_pageviews->total." spam comments'></div>
773
+ <div style='background:gray;width:100%;height:1px;'></div>
774
+ <br />".gmdate('d', current_time('timestamp')-86400*$gg) . ' ' . gmdate('M', current_time('timestamp')-86400*$gg) ."
775
+ <div style='background:$ffffff;width:100%;height:2.2em;'>".$qry_visitors->total."<br />".$qry_pageviews->total."</div>
776
+ <br clear=\"all\" /></div>
777
+ </td>\n";
778
+ }
779
+ ?>
780
+ </tr>
781
+ </table>
782
+ </div>
783
+ &nbsp;※&nbsp;数値は
784
+ &lt;上段&gt;がSPAM投稿したユニークIPアドレス数、&nbsp;&lt;下段&gt;が破棄したスパム投稿数<br />
785
+ <div class="clear">
786
+ <?php
787
+ // wp_tsa_spam の ip_address カラムに存在するIP_ADDRESS投稿は無視するか
788
+ $results = $wpdb->get_results(
789
+ "SELECT count(ip_address) as cnt,ip_address,max(ppd) as post_date FROM (select ip_address, SUBSTRING(post_date,1,10) as ppd from $this->table_name) as D
790
+ WHERE ppd >= '". gmdate( 'Y-m-d', current_time( 'timestamp' ) - 86400 * $gdays )."'
791
+ GROUP BY ip_address
792
+ ORDER BY cnt DESC"
793
+ );
794
+ ?>
795
+ <h4>
796
+ 過去
797
+ <?php echo $gdays; ?>
798
+ 日間に無視投稿されたIPアドレス
799
+ </h4>
800
+ <p>
801
+ ※「このIPアドレスを任意のブロック対象IPアドレスにコピーする」ボタンを押した場合は上の<b>「変更を保存」</b>をクリックし内容を保存してください。
802
+ </p>
803
+ <p>※IPアドレスをクリックすると特定のホストが存在するか確認し存在する場合は表示されます。</p>
804
+ <?php if ( count( $results ) > 0 ) {
805
+ $p_url = WP_PLUGIN_URL.'/'.str_replace(basename( __FILE__),"",plugin_basename(__FILE__));
806
+ wp_enqueue_script("jquery.tablesorter", $p_url."js/jquery.tablesorter.min.js", array('jquery'), FALSE);
807
+ wp_enqueue_style("jquery.tablesorter", $p_url."images/style.css");
808
+ ?>
809
+ <style type="text/css">
810
+ <!--
811
+ /** ------ lightbox風 ----- */
812
+ #kotak-dialog {
813
+ position:absolute;
814
+ top:20%;
815
+ left:50%;
816
+ margin:0px 0px 0px -200px;
817
+ width:400px;
818
+ height:auto;
819
+ background-color:#fff;
820
+ -webkit-box-shadow:0px 1px 2px rgba(0,0,0,0.4);
821
+ -moz-box-shadow:0px 1px 2px rgba(0,0,0,0.4);
822
+ box-shadow:0px 1px 2px rgba(0,0,0,0.4);
823
+ z-index:1000;
824
+ display:none;
825
+ }
826
+
827
+ #kotak-dialog *:focus {
828
+ outline:none;
829
+ }
830
+
831
+ #kotak-dialog h3.title {
832
+ background-color:#3B5998;
833
+ padding:10px 15px;
834
+ color:#fff;
835
+ font:normal 16px Arial,Sans-Serif;
836
+ margin:0px 0px 0px 0px;
837
+ position:relative;
838
+ }
839
+
840
+ #kotak-dialog h3.title a {
841
+ position:absolute;
842
+ top:10px;
843
+ right:15px;
844
+ color:#fff;
845
+ text-decoration:none;
846
+ cursor:pointer;
847
+ }
848
+
849
+ #kotak-dialog .isi-dialog {
850
+ margin:15px;
851
+ font:normal 12px Arial,Sans-Serif;
852
+ }
853
+
854
+ #kotak-dialog .button-wrapper {
855
+ padding:10px 15px 0px;
856
+ border-top:1px solid #ddd;
857
+ margin-top:15px;
858
+ }
859
+
860
+ #kotak-dialog .button-wrapper button {
861
+ background-color:#FF0C39;
862
+ border:none;
863
+ font:bold 12px Arial,Sans-Serif;
864
+ color:#fff;
865
+ padding:5px 10px;
866
+ -webkit-border-radius:3px;
867
+ -moz-border-radius:3px;
868
+ border-radius:3px;
869
+ cursor:pointer;
870
+ }
871
+
872
+ #kotak-dialog .button-wrapper button:hover {
873
+ background-color:#aaa;
874
+ }
875
+
876
+ #dialog-overlay {
877
+ position:fixed !important;
878
+ position:absolute;
879
+ z-index:999;
880
+ top:0px;
881
+ right:0px;
882
+ bottom:0px;
883
+ left:0px;
884
+ background-color:#000;
885
+ display:none;
886
+ }
887
+
888
+
889
+ /* Iframe */
890
+ #iframeContainer iframe {
891
+ width:100%;
892
+ height:300px;
893
+ border:none;
894
+ background-color:#ccc;
895
+ overflow:auto;
896
+ }
897
+ /** ------ /lightbox風 ----- */
898
+
899
+ /** スクロール対象テーブルCSS */
900
+ #spam_list {
901
+ background-color: #ffffff;
902
+ border-collapse:;
903
+ font-size: 1em !important;
904
+ }
905
+ /** 全体container */
906
+ #spam_list_container {
907
+ position: relative;
908
+ padding-top: 26px;
909
+ width: 826px; /* 列幅合計+セル間の幅(2px)の合計+20px */
910
+ border: 1px solid #3377b6;
911
+ background-color: #ffffff;
912
+ }
913
+ /** tbody スクロール対象 */
914
+ #spam_list_div {
915
+ overflow: auto;
916
+ height: 500px;
917
+ }
918
+
919
+ #spam_list thead tr {
920
+ position: absolute;
921
+ top: 0;
922
+ left: 0;
923
+ background-color: #ffffff;
924
+ }
925
+ #spam_list thead tr th {
926
+ background-color: #3377b6;
927
+ color: #fff;
928
+ padding: 3px 0px;
929
+ }
930
+ #spam_list tbody tr td {
931
+ background-color: #efefef;
932
+ color: black;
933
+ padding: 3px 6px;
934
+ }
935
+ #spam_list tbody tr.odd td {
936
+ background-color:#F0F0F6;
937
+ }
938
+
939
+ .cols0 { width: 200px; }
940
+ .cols1 { width: 100px; }
941
+ .cols2 { width: 100px; }
942
+ .cols3 { width: 400px; }
943
+
944
+ -->
945
+ </style>
946
+ <script type="text/JavaScript">
947
+ <!--
948
+ jQuery(function() {
949
+ jQuery('#spam_list').tablesorter({
950
+ widgets: ['zebra'],
951
+ headers: {
952
+ 0: {id:"ipAddress"},
953
+ 3: {sorter:false},
954
+ 2: { sorter: "shortDate" }
955
+ }
956
+ });
957
+
958
+ });
959
+ -->
960
+ </script>
961
+ <div id="spam_list_container">
962
+ <div id="spam_list_div">
963
+ <table id="spam_list" class="tablesorter">
964
+ <colgroup class="cols0"></colgroup>
965
+ <colgroup class="cols1"></colgroup>
966
+ <colgroup class="cols2"></colgroup>
967
+ <colgroup class="cols3"></colgroup>
968
+ <thead>
969
+ <tr>
970
+ <th class="cols0">IPアドレス</th>
971
+ <th class="cols1">投稿数</th>
972
+ <th class="cols2">最終投稿日</th>
973
+ <th class="cols3">スパムIP登録</th>
974
+ </tr>
975
+ </thead>
976
+ <tbody>
977
+ <?php
978
+ foreach ($results as $item) {
979
+ $spam_ip = $item->ip_address;
980
+ $spam_cnt = $item->cnt;
981
+ $last_post_date = $item->post_date;
982
+ ?>
983
+ <tr>
984
+ <td>
985
+ <b><a href="javascript:void(0);"
986
+ onclick="window.open('<?php echo $p_url; ?>hostbyip.php?ip=<?php echo $spam_ip; ?>', 'hostbyip', 'width=350,height=250,scrollbars=no,location=no,menubar=no,toolbar=no,directories=no,status=no');"><?php echo $spam_ip; ?>
987
+ </a></b>
988
+ </td>
989
+ <td><?php echo $spam_cnt; ?>回</td>
990
+ <td><?php echo $last_post_date; ?></td>
991
+ <td>&nbsp;<input type="button"
992
+ onclick="javascript:addIpAddresses('<?php echo $spam_ip; ?>');"
993
+ value="このIPアドレスを任意のブロック対象IPアドレスにコピーする" /></td>
994
+ </tr>
995
+ <?php
996
+ }
997
+ ?>
998
+ </tbody>
999
+ </table>
1000
+ <?php } ?>
1001
+ </div>
1002
+ </div>
1003
+ </div>
1004
+ <?php } ?>
1005
+ </form>
1006
+ <p>スパム投稿IPアドレスを参考にアクセス禁止対策を行なってください。</p>
1007
+ <div class="clear"></div>
1008
+
1009
+ </div>
1010
+
1011
+ <?php
1012
+ }
1013
+
1014
+ function trackback_spam_away($tb) {
1015
+ global $newThrowsSpamAway;
1016
+
1017
+ $tsa_tb_on_flg = get_option( 'tsa_tb_on_flg' );
1018
+ $tsa_tb_url_flg = get_option( 'tsa_tb_url_flg' );
1019
+ $siteurl = get_option('siteurl');
1020
+ // トラックバック OR ピンバック時にフィルタ発動
1021
+ if ( $tsa_tb_on_flg == "2" || ( $tb['comment_type'] != 'trackback' && $tb['comment_type'] != 'pingback' ) ) return $tb;
1022
+
1023
+ // SPAMかどうかフラグ
1024
+ $tb_val['is_spam'] = FALSE;
1025
+
1026
+ // コメント判定
1027
+ $author = $tb["comment_author"];
1028
+ $comment = $tb["comment_content"];
1029
+ // IP系の検査
1030
+ $ip = $_SERVER['REMOTE_ADDR'];
1031
+ if ( !$newThrowsSpamAway->ip_check( $ip ) ) {
1032
+ $tb_val['is_spam'] = TRUE;
1033
+ } else
1034
+ // 検査します!
1035
+ if ( !$newThrowsSpamAway->validation( $comment, $author ) ) {
1036
+ $tb_val['is_spam'] = TRUE;
1037
+ } else
1038
+ // URL検索する場合、URL包含検査 (このブログのURLを含んでない場合エラー
1039
+ if ( $tsa_tb_url_flg == "1" && stripos( $comment, $siteurl ) == FALSE ) {
1040
+ $tb_val['is_spam'] = TRUE; // スパム扱い
1041
+ }
1042
+ // トラックバックスパムがなければ返却・あったら捨てちゃう
1043
+ if ( !$tb_val['is_spam'] ) {
1044
+ // トラックバック内に日本語存在(または禁止語句混入なし)
1045
+ return $tb;
1046
+ } else {
1047
+ die( 'Your Trackback Throws Away.' );
1048
+ }
1049
+ }
1050
+
1051
+ /**
1052
+ * 当該IPアドレスからの最終投稿日時取得
1053
+ * @param string ip_address
1054
+ * @return 最終投稿日時 Y-m-d H:i:s
1055
+ */
1056
+ function get_last_spam_comment($ip_address = NULL) {
1057
+ global $wpdb;
1058
+ // IPアドレスがなければNULL返却
1059
+ if ( $ip_address == NULL ) {
1060
+ return NULL;
1061
+ }
1062
+ // 最終コメント情報取得
1063
+ $qry_str = "SELECT post_date, post_id FROM $this->table_name WHERE ip_address = '".htmlspecialchars($ip_address)."' ORDER BY post_date DESC LIMIT 1 ";
1064
+ $results = $wpdb->get_results($qry_str);
1065
+ if ( count( $results ) > 0 ) {
1066
+ return $results[0];
1067
+ }
1068
+ return NULL;
1069
+ }
1070
+ }
throws_spam_away.php CHANGED
@@ -4,12 +4,18 @@
4
  Plugin URI: http://gti.jp/tsa/
5
  Description: コメント内に日本語の記述が存在しない場合はあたかも受け付けたように振る舞いながらも捨ててしまうプラグイン
6
  Author: 株式会社ジーティーアイ さとう たけし
7
- Version: 2.3.3
8
  Author URI: http://gti.jp/
9
  */
 
 
 
 
 
 
10
 
11
  // スパムデータベースバージョン
12
- $tsa_db_version = 2.3;
13
 
14
  /** 初期設定 */
15
  // エラー種別
@@ -34,6 +40,15 @@ $default_url_count_over_error_msg = "";
34
  $default_url_count_check_flg = "1"; // 1:する
35
  // URL数の制限数
36
  $default_ok_url_count = 3; // 3つまで許容
 
 
 
 
 
 
 
 
 
37
  /** オプションキー */
38
  // 日本語が存在しない時エラーとするかフラグ [tsa_on_flg] 1:する 2:しない
39
  // 日本語文字列含有数 (入力値以下ならエラー) [tsa_japanese_string_min_count] 数値型
@@ -63,6 +78,8 @@ $default_ok_url_count = 3; // 3つまで許容
63
  // URL(単純に'http'文字列のチェックのみ)文字列許容数オーバー時に表示される文言(元の記事に戻ってくる時間の間のみ表示)
64
  // [tsa_url_count_over_error_message] 文字列型
65
 
 
 
66
  /** プロセス */
67
  $newThrowsSpamAway = new ThrowsSpamAway;
68
  // トラックバックチェックフィルター
@@ -70,700 +87,3 @@ add_filter('preprocess_comment', array(&$newThrowsSpamAway, 'trackback_spam_away
70
  // コメントフォーム表示
71
  add_action('comment_form_after', array(&$newThrowsSpamAway, "comment_form"), 9999); // Ver.2.1.1 comment_form → comment_form_after
72
  add_action('pre_comment_on_post', array(&$newThrowsSpamAway, "comment_post"), 1);
73
-
74
- /**
75
- *
76
- * <p>ThrowsSpamAway</p>
77
- * WordPress's Plugin
78
- * @author Takeshi Satoh@GTI Inc. 2013
79
- *
80
- */
81
- class ThrowsSpamAway {
82
-
83
- // version
84
- var $version = '2.3.2';
85
- var $table_name = "";
86
-
87
- public function __construct() {
88
- global $default_spam_data_save;
89
- add_action( 'admin_menu', array( $this, 'admin_menu' ) );
90
- global $wpdb;
91
- // 接頭辞(wp_)を付けてテーブル名を設定
92
- $this->table_name = $wpdb->prefix . 'tsa_spam';
93
- }
94
-
95
- /**
96
- * スパム投稿テーブル作成
97
- * $flg がTRUEなら強制的にテーブル作成
98
- */
99
- function tsa_createTbl() {
100
- global $wpdb;
101
- global $tsa_db_version;
102
-
103
- // テーブル作成要フラグ
104
- $flg = FALSE;
105
- if($wpdb->get_var("SHOW TABLES LIKE '$this->table_name'") != $this->table_name) {
106
- // テーブルが存在しないため作成する
107
- $flg = TRUE;
108
- }
109
-
110
- //DBのバージョン
111
- //$tsa_db_version
112
- //現在のDBバージョン取得
113
- $installed_ver = get_option( 'tsa_meta_version', 0 );
114
- // DBバージョンが低い または テーブルが存在しない場合は作成
115
- if( $installed_ver < $tsa_db_version || $flg == TRUE) {
116
- // DBバージョンは 2.3未満が存在しないためSQLはCREATE文のみ
117
- $sql = "CREATE TABLE " . $this->table_name . " (
118
- meta_id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
119
- post_id bigint(20) UNSIGNED DEFAULT '0' NOT NULL,
120
- ip_address text,
121
- post_date timestamp,
122
- UNIQUE KEY meta_id (meta_id)
123
- )
124
- CHARACTER SET 'utf8';";
125
- require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
126
- dbDelta( $sql );
127
- //オプションにDBバージョン保存
128
- update_option( 'tsa_meta_version', $tsa_db_version );
129
- }
130
- }
131
-
132
- /**
133
- * スパム投稿の記録
134
- * @param string $post_id
135
- * @param string $ip_address
136
- */
137
- function save_post_meta( $post_id, $ip_address ) {
138
- if ( get_option('tsa_spam_data_save', $default_spam_data_save) != "1" ) return;
139
-
140
- global $wpdb;
141
-
142
- //保存するために配列にする
143
- $set_arr = array(
144
- 'post_id' => $post_id,
145
- 'ip_address' => $ip_address
146
- );
147
-
148
- //レコード新規追加
149
- $wpdb->insert( $this->table_name, $set_arr );
150
- $wpdb->show_errors();
151
- return;
152
- }
153
-
154
- function comment_form() {
155
- global $default_caution_msg;
156
- // 注意文言表示
157
- $caution_msg = get_option( 'tsa_caution_message', $default_caution_msg );
158
- echo '<div id="throwsSpamAway">'.$caution_msg.'</div>';
159
- return TRUE;
160
- }
161
-
162
- function comment_post( $id ) {
163
- global $newThrowsSpamAway;
164
- global $user_ID;
165
- global $default_back_second;
166
- global $default_error_msg;
167
- global $default_ng_key_error_msg;
168
- global $default_must_key_error_msg;
169
- global $default_block_ip_address_error_msg;
170
- global $default_url_count_over_error_msg;
171
- global $error_type;
172
-
173
- if( $user_ID ) {
174
- return $id;
175
- }
176
- // コメント(comment)及び名前(author)の中も検査
177
- $author = $_POST["author"];
178
- $comment = $_POST["comment"];
179
- // IP系の検査
180
- $ip = $_SERVER['REMOTE_ADDR'];
181
- if ( !$newThrowsSpamAway->ip_check( $ip ) ) {
182
- // アウト!
183
- } else
184
- // コメント検査
185
- if ( $newThrowsSpamAway->validation( $comment, $author ) ) {
186
- return $id;
187
- }
188
- $error_msg = "";
189
- switch ( $error_type ) {
190
- case "must_word" :
191
- $error_msg = get_option( 'tsa_must_key_error_message', $default_must_key_error_msg );
192
- break;
193
- case "ng_word" :
194
- $error_msg = get_option( 'tsa_ng_key_error_message', $default_ng_key_error_msg );
195
- break;
196
- case "block_ip" :
197
- $error_msg = get_option( 'tsa_block_ip_address_error_message', $default_block_ip_address_error_msg );
198
- break;
199
- case "url_count_over" :
200
- $error_msg = get_option( 'tsa_url_count_over_error_message', $default_url_count_over_error_msg );
201
- break;
202
- default :
203
- $error_msg = get_option( 'tsa_error_message', $default_error_msg );
204
- }
205
- // 記録する場合はDB記録
206
- if ( get_option( 'tsa_spam_data_save', $default_spam_data_save ) == "1" ) $this->save_post_meta( $id, $ip );
207
- // 元画面へ戻るタイム計算
208
- $back_time = ( (int) get_option( 'tsa_back_second', $default_back_second ) ) * 1000;
209
- // タイム値が0なら元画面へそのままリダイレクト
210
- if ( $back_time == 0 ) {
211
- header( "Location:".$_SERVER['HTTP_REFERER'] );
212
- die;
213
- } else {
214
- wp_die( __($error_msg."<script type=\"text/javascript\">window.setTimeout(location.href='".$_SERVER['HTTP_REFERER']."', ".$back_time.");</script>", 'throws-spam-away'));
215
- }
216
- }
217
-
218
- /**
219
- * IPアドレスのチェックメソッド
220
- * @param string $target_ip
221
- */
222
- function ip_check( $target_ip ) {
223
- global $wpdb; // WordPress DBアクセス
224
- global $newThrowsSpamAway;
225
- global $error_type;
226
- // IP制御 WordPressのスパムチェックにてスパム扱いしている投稿のIPをブロックするか
227
- $ip_block_from_spam_chk_flg = get_option( 'tsa_ip_block_from_spam_chk_flg' );
228
-
229
- if ($ip_block_from_spam_chk_flg === "1") {
230
- // wp_commentsの comment_approved カラムが「spam」のIP_ADDRESSからの投稿は無視する
231
- $results = $wpdb->get_results( "SELECT DISTINCT comment_author_IP FROM $wpdb->comments WHERE comment_approved = 'spam' ORDER BY comment_author_IP ASC " );
232
- foreach ( $results as $item ) {
233
- if ( trim( $item->comment_author_IP ) == trim( $target_ip ) ) {
234
- // ブロックしたいIP
235
- $error_type = "block_ip";
236
- return FALSE;
237
- }
238
- }
239
- }
240
- // IP制御 任意のIPアドレスをあればブロックする
241
- $block_ip_addresses = get_option( 'tsa_block_ip_addresses', "" );
242
- if ( $block_ip_addresses != NULL && $block_ip_addresses != "" ) {
243
- $ip_list = mb_split( ",", $block_ip_addresses );
244
- foreach ( $ip_list as $ip ) {
245
- // 指定IPが範囲指定の場合 例:192.168.1.0/24
246
- if ( strpos( $ip, "/" ) != FALSE ) {
247
- if ( $this->inCIDR( $target_ip, $ip ) ) {
248
- // ブロックしたいIP
249
- $error_type = "block_ip";
250
- return FALSE;
251
- }
252
- } elseif ( trim( $ip ) == trim( $target_ip ) ) {
253
- // ブロックしたいIP
254
- $error_type = "block_ip";
255
- return FALSE;
256
- } else {
257
- // セーフIP
258
- }
259
- }
260
- }
261
- return TRUE;
262
- }
263
-
264
- /**
265
- * CIDRチェック
266
- * @param string $ip
267
- * @param string $cidr
268
- * @return boolean
269
- */
270
- function inCIDR($ip, $cidr) {
271
- list($network, $mask_bit_len) = explode('/', $cidr);
272
- if ( !is_nan($mask_bit_len) && $mask_bit_len <= 32) {
273
- $host = 32 - $mask_bit_len;
274
- $net = ip2long($network) >> $host << $host; // 11000000101010000000000000000000
275
- $ip_net = ip2long($ip) >> $host << $host; // 11000000101010000000000000000000
276
- return $net === $ip_net;
277
- } else {
278
- // 形式が不正ならば無視するためFALSE
279
- return FALSE;
280
- }
281
- }
282
-
283
- /**
284
- * 日本語が含まれているかチェックメソッド
285
- * @param string $comment
286
- * @param string $author
287
- */
288
- function validation( $comment, $author ) {
289
- global $newThrowsSpamAway;
290
- global $error_type;
291
- global $default_url_count_check_flg; // URL数を制御するか初期設定値
292
- global $default_ok_url_count; // 制限する場合のURL数初期設定値
293
- global $default_japanese_string_min_count; // 日本語文字最小含有数
294
- // まずはシングルバイトだけならエラー
295
- if (get_option('tsa_on_flg') != "2" && strlen(bin2hex($comment)) / 2 == mb_strlen($comment)) {
296
- return FALSE;
297
- } else {
298
- // OKフラグ
299
- $flg = FALSE;
300
- // マルチバイト文字が含まれている場合は日本語が含まれていればOK
301
- if (get_option('tsa_on_flg') != "2") {
302
- $count_flg = 0;
303
- mb_regex_encoding('UTF-8');
304
- $com_split = $newThrowsSpamAway->mb_str_split($comment);
305
- foreach ($com_split as $it) {
306
- if (preg_match('/[一-龠]+/u', $it)){ $count_flg += 1; }
307
- if (preg_match('/[ァ-ヶー]+/u', $it)){ $count_flg += 1; }
308
- if (preg_match('/[ぁ-ん]+/u', $it)){ $count_flg += 1; }
309
- }
310
- $flg = (intval(get_option('tsa_japanese_string_min_count', $default_japanese_string_min_count)) < $count_flg);
311
- if ($flg == FALSE) {
312
- return FALSE;
313
- }
314
- }
315
- // 日本語文字列チェック抜けたらキーワードチェックを行う
316
- // キーワード文字列群
317
- $ng_keywords = get_option('tsa_ng_keywords');
318
- if ($ng_keywords != NULL && $ng_keywords != "") {
319
- $keyword_list = mb_split(",", $ng_keywords);
320
- foreach ($keyword_list as $key) {
321
- if (preg_match('/'.trim($key)."/u", $author.$comment)) {
322
- $error_type = "ng_word";
323
- return FALSE;
324
- }
325
- }
326
- }
327
- // キーワードチェック(ブラックリスト)を抜けたら必須キーワードチェックを行う
328
- // キーワード文字列群 ※ブラックリストと重複するものはブラックリストのほうが優先です。
329
- $must_keywords = get_option('tsa_must_keywords', "");
330
- if ($must_keywords != NULL && $must_keywords != "") {
331
- $keyword_list = mb_split(",", $must_keywords);
332
- foreach ($keyword_list as $key) {
333
- if (preg_match('/'.trim($key)."/u", $author.$comment)) {
334
- // OK
335
- } else {
336
- // 必須ワードがなかったためエラー
337
- $error_type = "must_word";
338
- return FALSE;
339
- }
340
- }
341
- }
342
- // URL数チェック
343
- $url_count_check = get_option('tsa_url_count_on_flg', $default_url_count_check_flg);
344
- // 許容URL数設定値
345
- $ok_url_count = intval(get_option('tsa_ok_url_count', $default_ok_url_count)); // デフォルト値3(3つまで許容)
346
- if ( $url_count_check != "2" ) {
347
- if ( substr_count( strtolower( $author.$comment ), 'http') > $ok_url_count) {
348
- // URL文字列(httpの数)が多いエラー
349
- $error_type = "url_count_over";
350
- return FALSE;
351
- }
352
- }
353
-
354
- return TRUE;
355
- }
356
- }
357
-
358
- function mb_str_split( $string ) {
359
- return preg_split('/(?<!^)(?!$)/u', $string );
360
- }
361
-
362
- /**
363
- * Callback admin_menu
364
- */
365
- function admin_menu() {
366
- $mincap="level_8";
367
- add_menu_page(__( 'Throws SPAM Away', $this->domain ), __( 'Throws SPAM Away', $this->domain ), $mincap, __FILE__, array( $this, 'options_page' ) );
368
-
369
- // 従来通りスパムデータ保存しない場合はスルーする
370
- if ( get_option( 'tsa_spam_data_save' ) != 1 ) {
371
- // N/A
372
- } else {
373
- // プラグインアップデート時もチェックするため常に・・・
374
- $this->tsa_createTbl(TRUE);
375
- }
376
-
377
- }
378
-
379
- /**
380
- * Admin options page
381
- */
382
- function options_page() {
383
- global $wpdb; // WordPress DBアクセス
384
- global $default_japanese_string_min_count;
385
- global $default_caution_msg;
386
- global $default_back_second;
387
- global $default_error_msg;
388
- global $default_ng_key_error_msg;
389
- global $default_must_key_error_msg;
390
- global $default_block_ip_address_error_msg;
391
- global $default_url_count_over_error_msg;
392
- global $default_ok_url_count;
393
- global $default_spam_data_save;
394
- ?>
395
- <style>
396
- table.form-table { }
397
- table.form-table th {
398
- width : 200px;
399
- }
400
- </style>
401
- <script type="text/Javascript">
402
- // 配列重複チェック
403
- var isDuplicate = function(ary, str) {
404
- for (i = 0; i < ary.length; i++) {
405
- if(str == ary[i]) {
406
- return true;
407
- }
408
- }
409
- return false;
410
- };
411
- function addIpAddresses(newAddressStr) {
412
- var str = document.getElementById('tsa_block_ip_addresses').value;
413
- if (str.length > 0) { str += ","; }
414
- str += newAddressStr;
415
- var ary = str.split(",");
416
- var newAry = new Array;
417
- var ret = "";
418
-
419
- for( var i=0 ; i < ary.length ; i++ ) {
420
- if( !isDuplicate(newAry, ary[i]) ){
421
- newAry.push(ary[i]);
422
- }
423
- }
424
- document.getElementById('tsa_block_ip_addresses').value = newAry.join(',');
425
- return false;
426
- }
427
- </script>
428
- <div class="wrap">
429
- <h2>Throws SPAM Away設定</h2>
430
- <form method="post" action="options.php">
431
- <h3>スパム対策機能 設定</h3>
432
- <?php wp_nonce_field('update-options'); ?>
433
- <table class="form-table">
434
- <tr valign="top">
435
- <th scope="row">日本語が存在しない場合、無視対象とする<br />(日本語文字列が存在しない場合無視対象となります。)</th>
436
- <td><?php
437
- $chk_1 = "";
438
- $chk_2 = "";
439
- if (get_option('tsa_on_flg', "1") == "2") {
440
- $chk_2 = " checked=\"checked\"";
441
- } else {
442
- $chk_1 = " checked=\"checked\"";
443
- }
444
- ?>
445
- <label><input type="radio" name="tsa_on_flg" value="1"<?php echo $chk_1;?>/>&nbsp;する</label>&nbsp;
446
- <label><input type="radio" name="tsa_on_flg" value="2"<?php echo $chk_2;?>/>&nbsp;しない</label>
447
- </td>
448
- </tr>
449
- <tr valign="top">
450
- <th scope="row">日本語文字列含有数<br />(この文字列に達していない場合無視対象となります。)</th>
451
- <td><input type="text" name="tsa_japanese_string_min_count"
452
- value="<?php echo get_option('tsa_japanese_string_min_count', $default_japanese_string_min_count); ?>" />
453
- </td>
454
- </tr>
455
- <tr valign="top">
456
- <th scope="row">元の記事に戻ってくる時間<br />(秒)※0の場合エラー画面表示しません。</th>
457
- <td><input type="text" name="tsa_back_second"
458
- value="<?php echo get_option('tsa_back_second', $default_back_second);?>" /></td>
459
- </tr>
460
- <tr valign="top">
461
- <th scope="row">コメント欄の下に表示される注意文言</th>
462
- <td><input type="text" name="tsa_caution_message" size="80"
463
- value="<?php echo get_option('tsa_caution_message', $default_caution_msg);?>" /><br />(初期設定:<?php echo $default_caution_msg;?>)</td>
464
- </tr>
465
- <tr valign="top">
466
- <th scope="row">日本語文字列規定値未満エラー時に表示される文言<br />(元の記事に戻ってくる時間の間のみ表示)</th>
467
- <td><input type="text" name="tsa_error_message" size="80"
468
- value="<?php echo get_option('tsa_error_message', $default_error_msg);?>" /><br />(初期設定:<?php echo $default_error_msg;?>)</td>
469
- </tr>
470
- </table>
471
- <h3>URL文字列除外 設定</h3>
472
- <table class="form-table">
473
- <tr valign="top">
474
- <th scope="row">URLらしき文字列が混入している場合エラーとするか</th>
475
- <td><?php
476
- $chk_1 = "";
477
- $chk_2 = "";
478
- if (get_option('tsa_url_count_on_flg', "1") == "2") {
479
- $chk_2 = " checked=\"checked\"";
480
- } else {
481
- $chk_1 = " checked=\"checked\"";
482
- }
483
- ?>
484
- <label><input type="radio" name="tsa_url_count_on_flg" value="1"<?php echo $chk_1;?>/>&nbsp;する</label>&nbsp;
485
- <label><input type="radio" name="tsa_url_count_on_flg" value="2"<?php echo $chk_2;?>/>&nbsp;しない</label><br />
486
- する場合の制限数(入力数値まで許容):<input type="text" name="tsa_ok_url_count" size="2"
487
- value="<?php echo get_option('tsa_ok_url_count', $default_ok_url_count);?>" />
488
- </td>
489
- </tr>
490
- <tr valign="top">
491
- <th scope="row">URLらしき文字列混入数オーバーエラー時に表示される文言
492
- (元の記事に戻ってくる時間の間のみ表示)</th>
493
- <td><input type="text" name="tsa_url_count_over_error_message" size="80"
494
- value="<?php echo get_option('tsa_url_count_over_error_message', $default_url_count_over_error_msg);?>" /><br />(初期設定:<?php echo $default_url_count_over_error_msg;?>)</td>
495
- </tr>
496
- </table>
497
- <h3>NGキーワード / 必須キーワード 制御設定</h3>
498
- <table class="form-table">
499
- <tr valign="top">
500
- <th scope="row">その他NGキーワード<br />(日本語でも英語(その他)でもNGとしたいキーワードを半角カンマ区切りで複数設定できます。<br />挙動は同じです。NGキーワードだけでも使用できます。)</th>
501
- <td><input type="text" name="tsa_ng_keywords" size="80"
502
- value="<?php echo get_option('tsa_ng_keywords', "");?>" /></td>
503
- </tr>
504
- <tr valign="top">
505
- <th scope="row">NGキーワードエラー時に表示される文言<br />(元の記事に戻ってくる時間の間のみ表示)</th>
506
- <td><input type="text" name="tsa_ng_key_error_message" size="80"
507
- value="<?php echo get_option('tsa_ng_key_error_message', $default_ng_key_error_msg);?>" /><br />(初期設定:<?php echo $default_ng_key_error_msg;?>)</td>
508
- </tr>
509
- <tr valign="top">
510
- <th scope="row">その上での必須キーワード<br />(日本語でも英語(その他)でも必須としたいキーワードを半角カンマ区切りで複数設定できます。<br />指定文字列を含まない場合はエラーとなります。※複数の方が厳しくなります。<br />必須キーワードだけでも使用できます。)</th>
511
- <td><input type="text" name="tsa_must_keywords" size="80"
512
- value="<?php echo get_option('tsa_must_keywords', "");?>" /></td>
513
- </tr>
514
- <tr valign="top">
515
- <th scope="row">必須キーワードエラー時に表示される文言<br />(元の記事に戻ってくる時間の間のみ表示)</th>
516
- <td><input type="text" name="tsa_must_key_error_message" size="80"
517
- value="<?php echo get_option('tsa_must_key_error_message', $default_must_key_error_msg);?>" /><br />(初期設定:<?php echo $default_must_key_error_msg;?>)</td>
518
- </tr>
519
- </table>
520
- <h3>トラックバックへの対応設定</h3>
521
- <table class="form-table">
522
- <tr valign="top">
523
- <th scope="row">上記設定をトラックバック記事にも採用する</th>
524
- <td><?php
525
- $chk_1 = "";
526
- $chk_2 = "";
527
- if (get_option('tsa_tb_on_flg', "2") == "2") {
528
- $chk_2 = " checked=\"checked\"";
529
- } else {
530
- $chk_1 = " checked=\"checked\"";
531
- }
532
- ?>
533
- <label><input type="radio" name="tsa_tb_on_flg" value="1"<?php echo $chk_1;?>/>&nbsp;する</label>&nbsp;
534
- <label><input type="radio" name="tsa_tb_on_flg" value="2"<?php echo $chk_2;?>/>&nbsp;しない</label>
535
- </td>
536
- </tr>
537
- <tr valign="top">
538
- <th scope="row">トラックバック記事にも採用する場合、ついでにこちらのURLが含まれているか判断する<br />(初期設定:「しない」)</th>
539
- <td><?php
540
- $chk_1 = "";
541
- $chk_2 = "";
542
- if (get_option('tsa_tb_url_flg', "2") == "2") {
543
- $chk_2 = " checked=\"checked\"";
544
- } else {
545
- $chk_1 = " checked=\"checked\"";
546
- }
547
- ?>
548
- <label><input type="radio" name="tsa_tb_url_flg" value="1"<?php echo $chk_1;?>/>&nbsp;する</label>&nbsp;
549
- <label><input type="radio" name="tsa_tb_url_flg" value="2"<?php echo $chk_2;?>/>&nbsp;しない</label>
550
- </td>
551
- </tr>
552
- </table>
553
- <h3>投稿IPアドレスによる制御設定</h3>
554
- <table class="form-table">
555
- <tr valign="top">
556
- <th scope="row">WordPressのコメントで「スパム」にしたIPからの投稿にも採用する</th>
557
- <td><?php
558
- $chk = "";
559
- if (get_option('tsa_ip_block_from_spam_chk_flg', "") == "1") {
560
- $chk = "checked=\"checked\"";
561
- } else {
562
- $chk = "";
563
- }
564
- ?>
565
- <label><input type="checkbox" name="tsa_ip_block_from_spam_chk_flg" value="1"<?php echo $chk; ?>/>&nbsp;スパム投稿設定したIPアドレスからの投稿も無視する</label><br />
566
- <?php
567
- // wp_commentsの comment_approved カラムが「spam」のIP_ADDRESSからの投稿は無視する
568
- $results = $wpdb->get_results("SELECT DISTINCT comment_author_IP FROM $wpdb->comments WHERE comment_approved = 'spam' ORDER BY comment_author_IP ASC ");
569
- ?>現在「spam」フラグが付いているIPアドレス:<br /><blockquote><?php
570
- $add_ip_addresses = "";
571
- foreach ($results as $item) {
572
- $spam_ip = $item->comment_author_IP;
573
- // ブロックしたいIP
574
- if ( strlen( $add_ip_addresses ) > 0 ) {
575
- $add_ip_addresses .= ",";
576
- }
577
- $add_ip_addresses .= $spam_ip;
578
- ?><b><?php echo $spam_ip; ?></b><br /><?php
579
- }
580
- ?>&nbsp;<input type="button" onclick="javascript:addIpAddresses('<?php echo $add_ip_addresses; ?>');" value="これらのIPアドレスを任意のブロック対象IPアドレスにコピーする" /><br />
581
- </blockquote>
582
- </td>
583
- </tr>
584
- <tr valign="top">
585
- <th scope="row">任意のIPアドレスからの投稿も無視したい場合、対象となるIPアドレスを記述してください。<br />カンマ区切りで複数設定できます。(半角数字とドットのみ)</th>
586
- <td><input type="text" name="tsa_block_ip_addresses" id="tsa_block_ip_addresses" size="80"
587
- value="<?php echo get_option('tsa_block_ip_addresses', "");?>" /></td>
588
- </tr>
589
- <tr valign="top">
590
- <th scope="row">ブロック対象のIPアドレスからの投稿時に表示される文言<br />(元の記事に戻ってくる時間の間のみ表示)</th>
591
- <td><input type="text" name="tsa_block_ip_address_error_message" size="80"
592
- value="<?php echo get_option('tsa_block_ip_address_error_message', $default_block_ip_address_error_msg);?>" /><br />(初期設定:<?php echo $default_block_ip_address_error_msg; ?>)</td>
593
- </tr>
594
- </table>
595
- <h3>スパムデータベース</h3>
596
- <table class="form-table">
597
- <tr valign="top">
598
- <th scope="row">スパムコメント投稿情報を保存しますか?</th>
599
- <td><?php
600
- $chk = "";
601
- if (get_option('tsa_spam_data_save', "") == "1") {
602
- $chk = "checked=\"checked\"";
603
- } else {
604
- $chk = "";
605
- }
606
- ?>
607
- <label><input type="checkbox" name="tsa_spam_data_save" value="1"<?php echo $chk; ?>/>&nbsp;スパムコメント情報を保存する</label><br />※Throws SPAM Away設定画面表示時に時間がかかることがあります。<br />※「保存する」を解除した場合でもテーブルは残りますので30日以内の取得データは表示されます。
608
- </td>
609
- </tr>
610
- </table>
611
-
612
- <input type="hidden" name="action" value="update" /> <input
613
- type="hidden" name="page_options"
614
- value="tsa_on_flg,tsa_japanese_string_min_count,tsa_back_second,tsa_caution_message,tsa_error_message,tsa_ng_keywords,tsa_ng_key_error_message,tsa_must_keywords,tsa_must_key_error_message,tsa_tb_on_flg,tsa_tb_url_flg,tsa_block_ip_addresses,tsa_ip_block_from_spam_chk_flg,tsa_block_ip_address_error_message,tsa_url_count_on_flg,tsa_ok_url_count,tsa_url_count_over_error_message,tsa_spam_data_save" />
615
- <p class="submit">
616
- <input type="submit" class="button-primary"
617
- value="<?php _e('Save Changes') ?>" />
618
- </p>
619
-
620
- <?php
621
- if ( get_option( 'tsa_spam_data_save' ) == "1" ) {
622
- // 日数
623
- $gdays = 30;
624
- // 表カラー
625
- $unique_color="#114477";
626
- $web_color="#3377B6";
627
-
628
- $results = $wpdb->get_results("SELECT SUBSTRING(post_date,1,10) AS spam_date,COUNT(*) as spam_count FROM `".$this->table_name."` group by spam_date order by spam_date asc");
629
- ?>
630
- <h3>スパム投稿30日間の推移</h3>
631
- <?php
632
- foreach ($results as $item) {
633
- echo $item->spam_date .":". $item->spam_count."件<br />";
634
- }
635
- ?>
636
- <div class="clear"></div>
637
-
638
- <div class="clear" style="background-color:#efefef;">
639
- <table style="width:100%;border:none;"><tr>
640
- <?php
641
- $total_qry = "
642
- SELECT count(ppd) as pageview, ppd
643
- FROM (select ip_address, SUBSTRING(post_date,1,10) as ppd from $this->table_name) as A
644
- GROUP BY ppd HAVING ppd >= '".gmdate('Y-m-d', current_time('timestamp')-86400*$gdays)."'
645
- ORDER BY pageview DESC
646
- LIMIT 1
647
- ";
648
- $qry = $wpdb->get_row($total_qry);
649
- $maxxday=$qry->pageview;
650
-
651
- $total_vis = "
652
- SELECT count(distinct ip_address) as vis, ppd
653
- FROM (select ip_address, SUBSTRING(post_date,1,10) as ppd from $this->table_name) as B
654
- GROUP BY ppd HAVING ppd >= '".gmdate('Y-m-d', current_time('timestamp')-86400*$gdays)."'
655
- ORDER BY vis DESC
656
- LIMIT 1
657
- ";
658
- $qry_vis = $wpdb->get_row($total_vis);
659
- $maxxday += $qry_vis->vis;
660
-
661
- if($maxxday == 0) { $maxxday = 1; }
662
-
663
- # Y
664
- $gd=(100/$gdays).'%';
665
- for($gg=$gdays-1;$gg>=0;$gg--)
666
- {
667
- #TOTAL VISITORS
668
- $visitor_qry = "
669
- SELECT count(DISTINCT ip_address) AS total
670
- FROM (select ip_address, SUBSTRING(post_date,1,10) as ppd from $this->table_name) as B
671
- WHERE ppd = '".gmdate('Y-m-d', current_time('timestamp')-86400*$gg)."'
672
- ";
673
- $qry_visitors = $wpdb->get_row($visitor_qry);
674
- $px_visitors = round($qry_visitors->total*100/$maxxday);
675
- #TOTAL PAGEVIEWS (we do not delete the uniques, this is falsing the info.. uniques are not different visitors!)
676
- $pageview_qry = "
677
- SELECT count(ppd) as total
678
- FROM (select ip_address, SUBSTRING(post_date,1,10) as ppd from $this->table_name) as C
679
- WHERE ppd = '".gmdate('Y-m-d', current_time('timestamp')-86400*$gg)."'
680
- ";
681
- $qry_pageviews = $wpdb->get_row($pageview_qry);
682
- $px_pageviews = round($qry_pageviews->total*100/$maxxday);
683
- $px_white = 100 - $px_pageviews - $px_visitors;
684
- if ($px_white < 0) { $px_white = 0; }
685
-
686
- print '<td width="'.$gd.'" valign="bottom"';
687
- if($start_of_week == gmdate('w',current_time('timestamp')-86400*$gg)) { print ' style="border-left:2px dotted gray;"'; } # week-cut
688
- print "><div style='float:left;width:100%;font-family:Helvetica;font-size:7pt;text-align:center;border-right:1px solid white;color:black;'>
689
- <div style='background:#ffffff;width:100%;height:".$px_white."px;'></div>
690
- <div style='background:$unique_color;width:100%;height:".$px_visitors."px;' title='".$qry_visitors->total." ip_addresses'></div>
691
- <div style='background:$web_color;width:100%;height:".$px_pageviews."px;' title='".$qry_pageviews->total." spam comments'></div>
692
- <div style='background:gray;width:100%;height:1px;'></div>
693
- <br />".gmdate('d', current_time('timestamp')-86400*$gg) . ' ' . gmdate('M', current_time('timestamp')-86400*$gg) . "<br clear=\"all\" /></div></td>\n";
694
- }
695
- ?>
696
- </tr></table>
697
- </div>
698
- &nbsp;<br />
699
- <div class="clear">
700
- <?php
701
- // wp_tsa_spam の ip_address カラムに存在するIP_ADDRESS投稿は無視するか
702
- $results = $wpdb->get_results(
703
- "SELECT count(ip_address) as cnt,ip_address FROM (select ip_address, SUBSTRING(post_date,1,10) as ppd from $this->table_name) as D
704
- WHERE ppd >= '".gmdate('Y-m-d', current_time('timestamp')-86400*$gdays)."'
705
- GROUP BY ip_address
706
- ORDER BY cnt DESC"
707
- );
708
- ?><h4>過去30日間に無視投稿されたIPアドレス</h4>
709
- <p>※「このIPアドレスを任意のブロック対象IPアドレスにコピーする」ボタンを押した場合は上の<b>「変更を保存」</b>をクリックし内容を保存してください。</p>
710
- <p>※IPアドレスをクリックすると特定のホストが存在するか確認し存在する場合は表示されます。</p>
711
- <?php if ( count( $results ) > 0 ) { ?>
712
- <div style="height: 500px; overflow:auto;"><blockquote>
713
- <table style="width:100%;border:1px #cccccc solid;border-collapse: collapse;"><?php
714
- foreach ($results as $item) {
715
- $spam_ip = $item->ip_address;
716
- $spam_cnt = $item->cnt;
717
- $p_url = WP_PLUGIN_URL.'/'.str_replace(basename( __FILE__),"",plugin_basename(__FILE__));
718
- ?><tr style="border:1px #cccccc solid;border-collapse: collapse;"><td><b><a href="javascript:void(0);" onclick="window.open('<?php echo $p_url; ?>hostbyip.php?ip=<?php echo $spam_ip; ?>', 'hostbyip', 'width=350,height=250,scrollbars=no,location=no,menubar=no,toolbar=no,directories=no,status=no');"><?php echo $spam_ip; ?></a></b></td><td><?php echo $spam_cnt; ?>回</td><td>&nbsp;<input type="button" onclick="javascript:addIpAddresses('<?php echo $spam_ip; ?>');" value="このIPアドレスを任意のブロック対象IPアドレスにコピーする" /></td></tr><?php
719
- }
720
- ?></table></blockquote></div>
721
- <?php } ?>
722
- </div>
723
- <?php } ?>
724
- </form>
725
- <p>スパム投稿IPアドレスを参考にアクセス禁止対策を行なってください。</p>
726
- <div class="clear"></div>
727
-
728
- </div>
729
-
730
- <?php
731
- }
732
-
733
- function trackback_spam_away($tb) {
734
- global $newThrowsSpamAway;
735
-
736
- $tsa_tb_on_flg = get_option( 'tsa_tb_on_flg' );
737
- $tsa_tb_url_flg = get_option( 'tsa_tb_url_flg' );
738
- $siteurl = get_option('siteurl');
739
- // トラックバック OR ピンバック時にフィルタ発動
740
- if ( $tsa_tb_on_flg == "2" || ( $tb['comment_type'] != 'trackback' && $tb['comment_type'] != 'pingback' ) ) return $tb;
741
-
742
- // SPAMかどうかフラグ
743
- $tb_val['is_spam'] = FALSE;
744
-
745
- // コメント判定
746
- $author = $tb["comment_author"];
747
- $comment = $tb["comment_content"];
748
- // IP系の検査
749
- $ip = $_SERVER['REMOTE_ADDR'];
750
- if ( !$newThrowsSpamAway->ip_check( $ip ) ) {
751
- $tb_val['is_spam'] = TRUE;
752
- } else
753
- // 検査します!
754
- if ( !$newThrowsSpamAway->validation( $comment, $author ) ) {
755
- $tb_val['is_spam'] = TRUE;
756
- } else
757
- // URL検索する場合、URL包含検査 (このブログのURLを含んでない場合エラー
758
- if ( $tsa_tb_url_flg == "1" && stripos( $comment, $siteurl ) == FALSE ) {
759
- $tb_val['is_spam'] = TRUE; // スパム扱い
760
- }
761
- // トラックバックスパムがなければ返却・あったら捨てちゃう
762
- if ( !$tb_val['is_spam'] ) {
763
- // トラックバック内に日本語存在(または禁止語句混入なし)
764
- return $tb;
765
- } else {
766
- die( 'Your Trackback Throws Away.' );
767
- }
768
- }
769
- }
4
  Plugin URI: http://gti.jp/tsa/
5
  Description: コメント内に日本語の記述が存在しない場合はあたかも受け付けたように振る舞いながらも捨ててしまうプラグイン
6
  Author: 株式会社ジーティーアイ さとう たけし
7
+ Version: 2.4
8
  Author URI: http://gti.jp/
9
  */
10
+ require_once 'throws_spam_away.class.php';
11
+
12
+ /**
13
+ * 設定値一覧
14
+ * デフォルト設定
15
+ */
16
 
17
  // スパムデータベースバージョン
18
+ $tsa_db_version = 2.3; // 2.4もデータベースバージョンは変更なし
19
 
20
  /** 初期設定 */
21
  // エラー種別
40
  $default_url_count_check_flg = "1"; // 1:する
41
  // URL数の制限数
42
  $default_ok_url_count = 3; // 3つまで許容
43
+
44
+ // ○分以内に○回スパムとなったら○分間そのIPからのコメントははじくかの設定
45
+ $default_spam_limit_flg = 2; // 1:する Other:しない ※スパム情報保存がデフォルトではないのでこちらも基本はしない方向です。
46
+ // ※スパム情報保存していないと機能しません。
47
+ $default_spam_limit_minutes = 10; // 10分以内に・・・
48
+ $default_spam_limit_count = 2; // 2回までは許そうか。
49
+ $default_spam_limit_over_interval = 10; // だがそれを超えたら(デフォルト3回目以降)10分はOKコメントでもスパム扱いするんでよろしく!
50
+ $default_spam_limit_over_interval_error_msg = ""; // そしてその際のエラーメッセージは・・・
51
+
52
  /** オプションキー */
53
  // 日本語が存在しない時エラーとするかフラグ [tsa_on_flg] 1:する 2:しない
54
  // 日本語文字列含有数 (入力値以下ならエラー) [tsa_japanese_string_min_count] 数値型
78
  // URL(単純に'http'文字列のチェックのみ)文字列許容数オーバー時に表示される文言(元の記事に戻ってくる時間の間のみ表示)
79
  // [tsa_url_count_over_error_message] 文字列型
80
 
81
+
82
+
83
  /** プロセス */
84
  $newThrowsSpamAway = new ThrowsSpamAway;
85
  // トラックバックチェックフィルター
87
  // コメントフォーム表示
88
  add_action('comment_form_after', array(&$newThrowsSpamAway, "comment_form"), 9999); // Ver.2.1.1 comment_form → comment_form_after
89
  add_action('pre_comment_on_post', array(&$newThrowsSpamAway, "comment_post"), 1);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
uninstall.php CHANGED
@@ -1,7 +1,8 @@
1
  <?php
2
  /*
3
  Throws SPAM Awayプラグインアンインストール
4
- 2.3追加
 
5
  */
6
 
7
  if(!defined('ABSPATH') && !defined('WP_UNINSTALL_PLUGIN')) { exit(); }
@@ -29,4 +30,9 @@ delete_option('tsa_url_count_over_error_message');
29
  // ver.2.3
30
  delete_option('tsa_meta_version');
31
  delete_option('tsa_spam_data_save');
32
- ?>
 
 
 
 
 
1
  <?php
2
  /*
3
  Throws SPAM Awayプラグインアンインストール
4
+ 2.3 追加
5
+ 2.4 追記
6
  */
7
 
8
  if(!defined('ABSPATH') && !defined('WP_UNINSTALL_PLUGIN')) { exit(); }
30
  // ver.2.3
31
  delete_option('tsa_meta_version');
32
  delete_option('tsa_spam_data_save');
33
+ // ver.2.4
34
+ delete_option('tsa_spam_limit_flg');
35
+ delete_option('tsa_spam_limit_minutes');
36
+ delete_option('tsa_spam_limit_count');
37
+ delete_option('tsa_spam_limit_over_interval');
38
+ delete_option('tsa_spam_limit_over_interval_error_message');