On Sun, 8 Sep 2002, Yasuo Ohgaki wrote: YO>>> Date: Sun, 08 Sep 2002 11:01:44 +0900 YO>>> From: Yasuo Ohgaki <[EMAIL PROTECTED]> YO>>> To: [EMAIL PROTECTED] YO>>> Subject: [PHP-DEV] Re: #19286 [NEW]: header() Control Char Injection YO>>> YO>>> Yasuo Ohgaki wrote: YO>>> > This obvious security risk is mentioned in bugtraq today.
Since when is PHP responsible for unvalidated user input? I think the documentation already states: " Variables provided to the script via any user input mechanism, and which therefore cannot be trusted. " The superglobals are exactly for this reason - that the user knows, this input should be validated. YO>>> > YO>>> > IMHO, this is users' fault. They must check values before YO>>> > using it. In this specfic case, user should use simple regex YO>>> > before feeding str to header(). YO>>> > YO>>> > Any opinion to meke this to "won't fix"? YO>>> YO>>> One thing we could do is force header parameter a single line. YO>>> Any idea it may broke applications? header("Content-Type: text/plain;\n\tfilename=\"filename.txt\""); RFC 2616: HTTP/1.1 header field values can be folded onto multiple lines if the continuation line begins with a space or horizontal tab. All linear white space, including folding, has the same semantics as SP. A recipient MAY replace any linear white space with a single SP before interpreting the field value or forwarding the message downstream. LWS = [CRLF] 1*( SP | HT ) So, the error in this case, would be that \r\n\r\n is accepted as a valid header, but since the line isn't continued with a space or tab, the header is not valid. Isn't that the webserver's or even the client's responsibility to accept that header? I.e.: Does it redirect? And if not - it's end of content and this writes a body. It's the same user-responsibility as hosting a forum: the forum-software is responsible for proper HTML escaping, not the language it's written in. YO>>> YO>>> -- YO>>> Yasuo Ohgaki YO>>> YO>>> > YO>>> > -- YO>>> > Yasuo Ohgaki YO>>> > YO>>> > [EMAIL PROTECTED] wrote: YO>>> > YO>>> >> From: [EMAIL PROTECTED] YO>>> >> Operating system: Win32 YO>>> >> PHP version: 4.2.3 YO>>> >> PHP Bug Type: Output Control YO>>> >> Bug description: header() Control Char Injection YO>>> >> YO>>> >> I made a quite primitive use of the header() function in a redirect YO>>> >> script: YO>>> >> YO>>> >> <?php YO>>> >> if (isset($_GET["url"])) { YO>>> >> header("Location: " . $_GET["url"]); YO>>> >> } YO>>> >> ?> YO>>> >> YO>>> >> But, no imagine for a second: YO>>> >> YO>>> >> url=http%3A%2F%2Fwww.yahoo.com%2F%0D%0A%0D%0A%3Cscript%3Ealert%28document.cookie%29%3B%3C%2FSCRIPT%3E%0D%0A%0D%0A YO>>> >> YO>>> >> YO>>> >> Which causes: YO>>> >> YO>>> >> Location: http://www.yahoo.com/ YO>>> >> YO>>> >> <script>alert(document.cookie)</script> YO>>> >> YO>>> >> Another interesting thing about this is that it (possibly) allows YO>>> >> bypassing output buffering(?). YO>>> >> YO>>> >> If nothing else, this is a documentation problem, as the header() docs YO>>> >> say YO>>> >> that it will modify a single header, but it also allows body content YO>>> >> to be YO>>> >> manipulated. YO>>> > YO>>> > YO>>> YO>>> YO>>> -- Melvyn. -- PHP Development Mailing List <http://www.php.net/> To unsubscribe, visit: http://www.php.net/unsub.php