PHP Classes

PHP Input Filter: Filter out unwanted PHP / Javascript / HTML tags.

Recommend this page to a friend!
  Info   Screenshots Screenshots   View files View files (6)   DownloadInstall with Composer Download .zip   Reputation   Support forum (25)   Blog    
Ratings Unique User Downloads Download Rankings
StarStarStarStar 69%Total: 20,644 All time: 31 This week: 153Down
Version License Categories
inputfilter 1.0.0GNU General Publi...Text processing, Security
Description 

Author

This class can filter input of stray or malicious PHP, Javascript or HTML tags and to prevent cross-site scripting (XSS) attacks. It should be used to filter input supplied by the user, such as an HTML code entered in form fields.

I have tried to make this class as easy as possible to use. You have control over the filter process unlike other alternatives, and can input a string or an entire array to be cleaned (such as $_POST).

** SQL Injection feature has been added.

Innovation Award
PHP Programming Innovation award nominee
March 2005
Number 4


Prize: One subscription to the PDF edition of the magazine by PHP Architect
One of the most common security problems of Web sites is the vulnerability to cross-site scripting (XSS) attacks.

It allows to steal values of cookies that can be sent to different sites from those that originated the cookie values. This may allow an attacker to access a site impersonating an authenticated user by taking advantage of a stollen session cookie.

This kind of vulnerability exists on sites that display information provided by the users without properly escaping it before presenting in HTML pages. If the user supplied information to be displayed is unformatted text, it can be easily escaped by using the PHP function HTMLEntities().

However, if an user can submit HTML code to a site that displays it without previous validation and eventual cleaning of malicious Javascript or PHP code, the site is vulnerable to eventual cross-site scripting attacks.

This class provides a solution to perform the necessary cleaning of HTML code from dangerous cross-site scripting attack code.

Manuel Lemos
Picture of Daniel Morris
Name: Daniel Morris <contact>
Classes: 1 package by
Country: United Kingdom
Age: 40
All time rank: 836 in United Kingdom
Week rank: 312 Down8 in United Kingdom Down
Innovation award
Innovation award
Nominee: 1x

Recommendations

Input Filter
strip unwanted tags , words in post method

Details

