我对安全性还很陌生,因此可以原谅我的基本问题,但是SSL可以加密POST请求而不是GET请求吗?例如,如果我有两个请求,


www.mycoolsite.com/index?id=1&type=xyz

POST

站点:www.mycoolsite.com/index
{< br Params:id = 1&type = xyz
}

可以安全地假设有人能够拦截整个GET请求(读取ID和类型),但是如果他们拦截了发布后,他们将能够看到站点路径,但是由于它正在通过SSL传递,因此他们无法看到id和type的参数?

评论

不,如果两个示例的协议均为HTTPS,则完整的HTTP通信将封装在SSL / TLS中!请注意,所引用的资源(图像等)可能不安全,具体取决于其uri。

只是想指出,如果您使用GET传递凭据(无论是否使用SSL),密码将以纯文本格式存储在Web服务器日志中。

#1 楼

现在的问题是,您知道HTTP请求的样子吗?

,假设没有,这是一个示例:

GET /test?param1=hello&param2=world HTTP/1.1
Host: subdomain.test.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0.1) Gecko/20100101 Firefox/10.0.1
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive


所有这些信息都包含在SSL传输中-正如您对答案的评论所言。这意味着:


加密获取参数。
HTTP正文(后置参数)被加密。

什么不一定安全:


您要的主机。目前,大多数Web服务器都支持Host: something参数,因此一台Web服务器可以在一个接口和IP地址上处理多个域。显然,此标头是加密的,但是,如果您向该站点运行非https流量,则应清楚您可能连接到哪些主机。即使不是这种情况,反向DNS当然也可以告诉您该IP上托管了什么,您可以从那里进行合理的猜测。
您的浏览器/客户端信息。不幸的是,每个https客户端都是不同的,并且其协商过程可能会放弃其运行在什么平台上或使用哪种浏览器。无论如何,这不是世界末日,这只是一个事实。

POST请求看起来类似于get请求,但它们包含一个正文。这可能看起来像这样:

POST /testpost HTTP/1.1
Host: subdomain.test.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0.1) Gecko/20100101 Firefox/10.0.1
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive

param1=hello&param2=hello


当然,有一些更复杂的变体,但是本质上还是全部加密了。

评论


这里的所有答案都很好。实际上,很难形容“最佳”答案,因为每个答案都是互补的。之所以选择这个,是因为它显示了get和post的样子。但是,我真的很喜欢吉尔(Gilles)从事其他工作,需要提防,金博伯(Jimbob)博士的回答也是如此。实际上,Ordag的评论是我以前从未考虑过的,因此我也对此表示感谢。如果可以的话,我将汇总所有答案并将其全部标记为可接受的答案,因为每个答案都建立在最后一个答案的基础上。

– TomJ
2012年3月9日在16:36

要添加详细信息,浏览器通过TLS的服务器名称指示(SNI)扩展使目标主机可见。

–木薯
2012年3月29日在16:54

#2 楼

我没有在其他响应中提到此问题,但是即使使用SSL,您通常也不应在GET请求中放入秘密信息(密码),而应使用POST。为什么?带有敏感信息的URL通常会记录在两端。例如,在您的浏览器历史记录列表(https://www.example.com?user=me&password=MyPassword)以及服务器上的日志中。 POST信息(尤其是带有密码的信息)通常不会写入Web服务器日志,尽管显然可以将其配置为记录日志,所以最好不要在不同站点重复使用(或使用类似的密码)。

评论


此答案提到引荐来源网址也可能包含敏感信息。在此新闻头中指出,敏感信息已被删除。这些让我感到困惑;推荐人可以包含敏感信息吗?即使是在单页应用程序中使用ajax从javascript获取请求,仍然是这种情况吗?

–surfmuggle
2014年11月3日在10:24

@threeFourOneSixOneThree-网站有可能通过javascript剥离敏感信息。但是,默认情况下(至少在我测试过的所有浏览器中),引用标头包含所有HTTP GET查询参数。我已经在reddit上创建了指向whatismyreferer.com的链接(该链接回显了网站通常记录的推荐人信息)。转到末尾带有GET参数的链接,例如:reddit.com/r/sandboxtest/comments/2l7adf/referer_test / ...,您会发现敏感部分是引用标头的一部分(即使使用https)。

– jimbob博士
2014年11月3日22:38

#3 楼

SSL加密并确保整个连接的真实性,包括所请求的方法和URL。 GET和POST一样受到保护。 ,什么时候,多少钱。如果同一台计算机上有多个虚拟主机,则攻击者无法知道您正在与哪台虚拟主机联系(但是,窃听者可能会在HTTPS请求之前看到您的DNS请求,并做出合理的猜测)。所有这些信息也都经过了身份验证:主动的攻击者无法扮演中间人的身份并修改传输中的数据。 />
应用程序滥用,其中一些数据是通过纯HTTP意外发送的。
SSL协议中的罕见漏洞之一,例如最近的BEAST漏洞。攻击者以服务器身份假冒,原因可能是服务器的证书已泄漏,证书颁发机构未正确地将证书交付给攻击者,或者是因为客户端未正确检查服务器的证书。


关于这一点,请记住,由于SSL大部分时间都在使用,因此它对服务器而非客户端进行身份验证。服务器无法假定有关客户端的任何信息。



旁道攻击可能会向窃听者泄露一些信息。例如,参与者发送数据的确切时间可能揭示有关数据计算方式的某些信息,从而揭示数据的性质。攻击者还知道每个数据包的大小。如何揭示这一点取决于参与者是否采取预防措施以及信息的性质。实时对话比下载文件更容易进行这种流量分析。

另请参见观察建立的HTTPS连接的人们怎么可能不知道如何解密它?对于某些背景。

#4 楼

只是添加了一个有关如何通过HTTP实现的小细节。
您可能想知道(或者,如果您熟悉SSL握手,应该知道)如何创建SSL通道,没有将GET请求发送为未加密状态?如果我的请求必须通过代理怎么办?那怎么可能?

HTTP v1.1引入了CONNECT HTTP方法,该方法基本上是通过代理将简化的请求发送到服务器,该代理仅包含最简单的主机URL(不包含任何其他参数,标头或正文)。基于此请求,将构建SSL隧道,然后通过该隧道发送原始GET(或POST)请求。

#5 楼

未提及的另一点是,如果您使用GET并具有任何嵌入式或链接的第三方内容(例如,站点广告),则该第三方站点将在Referer标头中获得完整的URL(带有敏感参数数据)。

将数据暴露给不应该拥有的第三方。

#6 楼


资料来源:关于堆栈溢出的解答


GET方法仅用于数据检索,不应有任何副作用。但是POST是用于特定目的的:在服务器端更改数据。只需伪造POST请求时将图像放在页面上,就可以轻松地提出GET请求(请参阅跨站点请求伪造)。并不是那么容易(这也是为什么您只应允许授权的POST请求的原因)。