10 steps to testing the bullet proofing user inputs
or how to avoid being caught by nasties when your script goes live!
1. Test it works with intended entries.
It's not going to be much good if it falls over when someone entered a valid piece of data!
2. Test it works (fails correctly) with erroneous entries.
Does it reject entries that should be rejected? Does it place the invalid text back in the form for the user to correct it? Does it also "sticky" the other fields, including selects, checkboxes and radio buttons, so that the user doesn't have to re-enter them? Does it offer a good explanation to the user of what the error was, and what inputs are acceptable?
3. Test it acts appropriately with inputs that include awkward characters and sequences
such as < and " and ' and & and ../ and .htaccess ... and 3.5
where you've asked for a whole number. These are all important "security issues"; you should check that you're protected against ugly display echos if someone enters an HTML tag, SQL injection attacks, and file names that are reserved or navigate the directory tree.
4. Test it against a whole file of inputs
There may be some "odd" cases you haven't thought of in the testing above. Do you have a whole file of data / inputs that you can run the script against? Example of what you might find
- a user name gets confused with another user name that's a shortened form of it. I recall having "issues" with a computer called seal
and another called sealion
5. Test it works without cookies and on different browsers.
6. How do you implement your acceptable user policy?
If your script is publishing the information entered on your site, how do you monitor for acceptable content? If it's a voting script, have you prevented one person rigging the system by multi-voting? If it's an online test, have you prevented your user selecting the back button and correcting his answers when you've told him he got a question wrong?
7. Have your colleague test that it works for him / her.
Even with all of the above, you may overlook something. Or what is obvious
to you might not be to someone else (e.g. is the submit button clear ...). Better to find this sort of thing out before you've got 000s of users.
8. Have the person who commissioned the script test that it works for him / her.
Very much worthwhile having your paymaster on site, and after following the steps above the script should be impressibe in its robustness. Oh - and if it goes pear-shaped later, you did
have the approval of the commissioner.
9. Release to some "tame" customers.
Chances are that everyone who's used the script up to this point has been deeply involved and knows what it's about. Having a few customers look and provide feedback at a late stage will alert you to anything which is blindingly obvious in-house but not at all clear to Joe Public.
10. Release to the world.
... with a feedback link, and do make sure that you have a look at the log files and see the pattern of use. (written 2005-08-27, updated 2008-05-17)
Associated topics are indexed as below, or enter http://melksh.am/nnnn for individual articlesY202 - Python on the Web 
Crossfertilisation, PHP to Python - (2005-03-06) 
FTP - how to make the right transfers - (2005-09-01) 
Pieces of Python - (2006-10-23) 
Moodle, Drupal, Django (and Rails) - (2008-08-08) 
Handling nasty characters - Perl, PHP, Python, Tcl, Lua - (2009-06-14) 
Counting Words in Python via the web - (2009-08-18) 
Quick and easy - showing Python data hander output via a browser - (2013-05-15) 
Which (virtual) host was visited? Tuning Apache log files, and Python analysis - (2015-01-23) 
Json load from URL, recursive display, Python 3.4 - (2015-10-14)P609 - Perl - Network Security 
Security considerations in programming - what do we teach? - (2010-03-22)P404 - Perl - Extending Flexibility Using CGI 
Danny and Donna are getting married - (2006-02-03) 
Simple but rugged form handling demo - (2006-03-10) 
Updating a page strictly every minute (PHP, Perl) - (2007-05-14) 
Korn Shell scripts on the web - (2007-09-25)H117 - Security in PHP 
Spotting a denial of service attack - (2005-06-12) 
A lion in a cage - PHP - (2006-11-10) 
What is an SQL injection attack? - (2006-11-27) 
Learning to write secure, maintainable PHP - (2007-01-25) 
Injection attacks - safeguard your PHP scripts - (2007-02-20) 
Easy handling of errors in PHP - (2007-08-27) 
Error logging to file not browser in PHP - (2007-10-11) 
Using PHP to upload images / Store on MySQL database - security questions - (2007-10-19) 
A story about benchmarking PHP - (2007-12-23) 
Are nasty programs looking for security holes on your server? - (2008-02-17) 
PHP - Sanitised application principles for security and useability - (2008-06-16) 
Defensive coding techniques in PHP? - (2008-07-02) 
Who is watching you? - (2008-08-10) 
Injection Attacks - avoiding them in your PHP - (2008-08-31) 
Injection Attack if register_globals in on - PHP - (2009-02-04) 
Protecting your images from use out of context - (2010-08-29) 
Catchable fatal error in PHP ... How to catch, and alternative solutions such as JSON - (2011-03-22) 
How to stop forms on other sites submitting to your scripts - (2012-04-15) 
An easy way to comply with the new cookie law if your site is well designed - (2012-06-02) 
A small teaching program - demonstration of principles only - (2016-02-08)H115 - Designing PHP-Based Solutions: Best Practice 
Short underground journeys and a PHP book - (2004-11-19) 
Putting a form online - (2005-03-29) 
Code and code maintainance efficiency - (2005-06-08) 
A year on - should we offer certified PHP courses - (2005-07-28) 
Merging pictures using PHP and GD - (2006-01-13) 
Giving the researcher power over database analysis - (2006-01-22) 
Reporting on the 10 largest files or 10 top scores - (2006-08-20) 
PHP - good coding practise and sticky radio buttons - (2006-10-17) 
Global, Superglobal, Session variables - scope and persistance in PHP - (2006-11-21) 
Code quality counts - (2006-11-26) 
Maintainable code - some positive advice - (2007-01-21) 
Back button - ensuring order are not submitted twice (PHP) - (2007-04-28) 
Good Programming practise - where to initialise variables - (2007-05-09) 
Painting a masterpiece in PHP - (2007-05-10) 
Drawing hands on a clock face - PHP - (2007-05-19) 
Resetting session based tests in PHP - (2007-08-26) 
Using a MySQL database to control mod_rewrite via PHP - (2007-10-06) 
Controlling and labelling Google maps via PHP - (2007-10-13) 
Converting from postal address to latitude / longitude - (2007-10-13) 
Ordnance Survey Grid Reference to Latitude / Longitude - (2007-10-14) 
Efficient PHP applications - framework and example - (2007-12-28) 
Software to record day to day events and keep an action list - (2007-12-31) 
Short and sweet and sticky - PHP form input - (2008-02-06) 
PHP Techniques - a workshop - (2008-04-26) 
Refactoring - a PHP demo becomes a production page - (2008-09-12) 
Improving the structure of your early PHP programs - (2009-05-25) 
Adding a newsfeed for your users to a multipage PHP application - (2009-06-06) 
Not just a PHP program - a good web application - (2009-09-29) 
How to build a test harness into your PHP - (2010-03-16) 
Separating program and artwork in PHP - easier maintainance, and better for the user - (2011-12-05) 
PHP sessions - a best practice teaching example - (2012-07-27) 
Filtering PHP form inputs - three ways, but which should you use? - (2012-11-18) 
Even early on, separate out your program from your HTML! - (2013-04-25) 
We not only teach PHP and Python - we teach good PHP and Python Practice! - (2013-06-18) 
Learning to program - comments, documentation and test code - (2014-11-22) 
Using an MVC structure - even without a formal framework - (2016-02-07) 
Real life PHP application using our course training MVC example - (2016-06-05)
Some other Articles
Linux commands - some basicsCharlie on MondaySwindon - Chippenham - Melksham - Trowbridge - Westbury train serviceThe Melksham train - a button is pushedRobust checking of data entered by usersCaching an XML feedHow not to run a forumA Victorian LadyPHP Magic QuotesDon't repeat code - use loops or functions