You should check out this site: http://iamcal.com/publish/articles/php/processing_html/

It's in PHP and Perl, but it only took me a couple of hours to translate it to Java.

Sami Dalouche wrote:
Hi,

If you want to escape HTML, you can use Jakarta Commons-Lang
StringEscapeUtils class :
http://jakarta.apache.org/commons/lang/apidocs/org/apache/commons/lang/StringEscapeUtils.html#escapeHtml(java.lang.String)

Personally, I am using the Radeox Wiki engine
(http://www.radeox.org/space/start) to render all of my free-form text
areas.

Regards,
Sami

Le jeudi 15 mars 2007 à 01:15 -0400, Joseph McGranaghan a écrit :
Are you allowing the user to redisplay any entered HTML ala myspace?

I'm working on a solution for this right now. For this situation, I'm filtering it in action before it is saved to DB.

Here are some REs and a simple function:


private final static String XSS_BIG_OBJECTS_FILTER = "(((<\\s*[Aa][Pp][Pp][Ll][Ee][Tt].*>.*<\\s*/.*[Aa][Pp][Pp][Ll][Ee][Tt]\\s*>)|(<\\s*[Aa][Pp][Pp][Ll][Ee][Tt].*/\\s*>))|"+ "((<\\s*[Oo][Bb][Jj][Ee][Cc][Tt].*>.*<\\s*/.*[Oo][Bb][Jj][Ee][Cc][Tt]\\s*>)|(<\\s*[Oo][Bb][Jj][Ee][Cc][Tt].*/\\s*>))|"+ "((<\\s*[Ss][Cc][Rr][Ii][Pp][Tt].*>.*<\\s*/.*[Ss][Cc][Rr][Ii][Pp][Tt]\\s*>)|(<\\s*[Ss][Cc][Rr][Ii][Pp][Tt].*/\\s*>))|"+ "((<\\s*[Ee][Mm][Bb][Ee][Dd].*>.*<\\s*/.*[Ee][Mm][Bb][Ee][Dd]\\s*>)|(<\\s*[Ee][Mm][Bb][Ee][Dd].*/\\s*>))|"+ "(=\\s*[\"\']*\\s*[Jj][Aa][Vv][Aa][Ss][Cc][Rr][Ii][Pp][Tt]\\s*:.*[\"\']))"; private final static String XSS_BIG_TAGS_FILTER = "(((<\\s*[Ss][Ee][Rr][Vv][Ee][Rr].*>.*<\\s*/.*[Ss][Ee][Rr][Vv][Ee][Rr]\\s*>)|(<\\s*[Ss][Ee][Rr][Vv][Ee][Rr].*/\\s*>))|"+ "((<\\s*[Ff][Rr][Aa][Mm][Ee].*>.*<\\s*/.*[Ff][Rr][Aa][Mm][Ee]\\s*>)|(<\\s*[Ff][Rr][Aa][Mm][Ee].*/\\s*>))|"+ "((<\\s*[Ii][Ff][Rr][Aa][Mm][Ee].*>.*<\\s*/.*[Ii][Ff][Rr][Aa][Mm][Ee]\\s*>)|(<\\s*[Ii][Ff][Rr][Aa][Mm][Ee].*/\\s*>))|"+ "((<\\s*[Ff][Rr][Aa][Mm][Ee][Ss][Ee][Tt].*>.*<\\s*/.*[Ff][Rr][Aa][Mm][Ee][Ss][Ee][Tt]\\s*>)|(<\\s*[Ff][Rr][Aa][Mm][Ee][Ss][Ee][Tt].*/\\s*>)))"; /*
     *  No relative URLs
     *  No cross-domain URLs
     *
     *  Tags ( a,img,form,ilayer )
     */
private final static String XSS_NOT_HTTP_RE = "([^Hh]|[Hh][^Tt]|[Hh][Tt][^Tt]|[Hh][Tt][Tt][^Pp])*"; private final static String XSS_NOT_RELATIVE_NOR_XDOMAIN_LINKS_FILTER = "((<\\s*[Aa].*[Hh][Rr][Ee][Ff]\\s*=.*"+XSS_NOT_HTTP_RE+".*>.*>)|"+ "(<\\s*[Aa].*[Hh][Rr][Ee][Ff]\\s*=.*[Ee]-[Cc][Oo][Aa][Ll][Ee][Ss][Cc][Ee].*>.*>))"; /*
     *  handle img|ilayer src attributes
     */
private final static String XSS_NOT_RELATIVE_NOR_XDOMAIN_SRC_FILTER = "((<\\s*[Ii]([Mm][Gg]|[Ll][Aa][Yy][Ee][Rr]).*[Ss][Rr][Cc]\\s*=.*"+XSS_NOT_HTTP_RE+".*>.*>)|"+ "(<\\s*[Ii]([Mm][Gg]|[Ll][Aa][Yy][Ee][Rr]).*[Ss][Rr][Cc]\\s*=.*[Ee]-[Cc][Oo][Aa][Ll][Ee][Ss][Cc][Ee].*>.*>))"; /*
     *  form tags allowed, but action cannot be relative or xdomain
     */
private final static String XSS_FORMS_FILTER = "((<\\s*[Ff][Oo][Rr][Mm].*[Aa][Cc][Tt][Ii][Oo][Nn]\\s*=.*"+XSS_NOT_HTTP_RE+".*>.*<\\s*/\\s*[Ff][Oo][Rr][Mm]\\s*>)|"+ "(<\\s*[Ff][Oo][Rr][Mm].*[Aa][Cc][Tt][Ii][Oo][Nn]\\s*=.*[Ee]-[Cc][Oo][Aa][Ll][Ee][Ss][Cc][Ee].*>.*<\\s*/\\s*[Ff][Oo][Rr][Mm]\\s*>))"; /*
     *  target attributes need to be replaced with target='_blank'
     */
private final static String XSS_TARGET_ATTRIBUTES_FILTER = "\\s*[Tt][Aa][Rr][Gg][Ee][Tt]\\s*=\\s*((\'.*\')|(\".*\")|(_.*\\s*))"; private final static String BLANK_TARGET = " target=_blank ";
private String filterForHTMLRedisplay(String html){
String filtered = null; try{ RE reObjects = new RE(FormUtils.XSS_BIG_OBJECTS_FILTER);
            filtered = reObjects.subst(html," ");
RE reTags = new RE(FormUtils.XSS_BIG_TAGS_FILTER);
            filtered = reTags.subst(filtered," ");
RE reLinks = new RE(FormUtils.XSS_NOT_RELATIVE_NOR_XDOMAIN_LINKS_FILTER);
            filtered = reLinks.subst(filtered," ");
RE reSrc = new RE(FormUtils.XSS_NOT_RELATIVE_NOR_XDOMAIN_SRC_FILTER);
            filtered = reSrc.subst(filtered," ");
RE reForms = new RE(FormUtils.XSS_FORMS_FILTER);
            filtered = reForms.subst(filtered," ");
RE reTarget = new RE(FormUtils.XSS_TARGET_ATTRIBUTES_FILTER);
            filtered = reTarget.subst(filtered,FormUtils.BLANK_TARGET);
}catch(Exception e){ if(DEBUG){ System.out.println("\nFormUtils.filterForHTMLRedisplay: "+e.getMessage()+"\n");
            }
        }
if(filtered==null){
            return ("");
        }else{
            return ("\n<!--NO_EVAL-->\n\n"+filtered);
        }
    }


Again, I did most of this tonight so I haven't even ran it yet.
But I'd love some feedback if I'm fundamentally wrong.

Oh, the <!--NO_EVAL--> thing is so my AJAX execScript function knows not to
eval() any of this, just incase my REs don't catch everything.


-Joe




rapsy wrote:
Hi All,

I am trying to find a best solution to prevent Cross site scripting attacks.
I wrote a method to filter out all the bad characters. But my questions is
where should I call this method?
AT the form level, in setters method r action level or use a filter.

I think filter is a good option but I am not sure how to implement that.

Any help is appreciated!
Thanks


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]


Reply via email to