Skip to content

Commit 6e26f0d

Browse files
author
Nicolai Parlog
committed
Demonstrate deserialization filter
1 parent c6eb626 commit 6e26f0d

File tree

4 files changed

+82
-44
lines changed

4 files changed

+82
-44
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ Check out the [jpms](http://blog.codefx.org/tag/jpms/) tag on my blog, [this dem
100100
*[stack walking](src/main/java/org/codefx/demo/java9/api/stack_walking/StackWalking.java) ([JEP 259](http://openjdk.java.net/jeps/259), [post on SitePoint](https://www.sitepoint.com/deep-dive-into-java-9s-stack-walking-api/) including benchmarks)
101101
*[multi-resolution images](src/main/java/org/codefx/demo/java9/api/multi_resolution_images/Images.java) ([JEP 251](http://openjdk.java.net/jeps/251))
102102
* ⑨ platform-specific desktop features (not supported by my OS so [my sample](src/main/java/org/codefx/demo/java9/api/desktop/DesktopFeatures.java) sucks; PRs welcome! [JEP 272](http://openjdk.java.net/jeps/272))
103-
* ⑨ deserialization filter (targeted for JDK 9 but wasn't implemented when I created this; [JEP 290](http://openjdk.java.net/jeps/290))
103+
*[deserialization filter](src/main/java/org/codefx/demo/java9/api/deserialization_filter) ([JEP 290](http://openjdk.java.net/jeps/290))
104104

105105
## Updated APIs
106106

src/main/java/org/codefx/demo/java9/api/serialization_filter/LinkedListNode.java renamed to src/main/java/org/codefx/demo/java9/api/deserialization_filter/LinkedListNode.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
package org.codefx.demo.java9.api.serialization_filter;
1+
package org.codefx.demo.java9.api.deserialization_filter;
22

33
import java.io.Serializable;
44
import java.util.Objects;
55

66
public class LinkedListNode implements Serializable {
77

8+
private static final long serialVersionUID = -6614892775246024176L;
9+
810
private final String data;
911
private final LinkedListNode next;
1012

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package org.codefx.demo.java9.api.deserialization_filter;
2+
3+
import java.io.ByteArrayInputStream;
4+
import java.io.ByteArrayOutputStream;
5+
import java.io.IOException;
6+
import java.io.InvalidClassException;
7+
import java.io.ObjectInputFilter;
8+
import java.io.ObjectInputStream;
9+
import java.io.ObjectOutputStream;
10+
11+
import static org.codefx.demo.java9.api.deserialization_filter.LinkedListNode.createList;
12+
13+
public class SerializeThenFilter {
14+
15+
/*
16+
* CAREFUL: (De)serialization is a security-sensitive topic, but these examples don't take
17+
* that into account. They just demonstrate how some parts of the API work without
18+
* looking at the security implications. If you use this APIs to secure your application,
19+
* make sure to NOT USE THESE EXAMPLES. Instead, make sure to master the topic
20+
* and API first, e.g. by starting here:
21+
* - https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/ObjectInputFilter.html
22+
* - https://docs.oracle.com/pls/topic/lookup?ctx=javase17&id=secure_coding_guidelines_javase
23+
* - https://docs.oracle.com/pls/topic/lookup?ctx=javase17&id=serialization_filter_guide
24+
*/
25+
26+
// launch with -Djdk.serialFilter=maxdepth=5 to configure deserialization filter to reject
27+
// instance graphs with a depth of 6 or more - observe effect in `staticDeserializationFilter`
28+
public static void main(String[] args) throws IOException, ClassNotFoundException {
29+
staticDeserializationFilter();
30+
dynamicDeserializationFilter();
31+
}
32+
33+
private static void staticDeserializationFilter() throws IOException, ClassNotFoundException {
34+
LinkedListNode list = createList("A", "B", "C", "D", "E", "F", "G", "H");
35+
System.out.println("List to serialize: " + list);
36+
37+
byte[] serializedList = serialize(list);
38+
try {
39+
LinkedListNode deserializedList = deserialize(serializedList);
40+
System.out.println("Deserialization succeeded unexpectedly: " + deserializedList);
41+
} catch (InvalidClassException ex) {
42+
System.out.println("Deserialization failed as expected: " + ex.getMessage());
43+
}
44+
}
45+
46+
private static void dynamicDeserializationFilter() throws IOException, ClassNotFoundException {
47+
LinkedListNode list = createList("AAA", "BBB", "CCC");
48+
System.out.println("List to serialize: " + list);
49+
50+
byte[] serializedList = serialize(list);
51+
ObjectInputFilter filter = ObjectInputFilter.Config.createFilter("maxbytes=128");
52+
53+
try {
54+
LinkedListNode deserializedList = deserializeWithFilter(serializedList, filter);
55+
System.out.println("Deserialization succeeded unexpectedly: " + deserializedList);
56+
} catch (InvalidClassException ex) {
57+
System.out.println("Deserialization failed as expected: " + ex.getMessage());
58+
}
59+
}
60+
61+
private static byte[] serialize(LinkedListNode list) throws IOException {
62+
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
63+
new ObjectOutputStream(byteArrayOutputStream).writeObject(list);
64+
return byteArrayOutputStream.toByteArray();
65+
}
66+
67+
private static LinkedListNode deserialize(byte[] serializedList) throws IOException, ClassNotFoundException {
68+
ObjectInputStream inputStream = new ObjectInputStream(new ByteArrayInputStream(serializedList));
69+
return (LinkedListNode) inputStream.readObject();
70+
}
71+
72+
private static LinkedListNode deserializeWithFilter(byte[] serializedList, ObjectInputFilter filter) throws IOException, ClassNotFoundException {
73+
ObjectInputStream inputStream = new ObjectInputStream(new ByteArrayInputStream(serializedList));
74+
inputStream.setObjectInputFilter(filter);
75+
return (LinkedListNode) inputStream.readObject();
76+
}
77+
78+
}

src/main/java/org/codefx/demo/java9/api/serialization_filter/SerializeThenFilter.java

Lines changed: 0 additions & 42 deletions
This file was deleted.

0 commit comments

Comments
 (0)