[Esapi-user] [OWASP-ESAPI] Implementation of Global Output Encoder with ESAPI

Chris Schmidt chrisisbeef at gmail.com
Fri May 7 19:25:18 EDT 2010


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.

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.. :)

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*

On 5/7/2010 5:17 PM, Jim Manico wrote:
> >  You just create an HttpServletRequestWrapper that returns the
> encoded values.
>
> Beef... Noooooo!
>
> 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!
>
> I implore you to manually encode each variable per
> http://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet
> - you can even come up with a few regular expressions to do mass
> search-and-replace for some cases.
>
> My 2 cents,
> Jim
>
>> Ramesh - (Please use the ESAPI-USER list - this list is deprecated.)
>>
>> You just create an HttpServletRequestWrapper that returns the encoded
>> values.
>>
>> public class MyWrapper extends HttpServletRequestWrapper {
>>    @Override
>>    public String getParameter(String key) {
>>       try {
>>          return ESAPI.encoder().encodeForHTML( super.getParameter(
>> key ) );
>>       } catch ( Exception e ) {
>>          ESAPI.getLogger( "MyWrapper" ).error(
>> org.owasp.esapi.Logger.EVENT_FAILURE, "Unable to encode value", e );
>>       }
>>       return null;
>>    }
>> }
>>
>> Obviously, this is a overly simplified version, but it conveys the
>> point.
>>
>> I am curious what you are going for by re-encoding for HTML,
>> HTMLAttribute, CSS, and JS?
>>
>> 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.
>>
>> Hope this has been helpful.
>>
>> Thanks
>>
>> On 5/7/2010 2:28 PM, Kesavanarayanan, Ramesh wrote:
>>>
>>> I have a question on the output encoding using the ESAPI.
>>>
>>> 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.
>>>
>>> The following is the piece of code I have written using my
>>> sessionFilter.
>>>
>>> import java.io.CharArrayWriter;
>>>
>>>         public void doFilter(ServletRequest request, ServletResponse
>>> response,
>>>
>>>                         FilterChain chain) throws ServletException,
>>> IOException {
>>>
>>>                 HttpServletRequest httpRequest =
>>> (HttpServletRequest) request;
>>>
>>>                 HttpServletResponse httpResponse =
>>> (HttpServletResponse) response;
>>>
>>>                 HttpSession session = httpRequest.getSession();
>>>
>>>                 ServletResponse newResponse = null;
>>>
>>>                 if (request instanceof HttpServletRequest) {
>>>
>>>                         newResponse = new CharResponseWrapper(
>>>
>>>                                         (HttpServletResponse) response);
>>>
>>>                 }
>>>
>>>                 chain.doFilter(request, response);
>>>
>>>                 String text = newResponse.toString();
>>>
>>>                 text = text.toUpperCase();
>>>
>>>                 text = ESAPI.encoder().encodeForHTML(text);
>>>
>>>                 text = ESAPI.encoder().encodeForHTMLAttribute(text);
>>>
>>>                 text = ESAPI.encoder().encodeForJavaScript(text);
>>>
>>>                 text = ESAPI.encoder().encodeForCSS(text);
>>>
>>>                 CharArrayWriter caw = new CharArrayWriter();
>>>
>>>                 if (text != null) {
>>>
>>>                         try {
>>>
>>>                                 caw.write(text);
>>>
>>>                                
>>> response.getWriter().write(caw.toString());
>>>
>>>                         } catch (java.lang.IllegalStateException ille) {
>>>
>>>                         }
>>>
>>>                 }
>>>
>>>        }
>>>
>>> In my JSP I have the code as follows
>>>
>>> *_Not working_*
>>>
>>> <script>
>>>
>>> function setUserName(){
>>>
>>>          document.getElementById("login").value ='<%=
>>> (String)request.getAttribute("username")  %>';
>>>
>>> }
>>>
>>> </script>
>>>
>>> *_Working_*
>>>
>>> <%!
>>>
>>>         String cleanXSS(String value) {
>>>
>>>                 value = ESAPI.encoder().encodeForHTML(value);
>>>
>>>                 value = ESAPI.encoder().encodeForHTMLAttribute(value);
>>>
>>>                 value = ESAPI.encoder().encodeForJavaScript(value);
>>>
>>>                 value = ESAPI.encoder().encodeForCSS(value);
>>>
>>>                 return value;
>>>
>>>         }
>>>
>>> %>
>>>
>>> <script>
>>>
>>> function setUserName(){
>>>
>>>          document.getElementById("login").value ='<%= cleanXSS( 
>>> (String)request.getAttribute("username")  ) %>';
>>>
>>> }
>>>
>>> </script>
>>>
>>> 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.
>>>
>>> Appreciate if you have any pointers on the same.
>>>
>>> */Regards |  Ramesh Kesavanarayanan  |    319-354-9200 ext 215785 /
>>> 215972 (O)/**//**/ |  //* *//**/ 319-621-7641 (M) /*
>>>  | */_ramesh.kesavanarayanan at pearson.com_/*
>>> <mailto:ramesh.kesavanarayanan at pearson.com>
>>>
>>>
>>> _______________________________________________
>>> OWASP-ESAPI mailing list
>>> OWASP-ESAPI at lists.owasp.org
>>> https://lists.owasp.org/mailman/listinfo/owasp-esapi
>>>   
>>
>>
>> _______________________________________________
>> OWASP-ESAPI mailing list
>> OWASP-ESAPI at lists.owasp.org
>> https://lists.owasp.org/mailman/listinfo/owasp-esapi
>>   
>
>
> -- 
> Jim Manico
> OWASP Podcast Host/Producer
> OWASP ESAPI Project Manager
> http://www.manico.net
-------------- next part --------------
An HTML attachment was scrubbed...
URL: https://lists.owasp.org/pipermail/esapi-user/attachments/20100507/6ebf641e/attachment.html 


More information about the Esapi-user mailing list