---snip--- > ...but there might be security/implementation > issues that I missed. ---snip--- Oops! Found one big issue right after I sent off the patch. Patch now checks for non-hex-character-strings in the encoding, and returns null if present ( similar to what happens if a control character is in the encoded string, or if the url tries to access resources out of the context etc... ). Let's only hope I don't find yet another error in my patch right after I send this one out! David Weinrich
--- DefaultServlet.java Thu Dec 28 00:30:23 2000 +++ DefaultServletEd.java Thu Dec 28 00:29:51 2000 @@ -729,9 +729,41 @@ * @param path Path to be normalized */ protected String normalize(String path) { + String normalized = path; + + // Resolve encoded characters in the normalized path, + // which also handles encoded spaces so we can skip that later. + // Placed at the beginning of the chain so that encoded + // bad stuff(tm) can be caught by the later checks + while (true) { + int index = normalized.indexOf("%"); + if (index < 0) + break; + char replaceChar; + try { + replaceChar = (char) ( + Short.parseShort( + normalized.substring( index + 1, index + 3 ), 16 + ) + ); + } catch ( NumberFormatException nfe ) { + return (null); // bad encoded characters in url + } + // check for control characters ( values 00-1f and 7f-9f), + // return null if present. See: + // http://www.unicode.org/charts/PDF/U0000.pdf + // http://www.unicode.org/charts/PDF/U0080.pdf + if ( Character.isISOControl( replaceChar ) ) { + return (null); + } + normalized = normalized.substring(0, index) + + replaceChar + + normalized.substring(index + 3); + } + + // Normalize the slashes and add leading slash if necessary - String normalized = path; if (normalized.indexOf('\\') >= 0) normalized = normalized.replace('\\', '/'); if (!normalized.startsWith("/")) @@ -745,15 +777,6 @@ normalized = normalized.substring(0, index) + normalized.substring(index + 1); } - - // Resolve occurrences of "%20" in the normalized path - while (true) { - int index = normalized.indexOf("%20"); - if (index < 0) - break; - normalized = normalized.substring(0, index) + " " + - normalized.substring(index + 3); - } // Resolve occurrences of "/./" in the normalized path while (true) {
--- ResourcesBase.java Thu Dec 28 00:32:58 2000 +++ ResourcesBaseEd.java Thu Dec 28 00:08:15 2000 @@ -961,9 +961,39 @@ * @param path Path to be normalized */ protected String normalize(String path) { + String normalized = path; + + // Resolve encoded characters in the normalized path, + // which also handles encoded spaces so we can skip that later. + // Placed at the beginning of the chain so that encoded + // bad stuff(tm) can be caught by the later checks + while (true) { + int index = normalized.indexOf("%"); + if (index < 0) + break; + char replaceChar; + try { + replaceChar = (char) ( + Short.parseShort( + normalized.substring( index + 1, index + 3 ), 16 + ) + ); + } catch ( NumberFormatException nfe ) { + return (null); // bad encoded characters in url + } + // check for control characters ( values 00-1f and 7f-9f), + // return null if present. See: + // http://www.unicode.org/charts/PDF/U0000.pdf + // http://www.unicode.org/charts/PDF/U0080.pdf + if ( Character.isISOControl( replaceChar ) ) { + return (null); + } + normalized = normalized.substring(0, index) + + replaceChar + + normalized.substring(index + 3); + } // Normalize the slashes and add leading slash if necessary - String normalized = path; if (normalized.indexOf('\\') >= 0) normalized = normalized.replace('\\', '/'); if (!normalized.startsWith("/")) @@ -977,15 +1007,6 @@ normalized = normalized.substring(0, index) + normalized.substring(index + 1); } - - // Resolve occurrences of "%20" in the normalized path - while (true) { - int index = normalized.indexOf("%20"); - if (index < 0) - break; - normalized = normalized.substring(0, index) + " " + - normalized.substring(index + 3); - } // Resolve occurrences of "/./" in the normalized path while (true) {