<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>哇寶部落格 &#187; NoSpamNX</title>
	<atom:link href="http://blog.wabow.com/archives/tag/nospamnx/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.wabow.com</link>
	<description>Wabow Information Inc. Blog</description>
	<lastBuildDate>Fri, 21 May 2010 15:11:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>[分享] 垃圾留言判斷，隱藏驗證碼的 NoSpamNX class PART2</title>
		<link>http://blog.wabow.com/archives/2072</link>
		<comments>http://blog.wabow.com/archives/2072#comments</comments>
		<pubDate>Thu, 27 Aug 2009 06:32:14 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[技術分享]]></category>
		<category><![CDATA[NoSpamNX]]></category>
		<category><![CDATA[垃圾留言]]></category>

		<guid isPermaLink="false">http://blog.wabow.com/?p=2072</guid>
		<description><![CDATA[感謝上一篇文章中前輩們的熱心回覆；垃圾留言果然是大家心中的痛啊（噗）～雖然 CAPTCHA 可以透過各式各樣的 OCR 破解（最新版的 JDownloader 也已經能忽略大部分免費空間所用的圖像辨識...扯遠了），不過它仍是目前阻擋機器人最直接也最簡單的解決方案；當然更複雜的 CAPTCHA 還是能夠達到阻擋的目的，但是使用 CAPTCHA 的方式對使用者來說就已經是不友善了。 後來在討論中 Jace 提到，其實 SESSION 是有可能被機器人知道的；所以我後來綜合了 fillano 提供的演算法概念，稍微改良了一下之前的 NoSpamNX class。利用隨機產生的隱藏欄位順序，用不同的演算法再對隱藏欄位的數值作編碼；讓 SESSION 內存的未編碼的值，與 POST 過來的已編碼的值不一樣。最後再將 SESSION 內存的值編碼，與 POST 的已編碼的值作比較，判斷留言的使用者是不是機器人。 SESSION 紀錄的值是未編碼的值，但在產生隱藏欄位時，input 的值是已經編碼過後的值 /** &#xa0;* 建立隱藏欄位 HTML；利用隱藏欄位先後順序不同，使用 md5 or sha1 編碼 &#xa0;* &#xa0;*/ public function addHiddenFields() { &#xa0;&#xa0;&#xa0;&#xa0;$nospamnx = $_SESSION[$this-&#62;_sessionName]; &#xa0;&#xa0;&#xa0;&#xa0;if (1 === rand(1,2)) { &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;return '&#60;input [...]]]></description>
			<content:encoded><![CDATA[<p>感謝<a href="http://blog.wabow.com/archives/1974" target="_blank">上一篇文章</a>中前輩們的熱心回覆；垃圾留言果然是大家心中的痛啊（噗）～雖然 <a href="http://zh.wikipedia.org/w/index.php?title=CAPTCHA&amp;variant=zh-tw" target="_blank">CAPTCHA</a> 可以透過各式各樣的 <a href="http://zh.wikipedia.org/zh-tw/%E5%85%89%E5%AD%A6%E5%AD%97%E7%AC%A6%E8%AF%86%E5%88%AB" target="_blank">OCR</a> 破解（最新版的 <a href="http://jdownloader.org/home/index" target="_blank">JDownloader</a> 也已經能忽略大部分免費空間所用的圖像辨識...扯遠了），不過它仍是目前阻擋機器人最直接也最簡單的解決方案；當然更複雜的 CAPTCHA 還是能夠達到阻擋的目的，但是使用 CAPTCHA 的方式對使用者來說就已經是不友善了。</p>
<p>後來在討論中 Jace 提到，其實 SESSION 是有可能被機器人知道的；所以我後來綜合了 fillano 提供的演算法概念，稍微改良了一下之前的 NoSpamNX class。利用隨機產生的隱藏欄位順序，用不同的演算法再對隱藏欄位的數值作編碼；讓 SESSION 內存的未編碼的值，與 POST 過來的已編碼的值不一樣。最後再將 SESSION 內存的值編碼，與 POST 的已編碼的值作比較，判斷留言的使用者是不是機器人。</p>
<p><span id="more-2072"></span>SESSION 紀錄的值是未編碼的值，但在產生隱藏欄位時，input 的值是已經編碼過後的值</p>
<pre style='color:#000020;background:#cceeee;overflow:auto;border:1px solid silver'>
<span style='color:#595979;background:#cceeee'>/**</span>
<span style='color:#595979;background:#cceeee'>&#xa0;* 建立隱藏欄位 HTML；利用隱藏欄位先後順序不同，使用 md5 or sha1 編碼</span>
<span style='color:#595979;background:#cceeee'>&#xa0;* </span>
<span style='color:#595979;background:#cceeee'>&#xa0;*/</span>
<span style='color:#200080;background:#cceeee;font-weight:bold'>public</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#200080;background:#cceeee;font-weight:bold'>function</span><span style='color:#000000;background:#cceeee'> addHiddenFields</span><span style='color:#308080;background:#cceeee'>(</span><span style='color:#308080;background:#cceeee'>)</span><span style='color:#000000;background:#cceeee'></span>
<span style='color:#406080;background:#cceeee'>{</span><span style='color:#000000;background:#cceeee'></span>
<span style='color:#000000;background:#cceeee'>&#xa0;&#xa0;&#xa0;&#xa0;</span><span style='color:#007d45;background:#cceeee'>$nospamnx</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#308080;background:#cceeee'>=</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#007d45;background:#cceeee'>$_SESSION</span><span style='color:#308080;background:#cceeee'>[</span><span style='color:#007d45;background:#cceeee'>$</span><span style='color:#200080;background:#cceeee;font-weight:bold'>this</span><span style='color:#308080;background:#cceeee'>-&gt;</span><span style='color:#007d45;background:#cceeee'>_sessionName</span><span style='color:#308080;background:#cceeee'>]</span><span style='color:#406080;background:#cceeee'>;</span><span style='color:#000000;background:#cceeee'></span>
<span style='color:#000000;background:#cceeee'></span>
<span style='color:#000000;background:#cceeee'>&#xa0;&#xa0;&#xa0;&#xa0;</span><span style='color:#200080;background:#cceeee;font-weight:bold'>if</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#308080;background:#cceeee'>(</span><span style='color:#008c00;background:#cceeee'>1</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#308080;background:#cceeee'>=</span><span style='color:#308080;background:#cceeee'>=</span><span style='color:#308080;background:#cceeee'>=</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#400000;background:#cceeee'>rand</span><span style='color:#308080;background:#cceeee'>(</span><span style='color:#008c00;background:#cceeee'>1</span><span style='color:#308080;background:#cceeee'>,</span><span style='color:#008c00;background:#cceeee'>2</span><span style='color:#308080;background:#cceeee'>)</span><span style='color:#308080;background:#cceeee'>)</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#406080;background:#cceeee'>{</span><span style='color:#000000;background:#cceeee'></span>
<span style='color:#000000;background:#cceeee'>&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;</span><span style='color:#200080;background:#cceeee;font-weight:bold'>return</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#1060b6;background:#cceeee'>'&lt;input type="text" name="nospamnx['</span><span style='color:#308080;background:#cceeee'>.</span><span style='color:#007d45;background:#cceeee'>$nospamnx</span><span style='color:#308080;background:#cceeee'>[</span><span style='color:#1060b6;background:#cceeee'>'nospamnx-1'</span><span style='color:#308080;background:#cceeee'>]</span><span style='color:#308080;background:#cceeee'>.</span><span style='color:#1060b6;background:#cceeee'>']" value="" class="locktross" /&gt;&lt;input type="text" name="nospamnx['</span><span style='color:#308080;background:#cceeee'>.</span><span style='color:#007d45;background:#cceeee'>$nospamnx</span><span style='color:#308080;background:#cceeee'>[</span><span style='color:#1060b6;background:#cceeee'>'nospamnx-2'</span><span style='color:#308080;background:#cceeee'>]</span><span style='color:#308080;background:#cceeee'>.</span><span style='color:#1060b6;background:#cceeee'>']" value="'</span><span style='color:#308080;background:#cceeee'>.</span><span style='color:#400000;background:#cceeee'>md5</span><span style='color:#308080;background:#cceeee'>(</span><span style='color:#007d45;background:#cceeee'>$nospamnx</span><span style='color:#308080;background:#cceeee'>[</span><span style='color:#1060b6;background:#cceeee'>'nospamnx-2-value'</span><span style='color:#308080;background:#cceeee'>]</span><span style='color:#308080;background:#cceeee'>)</span><span style='color:#308080;background:#cceeee'>.</span><span style='color:#1060b6;background:#cceeee'>'" class="locktross" /&gt;'</span><span style='color:#406080;background:#cceeee'>;</span><span style='color:#000000;background:#cceeee'></span>
<span style='color:#000000;background:#cceeee'>&#xa0;&#xa0;&#xa0;&#xa0;</span><span style='color:#406080;background:#cceeee'>}</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#200080;background:#cceeee;font-weight:bold'>else</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#406080;background:#cceeee'>{</span><span style='color:#000000;background:#cceeee'></span>
<span style='color:#000000;background:#cceeee'>&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;</span><span style='color:#200080;background:#cceeee;font-weight:bold'>return</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#1060b6;background:#cceeee'>'&lt;input type="text" name="nospamnx['</span><span style='color:#308080;background:#cceeee'>.</span><span style='color:#007d45;background:#cceeee'>$nospamnx</span><span style='color:#308080;background:#cceeee'>[</span><span style='color:#1060b6;background:#cceeee'>'nospamnx-2'</span><span style='color:#308080;background:#cceeee'>]</span><span style='color:#308080;background:#cceeee'>.</span><span style='color:#1060b6;background:#cceeee'>']" value="'</span><span style='color:#308080;background:#cceeee'>.</span><span style='color:#400000;background:#cceeee'>sha1</span><span style='color:#308080;background:#cceeee'>(</span><span style='color:#007d45;background:#cceeee'>$nospamnx</span><span style='color:#308080;background:#cceeee'>[</span><span style='color:#1060b6;background:#cceeee'>'nospamnx-2-value'</span><span style='color:#308080;background:#cceeee'>]</span><span style='color:#308080;background:#cceeee'>)</span><span style='color:#308080;background:#cceeee'>.</span><span style='color:#1060b6;background:#cceeee'>'" class="locktross" /&gt;&lt;input type="text" name="nospamnx['</span><span style='color:#308080;background:#cceeee'>.</span><span style='color:#007d45;background:#cceeee'>$nospamnx</span><span style='color:#308080;background:#cceeee'>[</span><span style='color:#1060b6;background:#cceeee'>'nospamnx-1'</span><span style='color:#308080;background:#cceeee'>]</span><span style='color:#308080;background:#cceeee'>.</span><span style='color:#1060b6;background:#cceeee'>']" value="" class="locktross" /&gt;'</span><span style='color:#406080;background:#cceeee'>;</span><span style='color:#000000;background:#cceeee'></span>
<span style='color:#000000;background:#cceeee'>&#xa0;&#xa0;&#xa0;&#xa0;</span><span style='color:#406080;background:#cceeee'>}</span><span style='color:#000000;background:#cceeee'></span>
<span style='color:#406080;background:#cceeee'>}</span><span style='color:#000000;background:#cceeee'></span>
</pre>
<p>驗證時根據 POST 過來的 nospamnx 順序不同，以不同的演算法編碼後再做比較</p>
<pre style='color:#000020;background:#cceeee;overflow:auto;border:1px solid silver'>
<span style='color:#595979;background:#cceeee'>// 根據 POST 過來的值順序不同，以 md5 or sha1 判斷</span><span style='color:#000000;background:#cceeee'></span>
<span style='color:#200080;background:#cceeee;font-weight:bold'>if</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#308080;background:#cceeee'>(</span><span style='color:#007d45;background:#cceeee'>$nospamnx</span><span style='color:#308080;background:#cceeee'>[</span><span style='color:#1060b6;background:#cceeee'>'nospamnx-1'</span><span style='color:#308080;background:#cceeee'>]</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#308080;background:#cceeee'>=</span><span style='color:#308080;background:#cceeee'>=</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#400000;background:#cceeee'>current</span><span style='color:#308080;background:#cceeee'>(</span><span style='color:#400000;background:#cceeee'>array_keys</span><span style='color:#308080;background:#cceeee'>(</span><span style='color:#007d45;background:#cceeee'>$postData</span><span style='color:#308080;background:#cceeee'>)</span><span style='color:#308080;background:#cceeee'>)</span><span style='color:#308080;background:#cceeee'>)</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#406080;background:#cceeee'>{</span><span style='color:#000000;background:#cceeee'></span>
<span style='color:#000000;background:#cceeee'>&#xa0;&#xa0;&#xa0;&#xa0;</span><span style='color:#007d45;background:#cceeee'>$encode_value</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#308080;background:#cceeee'>=</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#400000;background:#cceeee'>md5</span><span style='color:#308080;background:#cceeee'>(</span><span style='color:#007d45;background:#cceeee'>$nospamnx</span><span style='color:#308080;background:#cceeee'>[</span><span style='color:#1060b6;background:#cceeee'>'nospamnx-2-value'</span><span style='color:#308080;background:#cceeee'>]</span><span style='color:#308080;background:#cceeee'>)</span><span style='color:#406080;background:#cceeee'>;</span><span style='color:#000000;background:#cceeee'></span>
<span style='color:#406080;background:#cceeee'>}</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#200080;background:#cceeee;font-weight:bold'>else</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#406080;background:#cceeee'>{</span><span style='color:#000000;background:#cceeee'></span>
<span style='color:#000000;background:#cceeee'>&#xa0;&#xa0;&#xa0;&#xa0;</span><span style='color:#007d45;background:#cceeee'>$encode_value</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#308080;background:#cceeee'>=</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#400000;background:#cceeee'>sha1</span><span style='color:#308080;background:#cceeee'>(</span><span style='color:#007d45;background:#cceeee'>$nospamnx</span><span style='color:#308080;background:#cceeee'>[</span><span style='color:#1060b6;background:#cceeee'>'nospamnx-2-value'</span><span style='color:#308080;background:#cceeee'>]</span><span style='color:#308080;background:#cceeee'>)</span><span style='color:#406080;background:#cceeee'>;</span><span style='color:#000000;background:#cceeee'></span>
<span style='color:#406080;background:#cceeee'>}</span><span style='color:#000000;background:#cceeee'></span>
<span style='color:#200080;background:#cceeee;font-weight:bold'>if</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#308080;background:#cceeee'>(</span><span style='color:#007d45;background:#cceeee'>$postData</span><span style='color:#308080;background:#cceeee'>[</span><span style='color:#007d45;background:#cceeee'>$nospamnx</span><span style='color:#308080;background:#cceeee'>[</span><span style='color:#1060b6;background:#cceeee'>'nospamnx-2'</span><span style='color:#308080;background:#cceeee'>]</span><span style='color:#308080;background:#cceeee'>]</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#308080;background:#cceeee'>!</span><span style='color:#308080;background:#cceeee'>=</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#007d45;background:#cceeee'>$encode_value</span><span style='color:#308080;background:#cceeee'>)</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#406080;background:#cceeee'>{</span><span style='color:#000000;background:#cceeee'></span>
<span style='color:#000000;background:#cceeee'>&#xa0;&#xa0;&#xa0;&#xa0;</span><span style='color:#200080;background:#cceeee;font-weight:bold'>return</span><span style='color:#000000;background:#cceeee'> </span><span style='color:#200080;background:#cceeee;font-weight:bold'>false</span><span style='color:#406080;background:#cceeee'>;</span><span style='color:#000000;background:#cceeee'></span>
<span style='color:#406080;background:#cceeee'>}</span><span style='color:#000000;background:#cceeee'></span>
</pre>
<p>最後提供<a href="http://blog.wabow.com/wp-content/uploads/2009/08/nospamnx_090827.zip">範例程式下載</a>，分為一般 POST 與 AJAX 二種方式。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wabow.com/archives/2072/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[分享] 垃圾留言判斷，隱藏驗證碼的 NoSpamNX class</title>
		<link>http://blog.wabow.com/archives/1974</link>
		<comments>http://blog.wabow.com/archives/1974#comments</comments>
		<pubDate>Thu, 20 Aug 2009 05:06:42 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[技術分享]]></category>
		<category><![CDATA[NoSpamNX]]></category>
		<category><![CDATA[垃圾留言]]></category>

		<guid isPermaLink="false">http://blog.wabow.com/?p=1974</guid>
		<description><![CDATA[目前大部分網站在表單發送時，判斷機器人發送廣告、垃圾留言的方法是採用 CAPTCHA 的方式；然而如同之前在部落格上分享過的文章所述，額外的驗證碼機制反而造成使用者在參予留言或討論時望之卻步。同篇文章中也提到 WordPress 用來防治垃圾留言的 Plugin NoSpamNX；最近剛好客戶有阻擋垃圾留言的需求，所以就稍微研究了一下，順便改成 class 讓使用上能更具彈性。 基本的流程是在建構式中，將隨機產生的隱藏驗證碼存入 SESSION，同時利用這些值建立隨機順序的 HTML 碼，在使用者 POST 的時候加以驗證。 首先要在網頁的最上面先開啟 SESSION，並建立 NoSpamNX 物件，同時寫入 SESSION，產生 HTML 碼 // 啟動 SESSION session_start&#40;&#41;; &#160; // 載入 NoSpamNX class include_once&#40;'NoSpamNX.php'&#41;; // 建立物件時可以指定 SESSION 的名稱，或不輸入使用預設值 $noSpamNX = new NoSpamNX&#40;'test_for_NoSpamNX'&#41;; &#160; // 產生隨機順序的隱藏欄位 $hidden_fields_for_NoSpamNX = $noSpamNX-&#62;addHiddenFields&#40;&#41;; 將 HTML 碼嵌入表單中 echo $hidden_fields_for_NoSpamNX; 在送出表單後，根據： 1. 檢查 POST [...]]]></description>
			<content:encoded><![CDATA[<p>目前大部分網站在表單發送時，判斷機器人發送廣告、垃圾留言的方法是採用 <a href="http://zh.wikipedia.org/w/index.php?title=CAPTCHA&amp;variant=zh-tw" target="_blank">CAPTCHA</a> 的方式；然而如同之前在<a href="http://blog.wabow.com/archives/713" target="_blank">部落格上分享過的文章</a>所述，額外的驗證碼機制反而造成使用者在參予留言或討論時望之卻步。同篇文章中也提到 <a href="http://zh.wikipedia.org/w/index.php?title=WordPress&amp;variant=zh-tw" target="_blank">WordPress</a> 用來防治垃圾留言的 Plugin <a href="http://www.svenkubiak.de/nospamnx/" target="_blank">NoSpamNX</a>；最近剛好客戶有阻擋垃圾留言的需求，所以就稍微研究了一下，順便改成 class 讓使用上能更具彈性。<br />
<span id="more-1974"></span><br />
<a href="http://blog.wabow.com/wp-content/uploads/2009/08/nospamnx_class949.png"></a><a href="http://blog.wabow.com/wp-content/uploads/2009/08/nospamnx_class949.png"><img class="aligncenter size-large wp-image-1975" src="http://blog.wabow.com/wp-content/uploads/2009/08/nospamnx_class949-500x303.png" alt="nospamnx_class949" width="500" height="303" /></a><br />
基本的流程是在建構式中，將隨機產生的隱藏驗證碼存入 SESSION，同時利用這些值建立隨機順序的 HTML 碼，在使用者 POST 的時候加以驗證。</p>
<p>首先要在網頁的最上面先開啟 SESSION，並建立 NoSpamNX 物件，同時寫入 SESSION，產生 HTML 碼</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// 啟動 SESSION</span>
<span style="color: #990000;">session_start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// 載入 NoSpamNX class</span>
<span style="color: #b1b100;">include_once</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'NoSpamNX.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// 建立物件時可以指定 SESSION 的名稱，或不輸入使用預設值</span>
<span style="color: #000088;">$noSpamNX</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> NoSpamNX<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'test_for_NoSpamNX'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// 產生隨機順序的隱藏欄位</span>
<span style="color: #000088;">$hidden_fields_for_NoSpamNX</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$noSpamNX</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addHiddenFields</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>將 HTML 碼嵌入表單中</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">echo</span> <span style="color: #000088;">$hidden_fields_for_NoSpamNX</span><span style="color: #339933;">;</span></pre></div></div>

<p>在送出表單後，根據：</p>
<blockquote><p>1. 檢查 POST 過來的資料中，是否有 'nospamnx-1' 產生的 MD5 Name；不存在=機器人<br />
2. 檢查 POST 過來的 'nospamnx-1' MD5 Name，其值是否為零；不為零=機器人<br />
3. 檢查 POST 過來的資料中，是否有 'nospamnx-2' 產生的 MD5 Name；不存在=機器人<br />
4. 檢查 POST 過來的 'nospamnx-2' MD5 Name，其值是否為 SESSION 中 'nospamnx-2' MD5 Value；不相等=機器人</p></blockquote>
<p>每次通過檢查後就會清空 SESSION，所以每一個留言所使用的隱藏驗證碼都是不一樣的。</p>
<p>距離之前介紹 NoSpamNX，已經有一段時間；而作者在新版加入了選擇性的 <a href="http://zh.wikipedia.org/zh-tw/HTTP_referrer" target="_blank">HTTP referrer</a> 判斷。不過因為難免會造成誤判的情況，以及程式寫起來有點醜（誤）等種種原因，所以並沒有放在這次的 class 裡面。</p>
<p>最後關於範例程式下載，請參考《<a href="http://blog.wabow.com/archives/2072" target="_blank">[分享] 垃圾留言判斷，隱藏驗證碼的 NoSpamNX class PART2</a>》。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wabow.com/archives/1974/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>[WordPress Plugin] NoSpamNX 阻擋機器人發送廣告、垃圾留言的最佳利器</title>
		<link>http://blog.wabow.com/archives/713</link>
		<comments>http://blog.wabow.com/archives/713#comments</comments>
		<pubDate>Wed, 08 Apr 2009 08:54:06 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[技術分享]]></category>
		<category><![CDATA[NoSpamNX]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[垃圾留言]]></category>

		<guid isPermaLink="false">http://blog.wabow.com/?p=713</guid>
		<description><![CDATA[部落格似乎已經成為現代人的基本配備；如同手機、Email 一般，與大家的生活密不可分。不論是紀錄生活點滴、抒發個人情緒或是交流最新的知識技術，透過部落格這樣的平台，任何人都可以發表對不同人事物的各種觀點與看法；而身為 Web 2.0 時代中最發燒的新星，與網路上其他使用者互動的要素當然絕對不能少！對部落格作者發表文章的回應，或是針對作者個人的留言，透過這些方式，達到社群分享的最終目的。 然而因為部落格的興起，訊息交流的便利，一些我們不需要的廣告與垃圾留言就開始充斥在部落格中；各個部落格平台無不絞盡腦汁，使出各種招數，跟這些沒有生命的廣告機器人大鬥法，因此演生出 CAPTCHA 這種辨識機器人與真人的驗證碼模式。但是「道高一呎，魔高一丈」，很快的新的廣告機器人學會了如何識別簡單的驗證碼，導致後期的驗證碼愈來愈希奇古怪；弄得廣告機器人沒阻擋成功，一般真正想要參予討論，交流經驗的使用者，看到這些五花八門的驗證碼後反而打起退堂鼓。這不是因噎廢食嗎？ WordPress 這個廣受歡迎而且開放原始碼的部落格平台，當然也有碰到廣告機器人肆虐的問題；同時他也知道 CAPTCHA 對使用者造成的不便。所以廣大網海中的許多前輩們（鄉民？）就為他開發了許多便利的外掛程式。其中 NoSpamNX 就是一種不需要透過 CAPTCHA，卻同樣達到有效阻擋廣告機器人的外掛程式！ NoSpamNX 其實就是 Yawasp 的最新版，之前曾經因為 Neo 的介紹而研究過這一個外掛程式。Yawasp 主要的運作方式，是透過動態更換留言樣表單中，輸入框的欄位名稱，讓廣告機器人找不到固定的欄位填值，使其無法成功留言。不過因為這個外掛程式會修改到留言樣版的原始碼，可能會造成某些非官方的樣板模組發生問題，所以作者在改版成 NoSpamNX 後，採用另外一種方式；在留言區塊的 &#60;/textarea&#62; 之後，增加二個隱藏欄位，名稱與值皆使用 MD5 編碼，同時故意將其中一個欄位的數值留空（因為廣告機器人通常會將所有欄位值填滿），當作判斷時的陷阱；這二個欄位的順序也會隨機更換。 經過以下五個步驟判斷，準確辨識是否為廣告機器人；同時將疑似廣告機器人的 IP，加入黑名單中： 1. 檢查 ip 是否在黑名單中；在黑名單中=機器人 2. 檢查 POST 過來的資料中，是否有 'nospamnx-1' 產生的 MD5 Name；不存在=機器人 3. 檢查 POST 過來的 'nospamnx-1' MD5 Name，其值是否為零；不為零=機器人 4. 檢查 POST 過來的資料中，是否有 'nospamnx-2' 產生的 [...]]]></description>
			<content:encoded><![CDATA[<p>部落格似乎已經成為現代人的基本配備；如同手機、Email 一般，與大家的生活密不可分。不論是紀錄生活點滴、抒發個人情緒或是交流最新的知識技術，透過部落格這樣的平台，任何人都可以發表對不同人事物的各種觀點與看法；而身為 <a href="http://zh.wikipedia.org/wiki/Web_2.0" target="_blank">Web 2.0</a> 時代中最發燒的新星，與網路上其他使用者互動的要素當然絕對不能少！對部落格作者發表文章的回應，或是針對作者個人的留言，透過這些方式，達到社群分享的最終目的。</p>
<p>然而因為部落格的興起，訊息交流的便利，一些我們不需要的廣告與垃圾留言就開始充斥在部落格中；各個部落格平台無不絞盡腦汁，使出各種招數，跟這些沒有生命的廣告機器人大鬥法，因此演生出 <a href="http://zh.wikipedia.org/w/index.php?title=CAPTCHA&amp;variant=zh-tw" target="_blank">CAPTCHA</a> 這種辨識機器人與真人的驗證碼模式。但是「道高一呎，魔高一丈」，很快的新的廣告機器人學會了如何識別簡單的驗證碼，導致後期的驗證碼<a href="http://chinese.engadget.com/2009/03/30/on-captcha/" target="_blank">愈來愈希奇古怪</a>；弄得廣告機器人沒阻擋成功，一般真正想要參予討論，交流經驗的使用者，看到這些五花八門的驗證碼後反而打起退堂鼓。這不是因噎廢食嗎？</p>
<p><a href="http://zh.wikipedia.org/w/index.php?title=WordPress&amp;variant=zh-tw" target="_blank">WordPress</a> 這個廣受歡迎而且開放原始碼的部落格平台，當然也有碰到廣告機器人肆虐的問題；同時他也知道 CAPTCHA 對使用者造成的不便。所以廣大網海中的許多前輩們（<a href="http://zh.uncyclopedia.info/wiki/%E9%84%89%E6%B0%91" target="_blank">鄉民</a>？）就為他開發了許多便利的外掛程式。其中 <a href="http://www.svenkubiak.de/nospamnx/" target="_blank">NoSpamNX</a> 就是一種不需要透過 CAPTCHA，卻同樣達到有效阻擋廣告機器人的外掛程式！</p>
<p><span id="more-713"></span>NoSpamNX 其實就是 <a href="http://wordpress.org/extend/plugins/yawasp/" target="_blank">Yawasp</a> 的最新版，之前曾經因為 Neo 的介紹而研究過這一個外掛程式。Yawasp 主要的運作方式，是透過動態更換留言樣表單中，輸入框的欄位名稱，讓廣告機器人找不到固定的欄位填值，使其無法成功留言。不過因為這個外掛程式會修改到留言樣版的原始碼，可能會造成某些非官方的樣板模組發生問題，所以作者在改版成 NoSpamNX 後，採用另外一種方式；在留言區塊的 &lt;/textarea&gt; 之後，增加二個隱藏欄位，名稱與值皆使用 MD5 編碼，同時故意將其中一個欄位的數值留空（因為廣告機器人通常會將所有欄位值填滿），當作判斷時的陷阱；這二個欄位的順序也會隨機更換。</p>
<p style="text-align: center"><a href="http://blog.wabow.com/wp-content/uploads/2009/04/nospamnx949.png"><img class="aligncenter size-large wp-image-1872" src="http://blog.wabow.com/wp-content/uploads/2009/04/nospamnx949-500x303.png" alt="nospamnx949" width="500" height="303" /></a></p>
<p>經過以下五個步驟判斷，準確辨識是否為廣告機器人；同時將疑似廣告機器人的 IP，加入黑名單中：</p>
<blockquote><p>1. 檢查 ip 是否在黑名單中；在黑名單中=機器人<br />
2. 檢查 POST 過來的資料中，是否有 'nospamnx-1' 產生的 MD5 Name；不存在=機器人<br />
3. 檢查 POST 過來的 'nospamnx-1' MD5 Name，其值是否為零；不為零=機器人<br />
4. 檢查 POST 過來的資料中，是否有 'nospamnx-2' 產生的 MD5 Name；不存在=機器人<br />
5. 檢查 POST 過來的 'nospamnx-2' MD5 Name，其值是否為 'nospamnx-2' MD5 Value；不相等=機器人</p></blockquote>
<p>如此一來，就可以達到不使用 CAPTCHA，同時又能辨識廣告機器人的目的，雖然對於「真人」的廣告、垃圾留言發送還是無法百分之百的排除，不過應該可以阻擋大部分的無生命機器人。適當的利用各種外掛程式，就可以得到乾淨的版面，與友善的使用者輸入介面，真的要感謝熱心的網路上的前輩們囉！</p>
<p>參考資料：<a href="http://briian.com/?p=6188" target="_blank">NoSpamNX 阻擋SPAM機器人與廣告、垃圾留言（WordPress外掛）</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.wabow.com/archives/713/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
