<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html; charset=ISO-8859-1"
 http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
&gt; Jim you are absolutely right - but there are some cases where you
need
the *big hammer* approach.<br>
<br>
You are starting to sound like a WAF vendor. I think Imperva is hiring
for sales....<br>
<br>
*ducks*<br>
<br>
&lt;soapbox&gt;<br>
Comon boys - Risk Management is often used to justify NOT doing the
right thing. Around these parts we OUTPUT ENCODE CONTEXTUALLY FOR ALL
OUTPUT. NOTHING ELSE STOPS XSS.<br>
&lt;/soapbox&gt;<br>
<br>
Cheers,<br>
- Jim<br>
<br>
<br>
<blockquote cite="mid:4BE4A15E.5010304@gmail.com" type="cite">
  <meta content="text/html; charset=ISO-8859-1"
 http-equiv="Content-Type">
Jim you are absolutely right - but there are some cases where you need
the *big hammer* approach... I can vouch for that - especially as a
means of getting ESAPI into the door and implemented in a bloated and
ever evolving enterprise codebase. <br>
  <br>
I am not saying this is the *right* way to do things, and I pointed out
in the last part of my reply that while this works for a big hammer
approach it is *not* 100% reliable and it is not quite so daunting to
carve out sections of a site and implement the tags or scriptlet to do
it correctly.. :)<br>
  <br>
Sometimes you gotta prove that something helps when it is used in not
quite the 100% quite correct way just to get it in so you can do things
correctly... You've worked with stubborn managers before.. *g*<br>
  <br>
On 5/7/2010 5:17 PM, Jim Manico wrote:
  <blockquote cite="mid:4BE49F81.7030707@owasp.org" type="cite">
    <meta content="text/html; charset=ISO-8859-1"
 http-equiv="Content-Type">
&gt;&nbsp; You just create an HttpServletRequestWrapper that returns the
encoded
values.<br>
    <br>
Beef... Noooooo!<br>
    <br>
I can't agree with that. This filter method only encodes data in the
HTML body context - leaving all other display contexts vulnerable to
XSS!<br>
    <br>
I implore you to manually encode each variable per <a
 moz-do-not-send="true" class="moz-txt-link-freetext"
 href="http://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet">http://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet</a>
- you can even come up with a few regular expressions to do mass
search-and-replace for some cases.<br>
    <br>
My 2 cents,<br>
Jim<br>
    <br>
    <blockquote cite="mid:4BE4872A.7010103@gmail.com" type="cite">
      <meta content="text/html; charset=ISO-8859-1"
 http-equiv="Content-Type">
Ramesh - (Please use the ESAPI-USER list - this list is deprecated.)<br>
      <br>
You just create an HttpServletRequestWrapper that returns the encoded
values.<br>
      <br>
public class MyWrapper extends HttpServletRequestWrapper {<br>
&nbsp;&nbsp; @Override<br>
&nbsp;&nbsp; public String getParameter(String key) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ESAPI.encoder().encodeForHTML( super.getParameter( key
) );<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch ( Exception e ) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ESAPI.getLogger( "MyWrapper" ).error(
org.owasp.esapi.Logger.EVENT_FAILURE, "Unable to encode value", e );<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<br>
&nbsp;&nbsp; }<br>
}<br>
      <br>
Obviously, this is a overly simplified version, but it conveys the
point. <br>
      <br>
I am curious what you are going for by re-encoding for HTML,
HTMLAttribute, CSS, and JS?<br>
      <br>
I understand the desire to not have to make changes to a *ton* of jsps
to get this going quickly, and the above works as a good *big hammer*
solution to solve most problems quickly, but ultimately you are going
to want to make sure that you start implementing the encoding correctly
in your view code as you go. It is pretty easy to carve out sections of
a site and go through that section using the ESAPI tablibs or scriptlet
to call the correct one. <br>
      <br>
Hope this has been helpful. <br>
      <br>
Thanks <br>
      <br>
On 5/7/2010 2:28 PM, Kesavanarayanan, Ramesh wrote:
      <blockquote
 cite="mid:A94809599F3A1E41B0BC7AA9823ED8FE02DDF984@usiowacncspmx01.NCSP.PEROOT.COM"
 type="cite">
        <meta http-equiv="Content-Type"
 content="text/html; charset=ISO-8859-1">
        <meta name="Generator"
 content="MS Exchange Server version 6.5.7654.12">
        <title>RE: Implementation of Global Output Encoder with ESAPI</title>
<!-- Converted from text/rtf format -->
        <p dir="LTR"><span lang="en-us"></span></p>
        <p dir="LTR"><span lang="en-us"></span><span lang="en-us"><font
 face="Arial" size="2">I have a question on the output encoding using
