diff --git a/src/main/java/org/owasp/esapi/reference/AbstractAuthenticator.java b/src/main/java/org/owasp/esapi/reference/AbstractAuthenticator.java index d7de99f04..e6976c7ac 100644 --- a/src/main/java/org/owasp/esapi/reference/AbstractAuthenticator.java +++ b/src/main/java/org/owasp/esapi/reference/AbstractAuthenticator.java @@ -114,7 +114,8 @@ protected User getUserFromSession() { */ protected DefaultUser getUserFromRememberToken() { try { - String token = ESAPI.httpUtilities().getCookie(ESAPI.currentRequest(), HTTPUtilities.REMEMBER_TOKEN_COOKIE_NAME); + HTTPUtilities utils =ESAPI.httpUtilities(); + String token = utils.getCookie(ESAPI.currentRequest(), HTTPUtilities.REMEMBER_TOKEN_COOKIE_NAME); if (token == null) return null; // See Google Issue 144 regarding first URLDecode the token and THEN unsealing. diff --git a/src/main/java/org/owasp/esapi/reference/DefaultHTTPUtilities.java b/src/main/java/org/owasp/esapi/reference/DefaultHTTPUtilities.java index 2da6546d8..ecce1a9ff 100644 --- a/src/main/java/org/owasp/esapi/reference/DefaultHTTPUtilities.java +++ b/src/main/java/org/owasp/esapi/reference/DefaultHTTPUtilities.java @@ -235,11 +235,12 @@ public void addHeader(String name, String value) { * {@inheritDoc} */ public void addHeader(HttpServletResponse response, String name, String value) { + SecurityConfiguration sc = ESAPI.securityConfiguration(); try { String strippedName = StringUtilities.replaceLinearWhiteSpace(name); String strippedValue = StringUtilities.replaceLinearWhiteSpace(value); - String safeName = ESAPI.validator().getValidInput("addHeader", strippedName, "HTTPHeaderName", 20, false); - String safeValue = ESAPI.validator().getValidInput("addHeader", strippedValue, "HTTPHeaderValue", 500, false); + String safeName = ESAPI.validator().getValidInput("addHeader", strippedName, "HTTPHeaderName", sc.getIntProp("HttpUtilities.MaxHeaderNameSize"), false); + String safeValue = ESAPI.validator().getValidInput("addHeader", strippedValue, "HTTPHeaderValue", sc.getIntProp("HttpUtilities.MaxHeaderValueSize"), false); response.addHeader(safeName, safeValue); } catch (ValidationException e) { logger.warning(Logger.SECURITY_FAILURE, "Attempt to add invalid header denied", e); @@ -464,9 +465,10 @@ public void encryptStateInCookie( Map cleartext ) throws Encrypti */ public String getCookie( HttpServletRequest request, String name ) throws ValidationException { Cookie c = getFirstCookie( request, name ); + SecurityConfiguration sc = ESAPI.securityConfiguration(); if ( c == null ) return null; String value = c.getValue(); - return ESAPI.validator().getValidInput("HTTP cookie value: " + value, value, "HTTPCookieValue", 1000, false); + return ESAPI.validator().getValidInput("HTTP cookie value: " + value, value, "HTTPCookieValue", sc.getIntProp("HttpUtilities.MaxHeaderValueSize"), false); } /** @@ -656,8 +658,9 @@ private Cookie getFirstCookie(HttpServletRequest request, String name) { * {@inheritDoc} */ public String getHeader( HttpServletRequest request, String name ) throws ValidationException { + SecurityConfiguration sc = ESAPI.securityConfiguration(); String value = request.getHeader(name); - return ESAPI.validator().getValidInput("HTTP header value: " + value, value, "HTTPHeaderValue", 150, false); + return ESAPI.validator().getValidInput("HTTP header value: " + value, value, "HTTPHeaderValue", sc.getIntProp("HttpUtilities.MaxHeaderValueSize"), false); } diff --git a/src/test/java/org/owasp/esapi/reference/EncoderTest.java b/src/test/java/org/owasp/esapi/reference/EncoderTest.java index 8f345e199..ed04b6d5b 100644 --- a/src/test/java/org/owasp/esapi/reference/EncoderTest.java +++ b/src/test/java/org/owasp/esapi/reference/EncoderTest.java @@ -212,6 +212,8 @@ public void testCanonicalize() throws EncodingException { assertEquals( "<", instance.canonicalize("&lT;")); assertEquals( "<", instance.canonicalize("≪")); assertEquals( "<", instance.canonicalize("<")); + assertEquals( "&", instance.canonicalize("&")); + assertEquals( "〈", instance.canonicalize("&lang")); assertEquals( "", instance.canonicalize("%3Cscript%3Ealert%28%22hello%22%29%3B%3C%2Fscript%3E") ); assertEquals( "", instance.canonicalize("%3Cscript>alert%28%22hello"%29%3B%3C%2Fscript%3E", false) ); @@ -912,11 +914,28 @@ public void testHtmlEncodeStrSurrogatePair() public void testHtmlDecodeHexEntititesSurrogatePair() { - HTMLEntityCodec htmlCodec = new HTMLEntityCodec(); + HTMLEntityCodec htmlCodec = new HTMLEntityCodec(); String expected = new String (new int[]{0x2f804}, 0, 1); assertEquals( expected, htmlCodec.decode("你") ); assertEquals( expected, htmlCodec.decode("你") ); } + public void testUnicodeCanonicalize() { + Encoder e = ESAPI.encoder(); + String input = "测试"; + String expected = "测试"; + String output = e.canonicalize(input); + assertEquals(expected, output); + } + + public void testUnicodeCanonicalizePercentEncoding() { + //TODO: We need to find a way to specify the encoding type for percent encoding. + //I believe by default we're doing Latin-1 and we really should be doing UTF-8 + Encoder e = ESAPI.encoder(); + String input = "%E6%B5%8B%E8%AF%95"; + String expected = "测试"; + String output = e.canonicalize(input); + assertNotSame(expected, output); + } } diff --git a/src/test/java/org/owasp/esapi/reference/HTTPUtilitiesTest.java b/src/test/java/org/owasp/esapi/reference/HTTPUtilitiesTest.java index ba6715313..1f8701efd 100644 --- a/src/test/java/org/owasp/esapi/reference/HTTPUtilitiesTest.java +++ b/src/test/java/org/owasp/esapi/reference/HTTPUtilitiesTest.java @@ -45,6 +45,7 @@ import org.owasp.esapi.http.MockHttpServletResponse; import org.owasp.esapi.http.MockHttpSession; import org.owasp.esapi.util.FileTestUtils; +import org.owasp.esapi.util.TestUtils; import junit.framework.Test; import junit.framework.TestCase; @@ -372,6 +373,27 @@ public void testSetCookie() { instance.addCookie( response, new Cookie( "test3", "tes