IE10 是不是发送非法 POST 请求?

Posted

技术标签:

【中文标题】IE10 是不是发送非法 POST 请求?【英文标题】:Does IE10 send illegal POST requests?IE10 是否发送非法 POST 请求? 【发布时间】:2013-11-15 05:41:05 【问题描述】:

我有一个 IE10 发送的 POST 请求的wireshark 捕获。 POST 请求由RFC 1867 指定发出,其中包含boundary

Content-Type: multipart/form-data; boundary=945637143527273; charset=UTF-8

让我觉得很奇怪的是

charset=UTF-8

令牌之后的部分

boundary=945637143527273;

当我查看 RFC 中的 Examples 部分时,Content-Type 标头始终由边界终止,并且没有诸如 charset 之类的尾随数据。

那么,规范中是否有一些插件允许这种行为,应该忽略尾随数据还是我(作为符合规范的 HTTP 服务器)放弃请求并向客户端发送错误?


编辑:对该主题的进一步调查将我引向这个问题:

What rules apply to MIME boundary?

接受的答案是指RFC 2046,其中边界指定如下:

boundary := 0*69<bchars> bcharsnospace
bchars := bcharsnospace / " "
bcharsnospace := DIGIT / ALPHA / "'" / "(" / ")" /
                  "+" / "_" / "," / "-" / "." /
                  "/" / ":" / "=" / "?"

因此,由于bcharsnospace 不包含;charset=UTF-8 部分显然不属于边界。在这种情况下我应该忽略它还是 Content-Type 标头的值无效?

【问题讨论】:

SubValue (parameters) 顺序无关紧要。你打破 ; 并拆分 = 以获得标题的子值。然后你只需参考'boundary' 值和'charset' 值...不管它们的顺序如何。 【参考方案1】:

您需要根据媒体类型的语法解析整个头部字段; “charset”是一个参数,就像“boundary”一样。

【讨论】:

【参考方案2】:

我无法具体评论您关于 IE10 行为的问题,但我会就您应该如何处理的问题发表评论:

应该忽略尾随数据还是应该(作为符合规范的 HTTP 服务器)放弃请求并向客户端发送错误?

如果 IE10 的行为与您描述的一样,并且您的服务器会发送错误作为响应,那么这意味着您基本上会一直向 IE10 用户发送错误响应。

IE10 用户将无法对错误采取任何措施,因此这反过来意味着您将实际上将这些用户完全锁定在您的服务器提供的任何服务之外。

在这种情况下,值得考虑一下 Postel 定律:Be conservative in what you send, be liberal in what you accept

所以我会敦促您不要发送错误,即使行为不严格符合规范。如果你能无误地处理它,那是最好的选择。

【讨论】:

:-) 我当然不想阻止所有 IE10 用户。问题的核心是IE的行为是否正常(我会默默接受请求)还是不行(我会对IE做很多咆哮)。

以上是关于IE10 是不是发送非法 POST 请求?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取IE发出的HTTP请求头

Chrome 中的 AJAX 发送选项而不是 GET/POST/PUT/DELETE?

表单提交发送 POST 请求而不是 GET

如何用ajax发送post请求?

想用Java程序打开个一个IE页面(post方式)

IE9下JQuery发送ajax请求失效