<div dir="ltr">+1<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Apr 5, 2013 at 5:50 AM, John Wilander <span dir="ltr"><<a href="mailto:john.wilander@owasp.org" target="_blank">john.wilander@owasp.org</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div>Eoin, you engage in an interesting discussion. Let's have a look at HTTP and strings. :)<br>
<br></div><div>To scope things I suggest we look just at HTTP headers. Lots of good appsec stuff happening there. Cookies, response splitting, custom headers etc. What is allowed in an HTTP header? The <a href="http://www.ietf.org/rfc/rfc2616.txt" target="_blank">rfc</a> says:<br>

<br><span style="font-family:courier new,monospace">message-header = field-name ":" [ field-value ]<br>       field-name     = token<br>       field-value    = *( field-content | LWS )<br>       field-content  = <the OCTETs making up the field-value<br>

                        and consisting of either *TEXT or combinations<br>                        of token, separators, and quoted-string><br><br>token          = 1*<any CHAR except CTLs or separators><br><br>CHAR           = <any US-ASCII character (octets 0 - 127)><br>

<br></span><span style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">CTL            = <any US-ASCII control character<br>                        (octets 0 - 31) and DEL (127)><br>

<br></span>separators     = "(" | ")" | "<" | ">" | "@"<br>                      | "," | ";" | ":" | "\" | <"><br>

                      | "/" | "[" | "]" | "?" | "="<br>                      | "{" | "}" | SP | HT<br></span><br><span style="font-family:courier new,monospace"><span style="font-family:courier new,monospace"><span style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">LWS            = [CRLF] 1*( SP | HT )<br>

<br></span></span></span></span><span style="font-family:courier new,monospace"><span style="font-family:courier new,monospace"><span style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">CRLF            = CR LF<br>

</span></span><br>OCTET          = <any 8-bit sequence of data><br><br></span>TEXT           = <any OCTET except CTLs,<br>                        but including LWS><br></span><br></div><div>So, header names can consist of ASCII chars 32-126 except 19 chars called separators.<br>

<br></div><div>Then there shall be a colon.<br><br></div><div>Finally the header value can consist of any ASCII chars 9, 32-126 except 19 chars called separators … or a mix of tokens, separators, and quoted strings.<br></div>

<div><br></div><div>On top of this web servers such as Apache impose length constraints on headers, somewhere around 10,000 chars.<br></div><div><br></div><div>Now, let's have a look at "strings".<br><br></div>

<div>Java uses Unicode strings in UTF-16 code units which handle over 100,000 characters. As far as I know C# and JavaScript does the same. The max size of strings is often limited by the max size of integers, typically 2^31 - 1 which is just over 2 billion.<br>

</div><div><br></div><div>Now, how can these +100,000 character-set 2 billion character long strings be used in an HTTP header API?<br><br></div><div>Java:<br><span style="font-family:courier new,monospace">void addHeader(java.lang.String name,<br>

               java.lang.String value)<br></span><br></div><div>… which in a typical implementation might look like this:<br><br><span style="font-family:courier new,monospace">public void addHeader(String name, String value) {<br>

  if (isCommitted())<br>    return;<br><br>  if (included)<br>    return;     // Ignore any call from an included servlet<br><br>  synchronized (headers) {<br>    ArrayList values = (ArrayList) headers.get(name);<br>    if (values == null) {<br>

      values = new ArrayList();<br>      headers.put(name, values);<br>    }<br>    values.add(value);<br>  }<br>}<br></span></div><div><br></div><div>In the JavaDoc for <span style="font-family:courier new,monospace">addHeader()</span> in the <span style="font-family:courier new,monospace">HttpServletReponse</span> interface you of course find instructions to developers:<br>

