最近,一位同事告诉我,第三方可以看到HTTPS GET请求的查询字符串,我开始证明他是错的。但是找到任何关于URL解析的明确描述都很困难。
我的理解是URL只是零碎地发送,域传递到IP头,端口传递到TCP头等等。在HTTPS GET的特定情况下,这将意味着查询字符串将只驻留在HTTP标头中,而HTTP标头又位于TLS主体中,该主体是端到端加密的,因此是安全的。
我的问题是双重的:
答案 0 :(得分:3)
首先,使用HTTPS时,在传输过程中受保护的查询字符串是正确的。关于此问题已经有很多问题,例如this one。本质上,HTTPS是基于SSL / TLS的HTTP,因此在发送任何HTTPS流量之前设置SSL / TLS连接。 (在TLS的服务器名称指示扩展中,主机名可能是可见的,或者无论如何都可以通过DNS请求泄露。)
其次,当您向https://host.example:port/something?blabla=1
发出GET请求时,这是对所发生情况的概述:
host.example
建立TCP连接。https://
网址,因此建立了SSL / TLS连接。 SSL / TLS堆栈应验证证书,并且它与您之后的主机名相匹配。在此SSL / TLS连接之上(使用普通HTTP时,它将直接位于TCP连接之上),您的浏览器会发送如下内容:
GET /something?blabla=1 HTTP/1.1
Host: host.example:port
.... (other headers)
所有这些都是通过SSL / TLS发送的。请注意,严格来说,查询参数是网址的组成部分,并会发送in the Request-Line
, not headers。
答案 1 :(得分:-1)
IP标头不会使用URL或域或类似的东西,但它们封装的TCP会。在这种情况下,封装的所有内容都是加密的。
我认为值得指出的是,虽然您可能看不到给定的HTTPS消息,但消息如
GET https://example.com/query?q=text
我相信您会看到针对'示例'的DNS请求在明确;其他所有内容都将在HTTPS中加密。所有这些都表示在主机解析步骤中不要忘记加密。它不在IP标头中,而是IP地址的用途。但我们可以通过DNS获取这些地址。