Shaun Mccran

My digital playground

15
J
U
L
2013

Stopping form submissions containing HTML code

Are you getting web form spam? I was, mainly from bots, or 'copy and paste' farms where users sit and paste bulk code into your forms. Mostly these contain links or image tags. Rather than compromise the form usability for genuine users I decided to fix my spam issue with a little more tact than you may usually find, such as in the case of Captcha devices.

I'm already cleaning html code submissions on the server side but why not make things even more informative for my users and tell them up front that their HTML isn't appreciated.

I didn't want a complicated Regex or pattern matching plugin, I simply wanted to detect key HTML elements and tell the user that it wasn't going to be accepted by the form. This code uses the JQuery plugin for form validation. You can get it here:

http://jqueryvalidation.org/

First things first, let's create a custom validation rule to detect our html elements.

view plain print about
1<s/cript language="javascript">
2$(document).ready(function(){
3
4 $.validator.addMethod("findhtml", function(value, element) {
5
6 var commentclean = true,
7 disallowed = ['<', 'http'];
8
9 for (var i=0, len = disallowed.length; i<len; i++) {
10 if (element.value.indexOf(disallowed[i]) != -1) {
11 commentclean = false;
12 break;
13 }
14 }
15
16 return this.optional(element) || ( commentclean );
17
18 }, "
* match the string");
19
20});    
21</s/cript>

This creates an array of disallowed elements and loops through them when the rule is invoked.

Secondly we will use this rule in our validation routine when a user tries to submit the form.

view plain print about
1<!--- Form now powered from JQuery --->
2    <s/cript type="text/javascript">
3        $(document).ready(function(){
4            $("#form").validate({
5            
6            rules: {
7                name: {required: true},
8                email: {required: true},
9                tel: {required: false},
10                message: {required: true, findhtml: true}
11             },
12
13            messages: {name: "Please enter your Name",
14                email: "Please enter a valid email address",
15                tel: "",
16                message: {required: "Please enter a message", findhtml: "You cannot enter HTML in this field"}
17             }
18            
19            });
20        });
21    </s/cript>
The key line here is:
view plain print about
1message: {required: true, findhtml: true}

This invokes our previously created validation rule.

In this way the user is told 'You cannot enter HTML in this field'. A friendly validation message that clearly shows WHY the form isn't going to work.

You can see this working on my contact form here : http://www.mccran.co.uk/contact/

09
F
E
B
2012

JQuery Countdown timer Plugin example

I'd previously used a JavaScript script to count down from a now() to a given date to display real time count down information on screen. I was cleaning up the project it was used on and wondered how easy it would be to push all the 'normal' JavaScript into a JQuery plugin and encapsulate it all into one function call.

[ More ]

06
F
E
B
2012

Forcing the dollar ($) Namespace within your JQuery functions

Whilst documenting some Open Source platforms for an upcoming project I found that several of the larger more prominent Open Source software solutions perform some subtle tweaks to included JavaScript libraries. In this case JQuery.

This is a short post on ho to ensure that the $ character always represents the JQuery library in your framework.

[ More ]

01
F
E
B
2012

Dynamically tagging content with Keywords using JQuery

I've used a ticketing system called Lighthouse App for a while now, and one of the features I really like about it is its ability to tag content with keywords in a very easy and obvious fashion.

If you have ever wanted to tag an article or some content with a list of Keywords then this blog article is for you.

[ More ]