"If it contains
                octet string, it should be encoded
                according to RFC 2047
                (<a href="http://www.ietf.org/rfc/rfc2047.txt" target="_blank">http://www.ietf.org/rfc/rfc2047.txt</a>)"<br></div><div><br>How many developers take action on that comment? How many get it right? How many product owners agree to make the investment on their project?<br>

</div><div><br>This is exactly what I mean. We still believe we need plain strings. We don't. Almost nothing is just "a string" in software engineering. There's always lexical, syntactical, and semantical restrictions. We have to start helping developers getting these things right.<br>

<br></div><div>The interface should of course have been:<br><br><span style="font-family:courier new,monospace">void addHeader(javax.http.HeaderName name,<br>               javax.http.HeaderValue value)</span><br><br></div>

<div>… and the two domain classes <span style="font-family:courier new,monospace">HeaderName</span> and <span style="font-family:courier new,monospace">HeaderValue</span> should have been immutables which do input validation according to the rfc in their constructors.<br>

</div><div><br></div>Agree?<br><br></div>   Regards, John<br><br><div><div><br></div></div></div><div class="gmail_extra"><div><div class="h5"><br><br><div class="gmail_quote">2013/4/5 Eoin <span dir="ltr"><<a href="mailto:eoin.keary@owasp.org" target="_blank">eoin.keary@owasp.org</a>></span><br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Don't use strings??<br>
That might break HTTP :)<br>
<br>
<br>
Eoin Keary<br>
Owasp Global Board<br>
<a href="tel:%2B353%2087%20977%202988" value="+353879772988" target="_blank">+353 87 977 2988</a><br>
<div><div><br>
<br>
On 5 Apr 2013, at 06:39, Dinis Cruz <<a href="mailto:dinis@ddplus.net" target="_blank">dinis@ddplus.net</a>> wrote:<br>
<br>
> <a href="http://1raindrop.typepad.com/1_raindrop/2013/04/security-140-conversation-with-john-wilander.html" target="_blank">http://1raindrop.typepad.com/1_raindrop/2013/04/security-140-conversation-with-john-wilander.html</a><br>


><br>
> Lots of great ideas and focus areas for OWASP's community :)<br>
><br>
> Dinis Cruz<br>
> _______________________________________________<br>
> OWASP-Leaders mailing list<br>
> <a href="mailto:OWASP-Leaders@lists.owasp.org" target="_blank">OWASP-Leaders@lists.owasp.org</a><br>
> <a href="https://lists.owasp.org/mailman/listinfo/owasp-leaders" target="_blank">https://lists.owasp.org/mailman/listinfo/owasp-leaders</a><br>
_______________________________________________<br>
OWASP-Leaders mailing list<br>
<a href="mailto:OWASP-Leaders@lists.owasp.org" target="_blank">OWASP-Leaders@lists.owasp.org</a><br>
<a href="https://lists.owasp.org/mailman/listinfo/owasp-leaders" target="_blank">https://lists.owasp.org/mailman/listinfo/owasp-leaders</a><br>
</div></div></blockquote></div><br><br clear="all"><br></div></div><span class="HOEnZb"><font color="#888888">-- <br>John Wilander, <a href="https://twitter.com/johnwilander" target="_blank">https://twitter.com/johnwilander</a><br>
Chapter co-leader OWASP Sweden, <a href="http://owaspsweden.blogspot.com" target="_blank">http://owaspsweden.blogspot.com</a><div>
Conf Comm, <a href="http://www.owasp.org/index.php/Global_Conferences_Committee" target="_blank">http://www.owasp.org/index.php/Global_Conferences_Committee</a><br>My music <a href="http://www.johnwilander.com" target="_blank">http://www.johnwilander.com</a> & my résumé <a href="http://johnwilander.se" target="_blank">http://johnwilander.se</a><br>

</div>
</font></span></div>
<br>_______________________________________________<br>
OWASP-Leaders mailing list<br>
<a href="mailto:OWASP-Leaders@lists.owasp.org">OWASP-Leaders@lists.owasp.org</a><br>
<a href="https://lists.owasp.org/mailman/listinfo/owasp-leaders" target="_blank">https://lists.owasp.org/mailman/listinfo/owasp-leaders</a><br>
<br></blockquote></div><br></div>