-
-
Notifications
You must be signed in to change notification settings - Fork 128
Expand file tree
/
Copy pathESAPIEncoderTest.java
More file actions
121 lines (103 loc) · 5.16 KB
/
Copy pathESAPIEncoderTest.java
File metadata and controls
121 lines (103 loc) · 5.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package org.owasp.encoder.esapi;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.owasp.encoder.Encode;
import org.owasp.esapi.ESAPI;
import org.owasp.esapi.Encoder;
import org.owasp.esapi.codecs.MySQLCodec;
import org.owasp.esapi.codecs.UnixCodec;
import org.owasp.esapi.reference.DefaultEncoder;
/**
* ESAPIEncoderTest
*
* @author jeffi
*/
public class ESAPIEncoderTest extends TestCase {
public static Test suite() {
return new TestSuite(ESAPIEncoderTest.class);
}
public void testConfiguredAsEsapiEncoder() {
assertSame(ESAPIEncoder.getInstance(), ESAPI.encoder());
}
public void testJavaEncoderBackedMethods() throws Exception {
Encoder encoder = ESAPIEncoder.getInstance();
String input = "<>&\"' /\u03a9";
assertEquals(Encode.forCssString(input), encoder.encodeForCSS(input));
assertEquals(Encode.forHtml(input), encoder.encodeForHTML(input));
assertEquals(Encode.forHtmlAttribute(input), encoder.encodeForHTMLAttribute(input));
assertEquals(Encode.forJavaScript(input), encoder.encodeForJavaScript(input));
assertEquals(Encode.forXml(input), encoder.encodeForXML(input));
assertEquals(Encode.forXmlAttribute(input), encoder.encodeForXMLAttribute(input));
assertEquals(Encode.forUri(input), encoder.encodeForURL(input));
}
public void testDelegatedTextMethods() throws Exception {
Encoder encoder = ESAPIEncoder.getInstance();
Encoder reference = DefaultEncoder.getInstance();
URI uri = new URI("https://example.test/a%20b");
assertEquals(reference.canonicalize("<"), encoder.canonicalize("<"));
assertEquals(reference.canonicalize("<", true), encoder.canonicalize("<", true));
assertEquals(reference.canonicalize("<", true, true),
encoder.canonicalize("<", true, true));
assertEquals(reference.getCanonicalizedURI(uri), encoder.getCanonicalizedURI(uri));
assertEquals(reference.decodeForHTML("<"), encoder.decodeForHTML("<"));
assertEquals(reference.encodeForVBScript("A"), encoder.encodeForVBScript("A"));
assertEquals(reference.encodeForOS(new UnixCodec(), "a b"),
encoder.encodeForOS(new UnixCodec(), "a b"));
assertEquals(reference.encodeForLDAP("a*b"), encoder.encodeForLDAP("a*b"));
assertEquals(reference.encodeForLDAP("a*b", true), encoder.encodeForLDAP("a*b", true));
assertEquals(reference.encodeForDN("CN=Test, O=Example"),
encoder.encodeForDN("CN=Test, O=Example"));
assertEquals(reference.encodeForXPath("a'b"), encoder.encodeForXPath("a'b"));
assertEquals(reference.decodeFromURL("a%20b"), encoder.decodeFromURL("a%20b"));
assertEquals(reference.encodeForJSON("a\"b"), encoder.encodeForJSON("a\"b"));
assertEquals(reference.decodeFromJSON("a\\\"b"), encoder.decodeFromJSON("a\\\"b"));
}
public void testDelegatedBinaryMethods() throws Exception {
Encoder encoder = ESAPIEncoder.getInstance();
Encoder reference = DefaultEncoder.getInstance();
byte[] input = "ESAPI compatibility".getBytes(StandardCharsets.UTF_8);
String encoded = encoder.encodeForBase64(input, false);
assertEquals(reference.encodeForBase64(input, false), encoded);
assertTrue(Arrays.equals(input, encoder.decodeFromBase64(encoded)));
}
public void testDelegatedSqlEncodingHonorsEsapiPolicy() {
Encoder encoder = ESAPIEncoder.getInstance();
MySQLCodec codec = new MySQLCodec(MySQLCodec.Mode.ANSI);
String esapiVersion = Encoder.class.getPackage().getImplementationVersion();
assertNotNull(esapiVersion);
if (esapiVersion.startsWith("2.7.")) {
try {
encoder.encodeForSQL(codec, "value'");
fail("ESAPI 2.7 must disable encodeForSQL by default");
} catch (RuntimeException expected) {
assertEquals("org.owasp.esapi.errors.NotConfiguredByDefaultException",
expected.getClass().getName());
}
} else {
assertEquals(DefaultEncoder.getInstance().encodeForSQL(codec, "value'"),
encoder.encodeForSQL(codec, "value'"));
}
}
public void testSerialization() throws Exception {
// Note: ESAPI reference implementation is NOT serializable. Maybe
// it will be in the future. Our implementation is however
// guaranteed serializable.
Encoder encoder = ESAPI.encoder();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(encoder);
oos.close();
ObjectInputStream ois = new ObjectInputStream(
new ByteArrayInputStream(baos.toByteArray()));
Encoder deserializedEncoder = (Encoder)ois.readObject();
assertSame(encoder, deserializedEncoder);
}
}