<p>This seems like a legit request to me but i think that it should be an option, not the default choice. Gunther, can you log an issue in our google code issue tracker for this please?</p>
<div class="gmail_quote">On Jul 25, 2012 7:39 AM, "Gnther Zwetti" <<a href="mailto:guenther.zwetti@unycom.com">guenther.zwetti@unycom.com</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">






<div lang="DE" link="blue" vlink="purple">
<div>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif"">Hello all,<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif""><u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif"">Funny  very funny  please dont wonder about my previous posting, but this website unfortunately encodes all my named HTML entities and so my text seems
 not be very meaningful. <u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif"">As a result of this I decided to put a | character after each & character to avoid this encoding ;-)<u></u><u></u></span></p>

<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif""><u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif"">But back to topic:<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif""><u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif"">Some days ago we found out that a very strange behavior of our software was caused by the implementation of method
<i>decodeForHTML</i> as defined in interface </span><i><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif"">org.owasp.esapi.Encoder</span></i><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif"">.<u></u><u></u></span></p>

<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif"">In detail, the concrete implementation (class
<i>HTMLEntityCodec</i>) tries to decode HTML encoded text by finding out HTML entity parts of string literals first and then trying to find a corresponding entry in a map (class
<i>HTMLEntityCodec</i>, method <i>getNamedEntity</i>).<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif""><u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif"">An example: Input (HML encoded) text:
<i>abcDefG&</i>|<i>Uuml;xyz</i> <u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif"">Now the parts
<i>abcDefG</i> and <i>xyz</i> pass entity check und wont be modified, whereas the part <i>&|Uuml;</i> will be recognized being an HTML entity.<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif"">As a result of this, the part <i>&|Uuml;</i> will be handed over to the method
<i>getNamedEntity</i>, which now tries to get a corresponding entry for this named HTML entity (e.g. method should return < for &|lt;).<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif""><u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif"">In my opinion, this method does not work correctly due to the fact, that input will be converted to lower case which leads to incorrect output if you
 use case sensitive HTML entities like &|Uuml; (=), &|uuml; (=).<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif"">This results in an incorrect output
<i></i> for input <i>&|Uuml; </i>but should be <i>ܔ</i> (upper case!)<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif""><u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif"">Also, this method (in class
<i>HTMLEntityCodec)</i> uses a hard coded map for lookup even though there also exists a property file named
<i>antisamy-esapi.xml</i> which also defines HTML entities.<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif""><u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif"">Therefore two question arises:
<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif"">(1) Is this a known bug (and maybe already fixed) or can/should we fix it by removing the toLowerCase statement without any negative side effects?<u></u><u></u></span></p>

<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif"">(2) What is the file
<i>antisamy-esapi.xml</i> used for (especially the part for named HTML entities)?<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif""><u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif"">Thanks for your answers in advance,<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif""><u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif"">Kind regards,<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif"">Gnther<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif""><u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif"">Code:<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif""><u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New","serif"">
</span><b><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New","serif";color:#7f0055">private</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New","serif""> Character
<span style="background:silver">getNamedEntity</span>( PushbackString input ) {</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New","serif""><u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New","serif""> // <u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New","serif""> len = Math.<i>min</i>(input.remainder().length(),
</span><i><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New","serif";color:#0000c0">entityToCharacterTrie</span></i><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New","serif"">.getMaxKeyLength());</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New","serif""><u></u><u></u></span></p>

<p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New","serif"">
</span><b><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New","serif";color:#7f0055">for</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New","serif"">(</span><b><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New","serif";color:#7f0055">int</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New","serif"">
 i=0;i<len;i++)</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New","serif""><u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New","serif""> possible.append(</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New","serif";color:red">Character.toLowerCase</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New","serif"">(input.next()));
 // *** problem! ***</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New","serif""><u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New","serif"">
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New","serif";color:#3f7f5f">// look up the longest match</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New","serif""><u></u><u></u></span></p>

<p class="MsoNormal" style="text-autospace:none"><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New","serif""> entry =
</span><i><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New","serif";color:#0000c0">entityToCharacterTrie</span></i><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New","serif"">.getLongestMatch(possible);</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New","serif""><u></u><u></u></span></p>

<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif""><u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:10.0pt;font-family:"Georgia","serif""><u></u><u></u></span></p>
</div>
</div>

<br>_______________________________________________<br>
Esapi-dev mailing list<br>
<a href="mailto:Esapi-dev@lists.owasp.org">Esapi-dev@lists.owasp.org</a><br>
<a href="https://lists.owasp.org/mailman/listinfo/esapi-dev" target="_blank">https://lists.owasp.org/mailman/listinfo/esapi-dev</a><br>
<br></blockquote></div>