This site is the archived OWASP Foundation Wiki and is no longer accepting Account Requests.
To view the new OWASP Foundation website, please visit https://owasp.org

How to perform HTML entity encoding in Java

From OWASP
Revision as of 12:33, 15 January 2008 by Stephendv (talk | contribs) (Status)

Jump to: navigation, search

Status

Released 14/1/2008

Overview

Injection attacks rely on the fact that interpreters take data and execute it as commands. If an attacker can modify the data that's sent to an interpreter, they may be able to make it misbehave. One way to help prevent this from happening is to encode the attacker's data in such a way that the interpreter will not get confused. HTML entity encoding is just such an encoding mechanism for many interpreters.

This is not a guarantee by the way. It's almost certain that someone, probably from the XML/Web Services world, will create an engine that performs HTML entity decoding automatically, thus reintroducing the injection threat. However, for the time being, HTML entity encoding seems to work pretty well to prevent many types of injection.


Approach

We're going to implement a simple little method that encodes special characters. The nice .NET folks over at Microsoft had the foresight to build this into their platform, but the Java community seems to resist adding validation to the Java EE environment despite all the security issues that it could solve. View layers such as Java Server Faces, Spring-MVC, WebWork and others automatically perform HTML encoding through custom tags.

The best place for this method is in some kind of ValidationEngine, but since it's a good candidate for being static, it doesn't matter what class it ends up in that much.

Note that this implementation doesn't produce the special characters like & lt; or & gt; - but it's not difficult to implement with a simple lookup table.

   public static String HTMLEntityEncode( String s )
   {
       StringBuffer buf = new StringBuffer();
       int len = (s == null ? -1 : s.length());

       for ( int i = 0; i < len; i++ )
       {
           char c = s.charAt( i );
           if ( c>='a' && c<='z' || c>='A' && c<='Z' || c>='0' && c<='9' )
           {
               buf.append( c );
           }
           else
           {
               buf.append( "&#" + (int)c + ";" );
           }
       }
       return buf.toString();
   }

Libraries