Anti Referral Spam Patch
CAPTCHA control helps me to fight comment spam. It is very effective. Nevertheless, I get lots of referrer spam each day during these months. Even though the most aggressive IPs are banned on the hosters level, I still get each day about 100 referrer spam records in the database. Usually I delete them and have already created a T-SQL script, that does the work. There are not so many anti-referrer spam solutions for .Text based engines. Almost all of them use instead of trigger that work around the original .Text T-SQL procedure to patch the table. I think, that instead of trigger is not a good solution because of performance overhead and trigger maintenance. Instead, my solution uses 2 simple patches to stored procedures.
Step 1 -- Create a banned keywords table and fill it with keywords (like poker). Something like that:
CREATE TABLE blog_BannedURLs ( theWord VARCHAR (255) NOT NULL, CONSTRAINT [PK_blog_BannedURLs] PRIMARY KEY CLUSTERED ( theWord ) ON [PRIMARY] ) ON [PRIMARY] GO
Step 2 -- Patch blog_GetUrlID procedure
ALTER PROC dbo.blog_GetUrlID ( @Url NVARCHAR(255) ,@UrlID INT OUT ) AS BEGIN SET NOCOUNT ON SET @UrlID = -1 IF ((@Url IS NOT NULL) AND (LEN(@Url) > 0)) BEGIN SELECT @UrlID = UrlID FROM blog_Urls WITH (NOLOCK) WHERE Url = @Url IF (@@ROWCOUNT = 0) BEGIN DECLARE @BannedWordsCount INT SELECT @BannedWordsCount = COUNT(theWord) FROM blog_bannedURLs WITH (NOLOCK) WHERE CHARINDEX(theWord, @URL, 0) > 0 IF (@BannedWordsCount) > 0 BEGIN SELECT @UrlID = -1 END ELSE BEGIN INSERT INTO blog_Urls VALUES(@Url) SELECT @UrlID = @@IDENTITY END END END SET NOCOUNT OFF END
Step 3 -- add (@UrlID > -1) to the IF in InsertReferral
ALTER PROC dbo.blog_InsertReferral ... ... IF ((@UrlID IS NOT NULL) AND (@UrlID > -1))
It's ready. Enjoy :)
Updated 2005-04-02
Saturday, March 26, 2005 2:29 AM