the ESAPI.</font></span></p>
        <p dir="LTR"><span lang="en-us"><font face="Arial" size="2">In
my
application I tried to implement the ESAPI for the response output
encoding in a centralized manner so that I do not need to change every
JSP page in my application.</font></span></p>
        <p dir="LTR"><span lang="en-us"><font face="Arial" size="2">The
following is the piece of code I have written using my sessionFilter.</font></span></p>
        <p dir="LTR"><span lang="en-us"><font face="Arial" size="2">import
java.io.CharArrayWriter;</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="Arial"
 size="2">public
void
doFilter(ServletRequest request, ServletResponse response,</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font
 face="Arial" size="2">FilterChain chain) throws ServletException,
IOException {</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font
 face="Arial" size="2">HttpServletRequest httpRequest =
(HttpServletRequest)
request;</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font
 face="Arial" size="2">HttpServletResponse httpResponse =
(HttpServletResponse)
response;</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font
 face="Arial" size="2">HttpSession session = httpRequest.getSession();</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font
 face="Arial" size="2">ServletResponse newResponse = null;</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font
 face="Arial" size="2">if (request instanceof HttpServletRequest) {</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font
 face="Arial" size="2">newResponse = new CharResponseWrapper(</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="Arial" size="2">(HttpServletResponse) response);</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font
 face="Arial" size="2">}</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font
 face="Arial" size="2">chain.doFilter(request, response);</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font
 face="Arial" size="2">String text = newResponse.toString();</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font
 face="Arial" size="2">text = text.toUpperCase();</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font
 face="Arial" size="2">text = ESAPI.encoder().encodeForHTML(text);</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font
 face="Arial" size="2">text =
ESAPI.encoder().encodeForHTMLAttribute(text);</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font
 face="Arial" size="2">text = ESAPI.encoder().encodeForJavaScript(text);</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font
 face="Arial" size="2">text = ESAPI.encoder().encodeForCSS(text);</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font
 face="Arial" size="2">CharArrayWriter caw = new CharArrayWriter();</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font
 face="Arial" size="2">if (text != null) {</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font
 face="Arial" size="2">try {</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        <font face="Arial" size="2">caw.write(text);</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        <font face="Arial" size="2">response.getWriter().write(caw.toString());</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font
 face="Arial" size="2">} catch (java.lang.IllegalStateException ille) {</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font
 face="Arial" size="2">}</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font
 face="Arial" size="2">}</font></span></p>
        <p dir="LTR"><span lang="en-us"><font face="Arial" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</font></span></p>
        <p dir="LTR"><span lang="en-us"><font face="Arial" size="2">In
my
JSP
I have the code as follows</font></span></p>
        <p dir="LTR"><span lang="en-us"></span><span lang="en-us"><b><u><font
 face="Arial" size="2">Not working</font></u></b></span></p>
        <p dir="LTR"><span lang="en-us"></span><span lang="en-us"><font
 face="Arial" size="2">&lt;script&gt;</font></span></p>
        <p dir="LTR"><span lang="en-us"><font face="Arial" size="2">function
setUserName(){</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font face="Arial"
 size="2">
document.getElementById("login").value ='&lt;%=
(String)request.getAttribute("username")&nbsp; %&gt;';</font></span></p>
        <p dir="LTR"><span lang="en-us"><font face="Arial" size="2">}</font></span></p>
        <p dir="LTR"><span lang="en-us"><font face="Arial" size="2">&lt;/script&gt;</font></span></p>
        <p dir="LTR"><span lang="en-us"></span><span lang="en-us"><b><u><font
 face="Arial" size="2">Working</font></u></b></span></p>
        <p dir="LTR"><span lang="en-us"></span><span lang="en-us"><font
 face="Arial" size="2">&lt;%!</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="Arial"
 size="2">String
cleanXSS(String
value) {</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font
 face="Arial" size="2">value = ESAPI.encoder().encodeForHTML(value);</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font
 face="Arial" size="2">value =
ESAPI.encoder().encodeForHTMLAttribute(value);</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font
 face="Arial" size="2">value =
ESAPI.encoder().encodeForJavaScript(value);</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font
 face="Arial" size="2">value = ESAPI.encoder().encodeForCSS(value);</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font
 face="Arial" size="2">return value;</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="Arial"
 size="2">}</font></span></p>
        <p dir="LTR"><span lang="en-us"><font face="Arial" size="2">%&gt;</font></span></p>
        <p dir="LTR"><span lang="en-us"></span><span lang="en-us"></span></p>
        <p dir="LTR"><span lang="en-us"></span><span lang="en-us"><font
 face="Arial" size="2">&lt;script&gt;</font></span></p>
        <p dir="LTR"><span lang="en-us"><font face="Arial" size="2">function
setUserName(){</font></span></p>
        <p dir="LTR"><span lang="en-us">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font face="Arial"
 size="2">
document.getElementById("login").value ='&lt;%= cleanXSS(&nbsp;
(String)request.getAttribute("username")&nbsp; ) %&gt;';</font></span></p>
        <p dir="LTR"><span lang="en-us"><font face="Arial" size="2">}</font></span></p>
        <p dir="LTR"><span lang="en-us"><font face="Arial" size="2">&lt;/script&gt;</font></span></p>
        <p dir="LTR"><span lang="en-us"><font face="Arial" size="2">As
