【发布时间】:2015-08-27 13:18:14
【问题描述】:
我知道对于 Web 服务器处理请求而言,http 标头顺序并不重要(或者至少不应该如此)。但是,我想知道服务器(尤其是反向代理或 CDN)如何检查标头位置以使请求合法化。
让我解释一下。当我使用 Firefox 进行简单的 http 请求时,这些是我的标头:
GET / HTTP/1.1
Host: stackoverflow.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:39.0) Gecko/20100101 Firefox/39.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
DNT: 1
Cookie: yummy=yes_they_are
Connection: keep-alive
Cache-Control: max-age=0
使用 Chrome:
GET / HTTP/1.1
Host: stackoverflow.com
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36
DNT: 1
Accept-Encoding: gzip, deflate, sdch
Cookie: yummy=yes_they_are
不完全一样,对吧?然后,如果我将用户代理更改为 Firefox:
GET / HTTP/1.1
Host: stackoverflow.com
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:39.0) Gecko/20100101 Firefox/39.0
DNT: 1
Accept-Encoding: gzip, deflate, sdch
Cookie: yummy=yes_they_are
由于标头位置与 Firefox 的“标头位置习惯”不匹配,服务器可以知道发生了什么可疑的事情(用户可能使用 Chrome 扩展程序来欺骗其用户代理)。
一些http服务器真的会检查那种东西吗?至少,他们有可能这样做(云端之类的)吗?或者这是我完全不应该打扰的事情?如果需要,我在哪里可以找到主要浏览器的详尽标题顺序列表?
【问题讨论】:
-
我不知道有任何服务器关心标头排序。如果连接是纯文本代理,则可能会更改标头顺序,从而使此检测方法不可靠。有很多更好的选择可以检查用户代理是否真的是他声称的那样。
-
@Pyfisch “更好的选择”是指 JavaScript 吗?除了 Javascript,还有哪些更好的选择?
-
是的,主要是 JavaScript,还有标头值。例如 Accept 标头。你不想在 Firefox 中使用 webp,但 Chrome 总是会发送它。
-
更好的选择可能是 IP 地址。服务器已经与浏览器建立了 TCP 连接,因此它知道,对于这个请求,它正在与 A.B.C.D 对话。它可以将其压缩到 cookie 中,或将其保存在用户名中或将其放入 JWT 中,然后与同一用户的下一个请求进行比较。它可以添加用户代理,然后你有一个像“Brian on ABCD using Firefox”这样的签名,只有在另一个 Firefox 选项卡刻划数据时才会被破坏。这可能会发生。
标签: security http http-headers