go net/http: 不要解码包含Content-Transfer-Encoding头的multipart表单部分

rnmwe5a2  于 4个月前  发布在  Go
关注(0)|答案(4)|浏览(62)

A multipart/form-data 表单由一系列部分组成,这些部分由边界分隔。正如最初在 RFC 2045 第6节中指定的那样,每个部分可以包含 RFC 2388 中定义的 Content-Transfer-Encoding 头。

RFC 7578,第4.7节更新并取代了 RFC 2388,其中废弃了在支持二进制数据的情况下使用 Content-Transfer-Encoding 的情况,具体包括 HTTP。

http.Request.ParseMultipartForm 将解析包含 Content-Transfer-Encoding 头的表单部分。以 RFC 7578 中的一个示例为例,ParseMultipartForm 将解析此表单部分为包含正文 "Joe owes €100.":

--AaB03x
content-disposition: form-data; name="field1"
content-type: text/plain;charset=UTF-8
content-transfer-encoding: quoted-printable

Joe owes =E2=82=AC100.
--AaB03x

这可以作为一种内容窃取向量,因为其他实现通常不会在 HTTP multipart/form-data 响应中解码引用打印格式的表单部分。作为加固措施,我们应该考虑不解码编码的部分。RFC 7578 指出发送此类正文的实现是罕见的或不存在的。

hgb9j2n6

hgb9j2n61#

感谢Qi Wang和Jianjun Chen报告此问题。

wvt8vs2t

wvt8vs2t2#

https://go.dev/cl/573195提到了这个问题:mime/multipart: add Reader.SetRejectContentTransferEncoding

xzv2uavs

xzv2uavs3#

https://go.dev/cl/573196提到了这个问题:net/http: reject multipart requests containing a "Content-Transfer-Encoding" header

相关问题