Skip to content

Commit 4616602

Browse files
authored
Merge pull request #322 from asoldano/max-error-message-size
Trim tokens in error messages to 256 byte to prevent attacks
2 parents dc9eef9 + 7d9be7d commit 4616602

File tree

3 files changed

+98
-2
lines changed

3 files changed

+98
-2
lines changed

src/main/java/com/fasterxml/jackson/core/json/ReaderBasedJsonParser.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -2819,7 +2819,8 @@ protected void _reportInvalidToken(String matchedPart, String msg) throws IOExce
28192819
* regular Java identifier character rules. It's just a heuristic,
28202820
* nothing fancy here.
28212821
*/
2822-
while (true) {
2822+
final int maxTokenLength = 256;
2823+
while (sb.length() < maxTokenLength) {
28232824
if (_inputPtr >= _inputEnd) {
28242825
if (!_loadMore()) {
28252826
break;
@@ -2832,6 +2833,9 @@ protected void _reportInvalidToken(String matchedPart, String msg) throws IOExce
28322833
++_inputPtr;
28332834
sb.append(c);
28342835
}
2836+
if (sb.length() == maxTokenLength) {
2837+
sb.append("...");
2838+
}
28352839
_reportError("Unrecognized token '"+sb.toString()+"': was expecting "+msg);
28362840
}
28372841
}

src/main/java/com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -3510,7 +3510,8 @@ protected void _reportInvalidToken(String matchedPart, String msg) throws IOExce
35103510
* regular Java identifier character rules. It's just a heuristic,
35113511
* nothing fancy here (nor fast).
35123512
*/
3513-
while (true) {
3513+
final int maxTokenLength = 256;
3514+
while (sb.length() < maxTokenLength) {
35143515
if (_inputPtr >= _inputEnd && !_loadMore()) {
35153516
break;
35163517
}
@@ -3521,6 +3522,9 @@ protected void _reportInvalidToken(String matchedPart, String msg) throws IOExce
35213522
}
35223523
sb.append(c);
35233524
}
3525+
if (sb.length() == maxTokenLength) {
3526+
sb.append("...");
3527+
}
35243528
_reportError("Unrecognized token '"+sb.toString()+"': was expecting "+msg);
35253529
}
35263530

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package com.fasterxml.jackson.core.json;
2+
3+
import com.fasterxml.jackson.core.JsonParseException;
4+
import com.fasterxml.jackson.core.JsonParser;
5+
6+
/**
7+
* Test size of parser error messages
8+
*/
9+
public class TestMaxErrorSize
10+
extends com.fasterxml.jackson.core.BaseTest
11+
{
12+
public void testLongErrorMessage()
13+
throws Exception
14+
{
15+
final String DOC = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
16+
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
17+
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
18+
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
19+
assertTrue(DOC.length() > 256);
20+
JsonParser jp = createParserUsingReader(DOC);
21+
try {
22+
jp.nextToken();
23+
fail("Expected an exception for unrecognized token");
24+
} catch (JsonParseException jpe) {
25+
String msg = jpe.getMessage();
26+
final String expectedPrefix = "Unrecognized token '";
27+
final String expectedSuffix = "...': was expecting ('true', 'false' or 'null')";
28+
assertTrue(msg.startsWith(expectedPrefix));
29+
assertTrue(msg.contains(expectedSuffix));
30+
msg = msg.substring(expectedPrefix.length(), msg.indexOf(expectedSuffix));
31+
assertEquals(256, msg.length());
32+
}
33+
jp.close();
34+
35+
jp = createParser(MODE_INPUT_STREAM, DOC);
36+
try {
37+
jp.nextToken();
38+
fail("Expected an exception for unrecognized token");
39+
} catch (JsonParseException jpe) {
40+
String msg = jpe.getMessage();
41+
final String expectedPrefix = "Unrecognized token '";
42+
final String expectedSuffix = "...': was expecting ('true', 'false' or 'null')";
43+
assertTrue(msg.startsWith(expectedPrefix));
44+
assertTrue(msg.contains(expectedSuffix));
45+
msg = msg.substring(expectedPrefix.length(), msg.indexOf(expectedSuffix));
46+
assertEquals(256, msg.length());
47+
}
48+
jp.close();
49+
}
50+
51+
public void testShortErrorMessage()
52+
throws Exception
53+
{
54+
final String DOC = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
55+
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
56+
assertTrue(DOC.length() < 256);
57+
JsonParser jp = createParserUsingReader(DOC);
58+
try {
59+
jp.nextToken();
60+
fail("Expected an exception for unrecognized token");
61+
} catch (JsonParseException jpe) {
62+
String msg = jpe.getMessage();
63+
final String expectedPrefix = "Unrecognized token '";
64+
final String expectedSuffix = "': was expecting ('true', 'false' or 'null')";
65+
assertTrue(msg.startsWith(expectedPrefix));
66+
assertTrue(msg.contains(expectedSuffix));
67+
msg = msg.substring(expectedPrefix.length(), msg.indexOf(expectedSuffix));
68+
assertEquals(DOC.length(), msg.length());
69+
}
70+
jp.close();
71+
72+
jp = createParser(MODE_INPUT_STREAM, DOC);
73+
try {
74+
jp.nextToken();
75+
fail("Expected an exception for unrecognized token");
76+
} catch (JsonParseException jpe) {
77+
String msg = jpe.getMessage();
78+
final String expectedPrefix = "Unrecognized token '";
79+
final String expectedSuffix = "': was expecting ('true', 'false' or 'null')";
80+
assertTrue(msg.startsWith(expectedPrefix));
81+
assertTrue(msg.contains(expectedSuffix));
82+
msg = msg.substring(expectedPrefix.length(), msg.indexOf(expectedSuffix));
83+
assertEquals(DOC.length(), msg.length());
84+
}
85+
jp.close();
86+
}
87+
}
88+

0 commit comments

Comments
 (0)