<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress/2.3" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>
<channel>
	<title>Comments on: Outsmarting Spam-Bots</title>
	<link>http://retiredblog.gkaindl.com/2007/04/18/outsmarting-spam-bots/</link>
	<description>nerd nouveau</description>
	<pubDate>Fri, 05 Sep 2008 22:09:31 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.3</generator>
		<item>
		<title>By: Paul Butler.org &#187; JSSpamBlock-like protection for any website</title>
		<link>http://retiredblog.gkaindl.com/2007/04/18/outsmarting-spam-bots/#comment-4355</link>
		<dc:creator>Paul Butler.org &#187; JSSpamBlock-like protection for any website</dc:creator>
		<pubDate>Thu, 11 Oct 2007 13:59:39 +0000</pubDate>
		<guid>http://retiredblog.gkaindl.com/2007/04/18/outsmarting-spam-bots/#comment-4355</guid>
		<description>[...] comments about the database being unnecessary, and I wrote a more lengthy (compared to this post) response explaining why it was. He then came up with a clever solution - by including the post&#8217;s ID in [...]</description>
		<content:encoded><![CDATA[<p>[&#8230;] comments about the database being unnecessary, and I wrote a more lengthy (compared to this post) response explaining why it was. He then came up with a clever solution - by including the post&#8217;s ID in [&#8230;]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Paul Butler.org &#187; JSSpamBlock Modifications</title>
		<link>http://retiredblog.gkaindl.com/2007/04/18/outsmarting-spam-bots/#comment-2145</link>
		<dc:creator>Paul Butler.org &#187; JSSpamBlock Modifications</dc:creator>
		<pubDate>Mon, 21 May 2007 17:20:49 +0000</pubDate>
		<guid>http://retiredblog.gkaindl.com/2007/04/18/outsmarting-spam-bots/#comment-2145</guid>
		<description>[...] Georg Kaindl and I had a discussion on whether a database was really neccesary (he made some excellent points on why this is not the case, though I still maintain that the extra protection is woth the cost), [...]</description>
		<content:encoded><![CDATA[<p>[&#8230;] Georg Kaindl and I had a discussion on whether a database was really neccesary (he made some excellent points on why this is not the case, though I still maintain that the extra protection is woth the cost), [&#8230;]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: georg</title>
		<link>http://retiredblog.gkaindl.com/2007/04/18/outsmarting-spam-bots/#comment-1245</link>
		<dc:creator>georg</dc:creator>
		<pubDate>Thu, 19 Apr 2007 12:59:05 +0000</pubDate>
		<guid>http://retiredblog.gkaindl.com/2007/04/18/outsmarting-spam-bots/#comment-1245</guid>
		<description>I've hacked together a version implementing this method. You've got mail!</description>
		<content:encoded><![CDATA[<p>I&#8217;ve hacked together a version implementing this method. You&#8217;ve got mail!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Paul Butler</title>
		<link>http://retiredblog.gkaindl.com/2007/04/18/outsmarting-spam-bots/#comment-1242</link>
		<dc:creator>Paul Butler</dc:creator>
		<pubDate>Thu, 19 Apr 2007 12:10:18 +0000</pubDate>
		<guid>http://retiredblog.gkaindl.com/2007/04/18/outsmarting-spam-bots/#comment-1242</guid>
		<description>Good idea. I found that the most active bot on my test site was making multiple comments to the same post, but that bot did not even make a single request for the form (or if it did, it didn't parse it), so it would have been stopped anyway.

The only difference is that if someone wanted to write a custom script to attack the blog, they would have to make less page requests. I think this is a small enough problem that the benefits outweigh it.

I think a future version should work both ways, with a toggle in the options panel.</description>
		<content:encoded><![CDATA[<p>Good idea. I found that the most active bot on my test site was making multiple comments to the same post, but that bot did not even make a single request for the form (or if it did, it didn&#8217;t parse it), so it would have been stopped anyway.</p>
<p>The only difference is that if someone wanted to write a custom script to attack the blog, they would have to make less page requests. I think this is a small enough problem that the benefits outweigh it.</p>
<p>I think a future version should work both ways, with a toggle in the options panel.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: georg</title>
		<link>http://retiredblog.gkaindl.com/2007/04/18/outsmarting-spam-bots/#comment-1239</link>
		<dc:creator>georg</dc:creator>
		<pubDate>Thu, 19 Apr 2007 10:34:51 +0000</pubDate>
		<guid>http://retiredblog.gkaindl.com/2007/04/18/outsmarting-spam-bots/#comment-1239</guid>
		<description>Paul, that's a very valid point, and I haven't thought about that (I knew I must've been missing something :-) ).

However, how about using a hidden (i.e. user-specifiable) secret string + some post-specific number + the randomly generated 4-digit verification code, compute the md5 hash of this and stick it into the hidden form field.

In the comment verification function, we could simply recompute the hash since we know the secret string and the post-specific number without accessing the database, using the verification number supplied by the user.

This way, a SPAM-bot would have to do at least one GET request for every post they want to comment on (granted, once they've done that, they could send unlimited SPAM comments to that one post, but usually, SPAM-bots only send one comment per post), but we could still get around the database access.

I'll hack up some code later today and send it your way!</description>
		<content:encoded><![CDATA[<p>Paul, that&#8217;s a very valid point, and I haven&#8217;t thought about that (I knew I must&#8217;ve been missing something :-) ).</p>
<p>However, how about using a hidden (i.e. user-specifiable) secret string + some post-specific number + the randomly generated 4-digit verification code, compute the md5 hash of this and stick it into the hidden form field.</p>
<p>In the comment verification function, we could simply recompute the hash since we know the secret string and the post-specific number without accessing the database, using the verification number supplied by the user.</p>
<p>This way, a SPAM-bot would have to do at least one GET request for every post they want to comment on (granted, once they&#8217;ve done that, they could send unlimited SPAM comments to that one post, but usually, SPAM-bots only send one comment per post), but we could still get around the database access.</p>
<p>I&#8217;ll hack up some code later today and send it your way!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Paul</title>
		<link>http://retiredblog.gkaindl.com/2007/04/18/outsmarting-spam-bots/#comment-1216</link>
		<dc:creator>Paul</dc:creator>
		<pubDate>Thu, 19 Apr 2007 01:50:26 +0000</pubDate>
		<guid>http://retiredblog.gkaindl.com/2007/04/18/outsmarting-spam-bots/#comment-1216</guid>
		<description>Btw, sorry for the long comment... I didn't realize how long it was until it was posted.</description>
		<content:encoded><![CDATA[<p>Btw, sorry for the long comment&#8230; I didn&#8217;t realize how long it was until it was posted.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Paul</title>
		<link>http://retiredblog.gkaindl.com/2007/04/18/outsmarting-spam-bots/#comment-1215</link>
		<dc:creator>Paul</dc:creator>
		<pubDate>Thu, 19 Apr 2007 01:49:04 +0000</pubDate>
		<guid>http://retiredblog.gkaindl.com/2007/04/18/outsmarting-spam-bots/#comment-1215</guid>
		<description>Hi Georg, thanks for the comments. I enjoyed reading this post because I can see that you really get the idea behind JSSpamBlock more than a lot of the users I have talked to.

I can see your point about the database, but my choices weren't just arbitrary and I can explain the reasoning behind storing the information in a database.

Although I don't make mention of it, JSSpamBlock actually stops spam in two ways. The first way is the most obvious: it makes sure the client is executing JavaScript, or failing that, that a human is on the other end to type in the code.

The second way is less obvious, but the commenter is forced to make one request to the comment form every comment posted. This is not a problem for a human poster, since the comment always has to be entered through the form, but spam bots tend to skip that step and post right to the wp-comments.php file. Over half of the bots (in my test) would be blocked just by verifying that the hash was sent by the server and has not been used. By forcing the code to be checked with server-side records, the plugin ensures that the comment corresponds to one request of the comment form. Otherwise, it would be trivial to write a bot that gets around this by sending "simpleAntiSpamHiddenField=1234&#38;simpleAntiSpamInputField_ID=1234" on each post request. It would still be trivial to write a bot to defeat JSSpamBlock, but it would require some text parsing and, more importantly, one GET request per comment POST. On the average spam bot, the first way would require changing a few lines of code, while the second would require a small but significant addition to fetch and parse the forms. Indeed the point behind the plugin was to be different enough that no one would bother to write the trivial code required to get around it, so your plugin is actually more in line with my original vision than mine is. The problem was that once I decided to distribute it, I realized that if enough people use it, it could become worth it for a spammer to write a few lines to get around. The only way to stop this was to verify that the numbers sent to the server had been generated on the server, which required a database.

The reason I used a hash is not all that important, a numeric ID would do just as well. The only problem is that the ID would give away how many hits your blog has had since adding the plugin. For most blogs this is not an issue, but some people would rather keep that private so I use a hash instead.

I look forward to seeing how it goes. If you are going to release your code, let me know and I may send a link your way.</description>
		<content:encoded><![CDATA[<p>Hi Georg, thanks for the comments. I enjoyed reading this post because I can see that you really get the idea behind JSSpamBlock more than a lot of the users I have talked to.</p>
<p>I can see your point about the database, but my choices weren&#8217;t just arbitrary and I can explain the reasoning behind storing the information in a database.</p>
<p>Although I don&#8217;t make mention of it, JSSpamBlock actually stops spam in two ways. The first way is the most obvious: it makes sure the client is executing JavaScript, or failing that, that a human is on the other end to type in the code.</p>
<p>The second way is less obvious, but the commenter is forced to make one request to the comment form every comment posted. This is not a problem for a human poster, since the comment always has to be entered through the form, but spam bots tend to skip that step and post right to the wp-comments.php file. Over half of the bots (in my test) would be blocked just by verifying that the hash was sent by the server and has not been used. By forcing the code to be checked with server-side records, the plugin ensures that the comment corresponds to one request of the comment form. Otherwise, it would be trivial to write a bot that gets around this by sending &#8220;simpleAntiSpamHiddenField=1234&amp;simpleAntiSpamInputField_ID=1234&#8243; on each post request. It would still be trivial to write a bot to defeat JSSpamBlock, but it would require some text parsing and, more importantly, one GET request per comment POST. On the average spam bot, the first way would require changing a few lines of code, while the second would require a small but significant addition to fetch and parse the forms. Indeed the point behind the plugin was to be different enough that no one would bother to write the trivial code required to get around it, so your plugin is actually more in line with my original vision than mine is. The problem was that once I decided to distribute it, I realized that if enough people use it, it could become worth it for a spammer to write a few lines to get around. The only way to stop this was to verify that the numbers sent to the server had been generated on the server, which required a database.</p>
<p>The reason I used a hash is not all that important, a numeric ID would do just as well. The only problem is that the ID would give away how many hits your blog has had since adding the plugin. For most blogs this is not an issue, but some people would rather keep that private so I use a hash instead.</p>
<p>I look forward to seeing how it goes. If you are going to release your code, let me know and I may send a link your way.</p>
]]></content:encoded>
	</item>
</channel>
</rss>