<PHP INPUT FILTER - README> In Brief ------------------------------------------------------------------------------------------ Any website that has html forms should really use some sort of `cleaning` process to filter out malicious code, or simply unwanted html tags for style reasons. This class can filter input of stray or malicious PHP, Javascript or HTML tags. It can be used to prevent cross-site scripting (XSS) attacks. It should be used to filter input supplied by the user, such as an HTML code entered in form fields. You would create the filter object, configure it with your own settings, then call its process method to clean the form input values. Background ------------------------------------------------------------------------------------------ Initially this class was developed to allow developers such as myself to strip certain tags from user input, for stylistic reasons. I'm not a big fan of BBTags such as [url]. The scope of this tool was expanded however to allow automated and extensive filtering of input with anti-XSS capabilities. XSS related reading ------------------------------------------------------------------------------------------ Unfortunately, php's inbuilt strip_tags($) doesn't filter out unwanted attributes. This can allow XSS (Cross Site Scripting) attacks to launch malicious javascript or code. Introduction to XSS: http://blog.bitflux.ch/wiki/XSS_Prevention http://www.globodigital.net/Documentation/Security_Articles/The_Cross_Site_Scripting_FAQ/ http://www.sandsprite.com/Sleuth/papers/RealWorld_XSS_1.html XSS Cheat Sheet (Required reference reading!): http://www.shocking.com/~rsnake/xss.html This class's XSS blacklist page: http://cyberai.com/inputfilter/blacklist.php Instructions ------------------------------------------------------------------------------------------ Using the inputFilter class is simple, and described below; 0) Include Class-File ------------------------------------- Goes somewhat without saying to move the version of the classfile you would like to use into your website's classfiles directory and include it. 1) User-Defined Arrays ------------------------------------- Setup either just a tags array, or additionally an attributes array. Eg.. $tags = array("em", "strong"); 2) New Object ------------------------------------- (If you do not enter any parameters, problem-tag stripping will still take place) Instantiate the class with your settings. 1st (tags array): Optional (since 1.2.0) 2nd (attr array): Optional 3rd (tags method): 0 = remove ALL BUT these tags (default) 1 = remove ONLY these tags 4th (attr method): 0 = remove ALL BUT these attributes (default) 1 = remove ONLY these attributes 5th (xss autostrip): 1 = remove all identified problem tags (default) 0 = turn this feature off Eg.. $myFilter = new InputFilter($tags, $attributes, 0, 0); 3) Process inputs ------------------------------------- Process as many input variables as you like. The example.php file shows you working examples. You can pass a string variable or an array-of-strings. Another real-world example could be to `clean` a submitted HTML form reading for processing. You would simply setup the filter and call... $_POST = $myFilter->process($_POST); $_GET["name"] = $myFilter->process($_GET["name"]); ...simple! (If you don't implement a secure cookie method, running the filter could prove wise!) SQL Injection (Experimental) ------------------------------------------------------------------------------------------ This feature is new, for more info, go here: http://cyberai.com/inputfilter/examples/sql-inject.php Methods of use... - $connection is valid MySQL-Resource variable. - $source is some string containing SQL injection attack(s). 0) Similar to standard usage ------------------------------------- $myFilter = new InputFilter(); $source = $myFilter->safeSQL($source, $connection); 1) Alongside standard usage ------------------------------------- $myFilter = new InputFilter(); $source = $myFilter->safeSQL($myFilter->process($source), $connection); 2) As class method ------------------------------------- $source = InputFilter::safeSQL($source, $connection); 3) Perform on array-of-strings ------------------------------------- $_POST = InputFilter::safeSQL($_POST, $connection); Advanced Features In Brief ------------------------------------------------------------------------------------------ 1) XHTML ---------------------- single tags: - Before: <br> - After: <br /> single attributes: - Before: <tag attr> - After: <tag attr="attr"> 2) XSS ------------------------ customisation: - You have control over which tags and attributes to allow. Automation: - Auto-strip tags whose tagnames contain non-alpha characters (<?php for instance) - Auto-strip attributes containing javascript. - Auto-strip blacklisted tags and attributes, as well as ALL action listener attributes. ( Available at http://cyberai.com/inputfilter/blacklist.php ) Blacklist: - Choose to strip blacklisted problem tags and attributes. Anti-sneak: - Embedded newlines and other whitespace or encoded characters do not fool the parser Nested-tag protection: - Before: test <stron<strong>g>message</stron</strong>g> - After: test message Alternatives ------------------------------------------------------------------------------------------ It has come to my attention that there is indeed a PEAR package to format bad html and XSS. http://pear.php.net/pepr/pepr-proposal-show.php?id=199 I do feel they take a different approach to me, and do not offer customisible tag-stripping. They do however offer more substantial XHTML reconstructing, and a stable alternative to this tool. I have included the link so you can judge for yourself. :-) Request For Comments ------------------------------------------------------------------------------------------ I'd love to know if you're using the InputFilter class, and what you think of it. Please feel free to email me: dan@rootcube.com Patch Contributors ------------------------------------------------------------------------------------------ Gianpaolo Racca, Ghislain Picard, Marco Wandschneider, Chris Tobin and Andrew Eddie. Many Thanks to everyone else who has emailed! ChangeLog ------------------------------------------------------------------------------------------ (Line numbers reference the commented php4/php5 version of classfile) 1.2.2 - Improved nested tag detection. - Patch accepted: Ghislain Picard. Changed eregi() to preg_match(), and well as allowing for numeric characters in tags on line 133. - Patch accepted: Marco Wandschneider - Wrote PHP5 version that does not cause any E_STRICT warnings. - Patch accepted: Chris Tobin - SQL Injection attack code (Lines 259-312 added.) - Patch accepted: Andrew Eddie - Added explicit cast to array for user-specified array parameters in constructor (Lines 37-38 changed.) - Requested feature: Lukas Slansky - <tag attr='blah'> converted to <tag attr="blah"> allowing for incorrect input to conform to XHTML standards. (Lines 213-215 added.) - Bugfix: Fixed a really dumb bug that was causing arrays to not be parsed. (Changed for() loop to a foreach() on line 52.) - Bugfix: Parser was mistaking attribute values "0" for a null value. (Lines 234-235 added.) 1.2.1 - Patch accepted: Gianpaolo Racca - Added trim() to line 195. 1.2.0 - Updated example-factory page - looks nicer, added "inject sample data" feature. - Many more XSS blocking features. - Rewrote some of the parser code over to be more efficient. - Have stopped producing seperate classfiles for php4 and php5. The current classfile will work with either! (If anyone would like be to continue making seperate files for each, drop me an email.) 1.1.2 - All tag and attribute names with non-alpha characters in are automatically stripped from now on (This applies to all programming tags, html comments and doctype tags too.) - User-defined arrays are converted to lowercase at object creation. A somewhat obvious problem I initially missed! (Had caused tag and attr matching to fail if Capitals used in arrays) 1.1.1 - Bugfix: to do with spaces in between attr name and value. - Bugfix: to do with single attributes. 1.1.0 - Support for array as input. - PHP5 version of class available. 1.0.1 - Bugfix: involved ignored tag attribute values with spaces in. 1.0.0 - Release version.

Screenshots  
  • testsuite.png
  Files folder image Files  
File Role Description
Accessible without login Plain text file class.inputfilter.php Class PHP4/PHP5 with comments
Plain text file class.inputfilter.php5 Class PHP5-Strict with comments
Accessible without login Plain text file class.inputfilter_clean.php Class PHP4/PHP5 without comments
Plain text file class.inputfilter_clean.php5 Class PHP5-Strict without comments
Accessible without login Plain text file index.php Example Play around with your own examples on the fly.
Accessible without login Plain text file readme.txt Doc. Blurb / Instructions / Features

 Version Control Unique User Downloads Download Rankings  
 0%
Total:20,644
This week:0
All time:31
This week:153Down
User Ratings User Comments (7)
 All time
Utility:89%StarStarStarStarStar
Consistency:82%StarStarStarStarStar
Documentation:82%StarStarStarStarStar
Examples:86%StarStarStarStarStar
Tests:-
Videos:-
Overall:69%StarStarStarStar
Rank:318
 
This is a horrific design.
10 years ago (Anthony)
10%Star
there is a problem if you write <> i think that the good sol...
11 years ago (moh roubla)
57%StarStarStar
You should give credit to the original author of the script, ...
12 years ago (Philip Rollins)
40%StarStarStar
ok
14 years ago (diego didels)
40%StarStarStar
Excellent class.
15 years ago (Tabor Carlton)
77%StarStarStarStar
It's a nice class to start with and even update it for better...
15 years ago (David Ferreira)
55%StarStarStar
Good Stuff! And its really fast
16 years ago (Nikolaj)
80%StarStarStarStarStar