<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Hi again,<div><br></div><div>just to update you, even without the troublesome regex there are a couple of other points of failure with respect to surrogate pairs. I think these are both DOM specific problems so probably not of too much interest but it might be worth checking the SAX parser as well just to be sure -</div><div><br></div><div>1)&nbsp;CyberNeko has a bug where numeric entities for characters from the Unicode supplimentary plane will be corrupted because the&nbsp;integer sized value is cast to a char. The problem is at&nbsp;org.cyberneko.html.HTMLScanner.scanEntityRef(XMLStringBuffer, boolean)</div><div><br></div><div>2) This second point may not necessarily be a bug, but it is in my usage anyway :-)&nbsp;</div><div>The&nbsp;org.apache.xml.serialize.XHTMLSerializer will split CDATA sections that contain supplementary plane characters and output their hex entity. CDATA sections can contain just about any Unicode character according to the XML spec so this behaviour isn't necessary (or perhaps isn't even correct?)</div><div><br></div><div>Cheers,</div><div><br></div><div>Paul C</div><div><br></div><div><br><div><div>On 16/08/2011, at 6:19 PM, Arshan Dabirsiaghi wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div lang="EN-US" link="blue" vlink="purple"><div class="WordSection1" style="page: WordSection1; "><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><span style="font-size: 11pt; font-family: Calibri, sans-serif; color: rgb(31, 73, 125); ">Itís not Java that has the issue, itís the DOM parser. Thereís some disconnect there, and I happened upon that fix on some blog. It made everything work and fixed the test case, so itís survived. Itís a cheap solution. Your targeted Unicode regex is probably a better solution in the long term, but Iím not aware of the short-term impact in i18ned environments.<o:p></o:p></span></div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><span style="font-size: 11pt; font-family: Calibri, sans-serif; color: rgb(31, 73, 125); "><o:p>&nbsp;</o:p></span></div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><span style="font-size: 11pt; font-family: Calibri, sans-serif; color: rgb(31, 73, 125); ">OTOH Iím not sure the impact will ever be possible for me to guess without data from the community, so we may just allow such a change and wait for community to scream at us.<o:p></o:p></span></div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><span style="font-size: 11pt; font-family: Calibri, sans-serif; color: rgb(31, 73, 125); "><o:p>&nbsp;</o:p></span></div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><span style="font-size: 11pt; font-family: Calibri, sans-serif; color: rgb(31, 73, 125); ">Arshan<o:p></o:p></span></div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><span style="font-size: 11pt; font-family: Calibri, sans-serif; color: rgb(31, 73, 125); "><o:p>&nbsp;</o:p></span></div><div><div style="border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; border-top-style: solid; border-top-color: rgb(181, 196, 223); border-top-width: 1pt; padding-top: 3pt; padding-right: 0in; padding-bottom: 0in; padding-left: 0in; "><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><b><span style="font-size: 10pt; font-family: Tahoma, sans-serif; ">From:</span></b><span style="font-size: 10pt; font-family: Tahoma, sans-serif; "><span class="Apple-converted-space">&nbsp;</span>Paul Curren [mailto:pcurren@atlassian.com]<span class="Apple-converted-space">&nbsp;</span><br><b>Sent:</b><span class="Apple-converted-space">&nbsp;</span>Tuesday, August 16, 2011 9:28 AM<br><b>To:</b><span class="Apple-converted-space">&nbsp;</span>Arshan Dabirsiaghi<br><b>Cc:</b><span class="Apple-converted-space">&nbsp;</span><a href="mailto:owasp-antisamy@lists.owasp.org" style="color: blue; text-decoration: underline; ">owasp-antisamy@lists.owasp.org</a><br><b>Subject:</b><span class="Apple-converted-space">&nbsp;</span>Re: [owasp-antisamy] UTF-16 multilingual plane characters being stripped<o:p></o:p></span></div></div></div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><o:p>&nbsp;</o:p></div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><o:p>&nbsp;</o:p></div><div><div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; ">On 16/08/2011, at 12:51 PM, Arshan Dabirsiaghi wrote:<o:p></o:p></div></div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><br><br><o:p></o:p></div><div><div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><span style="font-size: 11pt; font-family: Calibri, sans-serif; color: rgb(31, 73, 125); ">This was done to prevent the DOM parser from blowing up when receiving invalid UTF16 sequences.</span><o:p></o:p></div></div></div><div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><o:p>&nbsp;</o:p></div></div><div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; ">Thanks.<o:p></o:p></div></div><div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; ">I'm not sure what UTF16 would be invalid. If Java was managing to represent them in a String (which is UTF16) does this not mean that they are valid?<o:p></o:p></div></div><div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><o:p>&nbsp;</o:p></div></div><div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; ">I'm in two minds whether to just skip the step altogether or whether to replace it with something more targeted such as:<o:p></o:p></div></div><div><div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><span style="font-size: 9pt; font-family: Monaco, serif; color: black; ">in.replaceAll(</span><span style="font-size: 9pt; font-family: Monaco, serif; color: rgb(71, 38, 249); ">"[\\p{Cs}||\\p{Cn}||\\p{Co}]"</span><span style="font-size: 9pt; font-family: Monaco, serif; color: black; ">,</span><span style="font-size: 9pt; font-family: Monaco, serif; color: rgb(71, 38, 249); ">""</span><span style="font-size: 9pt; font-family: Monaco, serif; color: black; ">);</span><span style="font-size: 9pt; font-family: Monaco, serif; color: rgb(71, 38, 249); "><o:p></o:p></span></div></div></div><div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><o:p>&nbsp;</o:p></div></div><div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; ">(not that I'm hitting any failures in those categories yet mind you).<o:p></o:p></div></div><div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><o:p>&nbsp;</o:p></div></div><div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; ">Paul C<o:p></o:p></div></div><div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><o:p>&nbsp;</o:p></div></div><div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><o:p>&nbsp;</o:p></div></div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><br><br><o:p></o:p></div><div><div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><span style="font-size: 11pt; font-family: Calibri, sans-serif; color: rgb(31, 73, 125); ">&nbsp;</span><o:p></o:p></div></div><div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><span style="font-size: 11pt; font-family: Calibri, sans-serif; color: rgb(31, 73, 125); ">Arshan</span><o:p></o:p></div></div><div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><span style="font-size: 11pt; font-family: Calibri, sans-serif; color: rgb(31, 73, 125); ">&nbsp;</span><o:p></o:p></div></div><div><div style="border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; border-top-style: solid; padding-top: 3pt; padding-right: 0in; padding-bottom: 0in; padding-left: 0in; border-width: initial; border-color: initial; "><div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><b><span style="font-size: 10pt; font-family: Tahoma, sans-serif; ">From:</span></b><span class="apple-converted-space"><span style="font-size: 10pt; font-family: Tahoma, sans-serif; ">&nbsp;</span></span><span style="font-size: 10pt; font-family: Tahoma, sans-serif; "><a href="mailto:owasp-antisamy-bounces@lists.owasp.org" style="color: blue; text-decoration: underline; ">owasp-antisamy-bounces@lists.owasp.org</a><span class="apple-converted-space">&nbsp;</span>[mailto:owasp-antisamy-bounces@lists.owasp.org]<span class="apple-converted-space">&nbsp;</span><b>On Behalf Of<span class="apple-converted-space">&nbsp;</span></b>Paul Curren<br><b>Sent:</b><span class="apple-converted-space">&nbsp;</span>Tuesday, August 16, 2011 7:09 AM<br><b>To:</b><span class="apple-converted-space">&nbsp;</span><a href="mailto:owasp-antisamy@lists.owasp.org" style="color: blue; text-decoration: underline; ">owasp-antisamy@lists.owasp.org</a><br><b>Subject:</b><span class="apple-converted-space">&nbsp;</span>[owasp-antisamy] UTF-16 multilingual plane characters being stripped</span><o:p></o:p></div></div></div></div><div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; ">&nbsp;<o:p></o:p></div></div><div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; ">I've run into a problem in AntisamyDOMScanner#stripNonValidCharacters:<o:p></o:p></div></div><div><div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; ">&nbsp;<o:p></o:p></div></div></div><div><div><div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><span style="font-size: 9pt; font-family: Monaco, serif; color: rgb(146, 17, 103); ">return</span><span class="apple-converted-space"><span style="font-size: 9pt; font-family: Monaco, serif; color: black; ">&nbsp;</span></span><span style="font-size: 9pt; font-family: Monaco, serif; color: black; ">in.replaceAll(</span><span style="font-size: 9pt; font-family: Monaco, serif; color: rgb(71, 38, 249); ">"[\\u0000-\\u001F\\uD800-\\uDFFF\\uFFFE-\\uFFFF&amp;&amp;[^\\u0009\\u000A\\u000D]]"</span><span style="font-size: 9pt; font-family: Monaco, serif; color: black; ">,<span class="apple-converted-space">&nbsp;</span></span><span style="font-size: 9pt; font-family: Monaco, serif; color: rgb(71, 38, 249); ">""</span><span style="font-size: 9pt; font-family: Monaco, serif; color: black; ">);</span><o:p></o:p></div></div></div></div><div><div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><span style="font-size: 9pt; font-family: Monaco, serif; color: rgb(71, 38, 249); ">&nbsp;</span><o:p></o:p></div></div></div><div><div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><span class="apple-style-span"><span style="font-size: 13.5pt; font-family: Helvetica, sans-serif; color: black; ">This method will corrupt 2 character code points in the 'in' string.</span></span><o:p></o:p></div></div></div><div><div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><span style="font-size: 9pt; font-family: Monaco, serif; color: rgb(71, 38, 249); ">&nbsp;</span><o:p></o:p></div></div></div><div><div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><span class="apple-style-span"><span style="font-size: 13.5pt; font-family: Helvetica, sans-serif; color: black; ">So the most obvious fix that comes to my mind is to just not perform this operation. I'm wondering what are the reasons for the introduction of this method in the first place? What is my risk by not applying it?</span></span><o:p></o:p></div></div></div><div><div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><span style="font-size: 9pt; font-family: Monaco, serif; color: rgb(71, 38, 249); ">&nbsp;</span><o:p></o:p></div></div></div><div><div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><span style="font-family: Helvetica, sans-serif; ">I see no direct equivalent in the SAX scanner but I can't easily test it due to a number of customisations we rely on in our DOM Scanner implementation.</span><o:p></o:p></div></div></div><div><div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><span style="font-size: 9pt; font-family: Monaco, serif; ">&nbsp;</span><o:p></o:p></div></div></div><div><div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><span style="font-family: Helvetica, sans-serif; ">Cheers,</span><o:p></o:p></div></div></div><div><div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><span style="font-size: 9pt; font-family: Monaco, serif; ">&nbsp;</span><o:p></o:p></div></div></div><div><div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><span style="font-family: Helvetica, sans-serif; ">Paul C</span><o:p></o:p></div></div></div><div><div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><span style="font-size: 9pt; font-family: Monaco, serif; ">&nbsp;</span><o:p></o:p></div></div></div></div></div><div style="margin-top: 0in; margin-right: 0in; margin-left: 0in; margin-bottom: 0.0001pt; font-size: 12pt; font-family: 'Times New Roman', serif; "><o:p>&nbsp;</o:p></div></div></div></blockquote></div><br></div></body></html>