you
can see I expect the response to be updated with the ESAPI functions,
but somewhere I loose the ESAPI. The idea for me is to centralize the
output encoding so that it saves me time and effort.</font></span></p>
        <p dir="LTR"><span lang="en-us"><font face="Arial" size="2">Appreciate
if
you
have
any pointers on the same.</font></span></p>
        <p dir="LTR"><span lang="en-us"></span><span lang="en-us"></span></p>
        <p dir="LTR"><span lang="en-us"></span><span lang="en-us"></span><b><i><span
 lang="en-us"><font color="#008080" face="Arial" size="2">Regards |&nbsp;
Ramesh Kesavanarayanan&nbsp; |&nbsp;&nbsp; &nbsp;319-354-9200 ext 215785 / 215972 (O)</font></span></i></b><span
 lang="en-us"></span><span lang="en-us"></span><b><i><span lang="en-us"></span></i></b><span
 lang="en-us"></span><span lang="en-us"></span><b><i><span lang="en-us">
        <font color="#008080" face="Arial" size="2">|&nbsp; /</font></span></i></b><span
 lang="en-us"></span><span lang="en-us"></span><span lang="en-us"><font
 color="#008080" face="Arial" size="2">&nbsp;</font></span><span lang="en-us"></span><span
 lang="en-us"></span><b><i><span lang="en-us"></span></i></b><span
 lang="en-us"></span><span lang="en-us"></span><b><i><span lang="en-us">
        <font color="#008080" face="Arial" size="2">319-621-7641 (M)&nbsp;</font></span></i></b><span
 lang="en-us"></span><span lang="en-us"></span><span lang="en-us"></span><span
 lang="en-us"></span><span lang="en-us"></span><span lang="en-us"> <font
 color="#008080" face="Arial" size="2">&nbsp;|&nbsp;</font></span><span
 lang="en-us"></span><a moz-do-not-send="true"
 href="mailto:ramesh.kesavanarayanan@pearson.com"><span lang="en-us"></span><span
 lang="en-us"></span><b><i><u><span lang="en-us"><font color="#0000ff"
 face="Arial" size="2">ramesh.kesavanarayanan@pearson.com</font></span></u></i></b><span
 lang="en-us"></span></a><span lang="en-us"></span><span lang="en-us"></span></p>
        <p dir="LTR"><span lang="en-us"></span></p>
        <pre wrap=""><fieldset class="mimeAttachmentHeader"></fieldset>
_______________________________________________
OWASP-ESAPI mailing list
<a moz-do-not-send="true" class="moz-txt-link-abbreviated"
 href="mailto:OWASP-ESAPI@lists.owasp.org">OWASP-ESAPI@lists.owasp.org</a>
<a moz-do-not-send="true" class="moz-txt-link-freetext"
 href="https://lists.owasp.org/mailman/listinfo/owasp-esapi">https://lists.owasp.org/mailman/listinfo/owasp-esapi</a>
  </pre>
      </blockquote>
      <pre wrap=""><fieldset class="mimeAttachmentHeader"></fieldset>
_______________________________________________
OWASP-ESAPI mailing list
<a moz-do-not-send="true" class="moz-txt-link-abbreviated"
 href="mailto:OWASP-ESAPI@lists.owasp.org">OWASP-ESAPI@lists.owasp.org</a>
<a moz-do-not-send="true" class="moz-txt-link-freetext"
 href="https://lists.owasp.org/mailman/listinfo/owasp-esapi">https://lists.owasp.org/mailman/listinfo/owasp-esapi</a>
  </pre>
    </blockquote>
    <br>
    <br>
    <pre class="moz-signature" cols="72">-- 
Jim Manico
OWASP Podcast Host/Producer
OWASP ESAPI Project Manager
<a moz-do-not-send="true" class="moz-txt-link-freetext"
 href="http://www.manico.net">http://www.manico.net</a></pre>
  </blockquote>
</blockquote>
<br>
<br>
<pre class="moz-signature" cols="72">-- 
Jim Manico
OWASP Podcast Host/Producer
OWASP ESAPI Project Manager
<a class="moz-txt-link-freetext" href="http://www.manico.net">http://www.manico.net</a></pre>
</body>
</html>