post - 关于 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 是否有任何区别:
因此,在上面的问题中,我看到没有对 POST 请求应用特殊加密。
因此,我想确认以下内容:
1.与 GET 和 POST 相关的不安全性仅仅是因为 GET 方法在 URL 中附加了参数。
对于可以拥有整个请求正文的人来说,GET 和 POST 方法同样容易受到攻击。
- 通过网络,GET 和 POST 正文都以相同程度的加密方式发送。
期待评论和解释。
解决方案
是的。服务器只知道用户输入/点击的 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 可以对其数据进行单独加密,即使临时观察者可以看到大部分请求,也可以通过这种方式保护数据。它只能由服务器解密,因为服务器保留了密钥对的私有部分
推荐阅读
- google-apps-script - 谷歌表脚本权限给任何人
- swift - 在 AppKit 视图中嵌入 SwiftUI 视图
- android - 在自定义视图类中获取空指针
- javascript - TypeError:无法读取未定义的属性“地图”并四处走动
- javascript - HTML中可调整大小的弹性表
- sql - 在 SQL Server T-SQL 中创建“特定”形式的 XML,而不使用字符串连接
- android - 如何使用线性布局动态制作这种类型的布局?
- c# - GC 用于 F# 和 C# 之间的互操作
- c# - 需要不同的模型类型,ASP.NET MVC
- java - 无空指针异常从 Map 的 Map 中获取值