Closed
Description
Affects: 5.3.3
Library: spring-web
Although uncommon, some HTTP clients will quote the multipart boundary value. This does appear to be acceptable based on a reading of the RFC. As a specific example, the .NET SDK's HttpClient
class will generate a quoted UUID to use as the boundary:
POST /foo HTTP/1.1
Content-Type: multipart/form-data; boundary="7e296554-91ca-4075-ada1-c72043296dd7"
Host: foo.bar.example
Content-Length: <snip>
Expect: 100-continue
--7e296554-91ca-4075-ada1-c72043296dd7
Content-Type: text/plain; charset=utf-8
Content-Disposition: form-data; name=Foo
BAR
--7e296554-91ca-4075-ada1-c72043296dd7--
The problem is the codec shipped with spring-web
does not handle this case:
@Nullable
private static byte[] boundary(HttpMessage message) {
MediaType contentType = message.getHeaders().getContentType();
if (contentType != null) {
String boundary = contentType.getParameter("boundary");
if (boundary != null) {
return boundary.getBytes(StandardCharsets.ISO_8859_1);
}
}
return null;
}
The code should check the boundary
string to see if it starts and ends with an ASCII double-quote ("
). If so, it should strip them before creating the byte array to be used later.
See #26615 which led to me discovering this issue.