首页 > 解决方案 > 关于 GET 和 POST 的误解

问题描述

显然,我误解了 GET 和 POST 方法的不同之处在于查询参数以明文形式作为 GET 方法中 URL 的一部分,而查询参数在 ENCODED(ENCRYPTED) FORM 中的 URL 中。

然而,我意识到这是一个严重的误解。在经历了之后:

https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9

在 python 中编写一个简单的套接字服务器并将其发送 GET 和 POST(通过表单提交)并在服务器端打印请求之后

我知道只有在 GET 中,参数在 URL 中,但在 POST 中,参数在请求正文中。

我还研究了以下问题,以查看在较低级别(C 级)发送 GET 和 POST 是否有任何区别:

执行 HTTP POST 并使用响应的简单 C 示例

因此,在上面的问题中,我看到没有对 POST 请求应用特殊加密。

因此,我想确认以下内容:

1.与 GET 和 POST 相关的不安全性仅仅是因为 GET 方法在 URL 中附加了参数。

对于可以拥有整个请求正文的人来说,GET 和 POST 方法同样容易受到攻击。

  1. 通过网络,GET 和 POST 正文都以相同程度的加密方式发送。

期待评论和解释。

标签: postnetworkingget

解决方案


是的。服务器只知道用户输入/点击的 URL,因为它是作为请求的数据发送的,在协商(传输)安全性之后,它本质上不是不安全的:

  • 你在浏览器中输入:https ://myhost.com/a.page?param=value
  • 浏览器对 myhost.com 进行 DNS 查找
  • 浏览器连接到检索到的 ip 的 https 端口 443
  • 浏览器协商安全性,如果服务器使用 SNI 证书,可能包括 myhost.com
  • 连接现已加密,浏览器通过链接发送请求数据:

    GET /a.page?param=value HTTP/1.1 主机:我的 host.com(其他标头)

    //可能没有body数据

    - - 或者 - -

    POST /a.page HTTP/1.1 主机:我的 host.com(其他标头)

    param=value //正文数据

您可以看到这只是通过加密连接发送的数据,标头和正文由空行分隔。GET 不必有一个主体,但不妨碍拥有一个。POST 通常有一个正文,但我要说的是,param=value与请求相关的数据(用户输入的内容,潜在的敏感信息)包含在请求中的某处 - 无论是在标头中或身体 - 但所有这些都是加密的

从安全角度来看,唯一真正的区别是浏览器历史记录倾向于保留完整的 URL,因此在 GET 请求的情况下,将param=value在历史记录中显示给下一个阅读它的人。传输中的数据对于 GET 或 POST 都是安全的,但是将敏感数据放在 POST 上的趋势集中在客户端浏览器历史上下文中的“静态数据”概念上。如果浏览器没有保留历史记录(并且地址栏没有向肩冲浪者显示参数),那么任何一种方法都将大致等同于另一种

保护浏览器和服务器之间的连接非常简单,这意味着现有的发送/接收数据设施都可以在没有个人注意的情况下工作,但这绝不是保护连接的唯一方法。可以想象,可能不让传输器执行此操作,而是让服务器在页面上的某处发送一段 JavaScript 和公钥/私钥对的公共部分,然后每个请求页面 [脚本导致浏览器] make 可以对其数据进行单独加密,即使临时观察者可以看到大部分请求,也可以通过这种方式保护数据。它只能由服务器解密,因为服务器保留了密钥对的私有部分


推荐阅读