pf » Battling Comment Spam

Battling Comment Spam

coldfusionweb

Fighting comment spam seams like a never ending battle. I've done a lot over the last few years to try and squash it on my blog.

I started out by implementing a list of words that would trigger the comment to be blocked. I found myself updating this list on a weekly basis, never staying on top of it.

I solved that problem by implementing the Bayesian Filter CFC from fusionKit. The bayes filter has worked really well, and produced a suprisingly low number of false positives.

Now just over the weekend I was flodded with a ton of comment spams that were written well enough to get past the bayes filter. They were also all submitted within a few minutes, so there was no time to train my bayes filter.

I'm not a big fan of statically blocking IP addresses, since the owners of IP addresses can change over time. However I think temporary blocks on IP's are OK, so I wrote a little rate limiter that will block IP's that try to post more than 1 comment within a 5 minute time span or IP's that have attempted to post a large number of comments.

I'm sure some of you have probably experienced the same problem, so here you go:

<cfif IsDefined("application.rate_limiter")>
  <cfif StructKeyExists(application.rate_limiter, CGI.REMOTE_ADDR)>
    <cfif application.rate_limiter[CGI.REMOTE_ADDR].attemps GT 1 AND DateDiff("n", application.rate_limiter[CGI.REMOTE_ADDR].last_attempt, Now()) LT 5>
      <p>You are posting too many comments too fast, please slow down and wait 5 min.</p>
      <cfset application.rate_limiter[CGI.REMOTE_ADDR].attemps = application.rate_limiter[CGI.REMOTE_ADDR].attemps + 1>
      <cfset application.rate_limiter[CGI.REMOTE_ADDR].last_attempt = Now()>
      <cfabort>
    <cfelseif application.rate_limiter[CGI.REMOTE_ADDR].attemps GT 20>
      <p>You have made too many attempts to post a comment. Please try back in a few days.</p>
      <cfset application.rate_limiter[CGI.REMOTE_ADDR].attemps = application.rate_limiter[CGI.REMOTE_ADDR].attemps + 1>
      <cfset application.rate_limiter[CGI.REMOTE_ADDR].last_attempt = Now()>
      <cfabort>
    <cfelse>
      <cfset application.rate_limiter[CGI.REMOTE_ADDR].attemps = application.rate_limiter[CGI.REMOTE_ADDR].attemps + 1>
      <cfset application.rate_limiter[CGI.REMOTE_ADDR].last_attempt = Now()>
    </cfif>
  <cfelse>
    <cfset application.rate_limiter[CGI.REMOTE_ADDR] = StructNew()>
    <cfset application.rate_limiter[CGI.REMOTE_ADDR].attemps = 1>
    <cfset application.rate_limiter[CGI.REMOTE_ADDR].last_attempt = Now()>
  </cfif>
<cfelse>
  <cfset application.rate_limiter = StructNew()>
  <cfset application.rate_limiter[CGI.REMOTE_ADDR] = StructNew()>
  <cfset application.rate_limiter[CGI.REMOTE_ADDR].attemps = 1>
  <cfset application.rate_limiter[CGI.REMOTE_ADDR].last_attempt = Now()>
</cfif>


Related Entries
11 people found this page useful, what do you think?

Trackback Address: 623/E52715069FFF9476B54A05F9A9715994
On 01/31/2007 at 3:10:52 PM MST Jason Troy wrote:
1
Pete, check out this project from Jake Munson cfformprotect.riaforge.org

On 01/31/2007 at 3:16:13 PM MST jonese wrote:
2
Have your tried the CFAkismet CFC?

http://devnulled.com/cfakismet

We put it on our blog (http://blog.d-p.com) and love it.

On 02/01/2007 at 7:47:30 AM MST Dan G. Switzer, II wrote:
3
@Pete:

You might want to adjust the 1 comment per 5 minutes to at least 2 commments. 1 seems a little to strict--especially in the case where someone wants to post an addendum to what they typed.

On 02/01/2007 at 8:10:35 AM MST Pete Freitag wrote:
4
Hey Dan,

Actually it does allow for two comments since it says GT 1 and the attempts are incremented after that point. I wasn't clear about that in my post however. Thanks for pointing that out.

On 05/04/2007 at 12:56:09 AM MDT idwebtemplate wrote:
5
I can understand your code. Could you give me the PHP version please

On 08/14/2007 at 10:15:14 PM MDT Bob wrote:
6
Great site!e

On 08/23/2007 at 8:49:40 PM MDT Bob wrote:
7
Good luck with your site in the future!e

On 10/12/2007 at 5:30:16 AM MDT Tim wrote:
8
Good job, here and there!k

On 01/29/2008 at 6:58:32 PM MST Hiskseifs wrote:
9
Hello heavenly worck new look senks void akaaunting Bye

On 02/23/2008 at 8:03:05 AM MST Hannes wrote:
10
Just wanted to say helloo

On 02/25/2008 at 7:43:06 PM MST jammarlibre wrote:
11
Hi our little brothers.c




  



Spell Checker by Foundeo





Subscribe to my RSS Feed: solosub RSS
Tags