你永远不应该使用GET来更改服务器上的数据,这是显而易见的。真正的问题是:
为什么 超文本传输协议甚至允许使用GET请求进行更改?什么时候有人会使用GET请求来更新数据库中的内容?
可以缓存GET请求
GET请求可以保留在浏览器历史记录中
GET请求可以加入书签
GET请求可以分发&共享
GET请求可能被黑客入侵
Reference for the above 5 statements ^
很明显,在这种情况下你绝不应该使用 GET :
2. No, you still can't use GET to do that!
3. Do you GET it yet?(看我在那里做了什么)?
再次,我问,为什么是否仍然可以使用 GET 更改数据?为什么他们不只是将其作为只读操作?那么您甚至不必担心错误地使用 GET 或恶意使用 GET 。
答案 0 :(得分:2)
仅仅因为有人说'不要那么做'#34;并不意味着它无法完成。
正式正式规范中描述的HTTP 的使用/实施不会导致GET请求触发数据更改。
但编写规范的人不是代码警察,因此人们可以编写他们的服务器代码来做任何他们想做的事。
编辑添加: 经过我们之前的讨论,我认为我需要深入细致地解释这一点。
TL; DR; - 研究网络流量的实际运作方式。
要真正了解为什么可以使用GET请求保存数据,您需要知道事情是如何工作的。
我们将从最低的硬件层开始,然后继续努力。
第1层 - 您的网卡
这张卡的目的只是为了提供交通通道。就是这样。它不进行任何类型的过滤 - 这是更高层的工作。网卡的固件不知道关于HTTP的第一个事情,因此它不关心请求是否是GET。
您的网卡将 NOT 限制HTTP GET请求执行任何操作。
第二层 - TCP / IP堆栈(这有点概括。可能有更多层来管理我不知道的一些通信,因为我不是从技术上讲,TCP / IP堆栈是两层的。)
TCP和IP作为写入TCP和IP标准的软件开始。因此,很可能不同的软件供应商可以编写自己的解释,并且如果他们愿意,可以忽略标准的元素(如果标准成熟时实际发生,我不会感到惊讶)。最终,该标准变得无处不在,以至于它迁移到了网卡本身的固件中。此时,TCP / IP可以被视为硬件实现。
TCP代表传输控制协议。 TCP的工作是定义如何在网络上理解数据。这是"思考"的层。确定一段数据是否适用于您的计算机。 TCP也对HTTP一无所知,因此它也不关心GET请求。
IP代表Internet协议。它位于TCP之上,以帮助确定哪个软件负责通过TCP发送的内容。 IP定义了IP地址和端口的概念。 IP负责将提供的数据包传送到指定的计算机以及注册以处理给定端口的交换机的软件包。这是引入和处理IP地址和端口概念的地方。
IP通过将发送的实际数据包装到数据包中,添加方向(IP地址和端口以及其他一些数据)进行传送。忽略包的实际内容,因为它不是IP层的责任。
请注意,HTTP标头不是IP寻址机制的一部分 - 它们是正在传递的内容的一部分。
第三层 - 软件
要处理IP数据包,软件程序会要求自己保留一个端口,告诉IP堆栈"将此端口上的任何数据直接发送给我"。
任何软件包都可以保留任何端口,但只有软件到端口的绑定才是1:1的交易。一个程序到一个端口,每个程序一个端口。
HTTP 标准是端口80 - 但在将网站部署到端口80之前,使用不同的端口(如8080)测试网站非常常见。
但是,完全可以将端口80用于不同的目的 - 如果您愿意,可以将它用于Telnet服务器,FTP服务器,自定义协议 - 甚至是DNS服务器。 TCP / IP堆栈不关心您正在使用端口做什么,它只关心将数据传送到"前门"。由于 可能(并非罕见)为不同的东西重用端口,因此TCP / IP不会进行任何内容过滤。同样,HTTP GET请求不会在TCP / IP堆栈中进行过滤,因为软件包负责处理所传递的数据。
......现在我们得到了我一直想说的话。 人决定他们编写的软件会做什么。有 MANY 不同的HTTP服务器实现(两个"标准"版本是Microsoft和Apache - 但如果您不了解它,请查看Node的内容。 JS社区可以通过HTTP服务器实现来实现。现在可能有数千种不同的自定义HTTP服务器实现。)
了解所有,我会问你 HOW 是否可能限制GET请求添加/更改数据? IP层根据端口查看数据,不允许机构进行GET请求?我可以想到两个"变通办法"就在我的脑海中 - 将内容添加到URL或向cookie添加内容。
所以,(最后)回答你的问题:虽然理论上可能构建一个系统,该系统会限制所有作为HTTP服务器的软件的行为,以便阻止任何GET来自修改数据的请求 - 这是实用不可能。
答案 1 :(得分:1)
从theGleeps回答和评论中得出结论,'HTTP只是一个标准 - 标准不能控制任何东西。'
HTTP是一组指导原则,而不是有权控制任何内容的应用程序或机构。创建Web API时,您可以使用任何您喜欢的东西,可以使RETRIEVE动词检索对象。你马上遇到了麻烦,因为网络上的其他人都坚持使用HTTP标准并使用GET动词来检索项目,因此没有客户可以与你的API通信。但无论如何都没有人阻止你使用RETRIEVE。
显然,这是人们在坚持使用GET修改服务器上的数据时遇到的问题之一 - 正如您在问题中通过您提供的链接指出的那样 - 机器人假设任何GET都是安全且幂等的。因为标准是这样说的。
您的Microsoft示例不成立,因为这是一家公司创建了一个应用程序(或OS?API?您引用了什么?),强制您不能将字符文字存储在int数据类型中。对于HTTP,可能有这样一个机构(我必须承认,我不确定,有没有人拥有HTTP标准?W3C,IETF?),但是没有可以强制执行规则的总体应用程序/ OS / API。规则由用户及其解释和实施方式强制执行。并且一些规则(例如,“用于检索项目的动词是GET”)比其他规则强制执行(例如,“GET是安全且幂等的”)。
将其与访问荷兰的美国人进行比较。访问者习惯于AM / PM时间格式。没有人会强迫她使用24小时格式,没有时间格式警察。但她很快就会发现许多荷兰人感到困惑,因为他们不知道AM是早上还是下午或其他什么。
总而言之,为什么仍然可以使用GET更改数据,或者如果愿意,可以使用动词RETRIEVE而不是GET?因为HTTP是一种只有用户才能拥有权力的标准。
我希望我的回答更清楚一点(我被问题触发,非常有趣)。
答案 2 :(得分:0)
为什么超文本传输协议甚至允许使用GET请求进行更改?
它没有。 specification说:
4.2.1。安全方法
请求方法被视为"安全"如果他们定义了语义 基本上是只读的;即,客户不要求,和 不期望,原因服务器上的任何状态更改 将安全方法应用于目标资源。同样, 合理使用安全方法预计不会造成任何伤害, 原始服务器上的财产损失或异常负担。
...
在本规范定义的请求方法中,GET, HEAD,OPTIONS和TRACE方法被定义为安全的。
再次,我问,为什么甚至可以使用GET更改数据?
因为有些人编写违反HTTP规范部分的HTTP服务器代码。
由于他们正在编写代码,因此他们有责任遵守规范,但如果他们(通过选择或无知)不遵守规范,则没有人可以阻止他们。