为何超文本传输协议(HTTP)允许使用GET请求修改数据?
为什么HTTP允许用GET请求修改服务器数据?什么时候会有人这么做?
先把话说在前头:绝对不能用GET请求修改服务器数据,这是行业里的铁律,但你的问题问到点子上了——为啥HTTP会允许这种操作,真有人会这么用吗?
为什么HTTP允许GET修改数据?
HTTP本质上是个资源传输协议,而非严格的"操作强制规范"。它只是定义了GET的语义是「获取资源」,但并没有从技术层面硬限制服务器在接收GET请求时不能执行修改操作。早期HTTP的设计更看重灵活性,把方法的正确使用规范交给开发者和应用架构来约束,而不是协议本身卡死。
什么时候会有人用GET请求更新数据库?
说实话,这种场景非常少见,基本都是历史遗留或者特殊边缘情况:
- 老旧应用:早年一些简单的Web应用(比如2000年代的小论坛、工具网站),开发者可能没吃透HTTP方法的语义,图省事就用GET处理所有操作,包括修改数据。
- 简单触发动作:极少数场景下需要触发一个无复杂参数的服务器动作(比如
/api/clear-cache?token=xxx这种清理缓存的接口),但哪怕是这种情况,用GET也是不符合规范的坏习惯。 - 测试调试:开发者在测试阶段可能临时用GET快速触发服务器端的修改,但这种操作绝对不能放到生产环境里。
GET请求的特性为什么让它不适合修改数据?
正是这些特性,决定了GET绝不能用来改数据:
- 可被缓存:CDN、浏览器或者代理服务器可能会缓存GET请求的结果,导致后续请求根本到不了服务器,或者返回修改前的旧数据。
- 会留存于浏览器历史记录:包含修改参数的完整URL会存在用户的浏览记录里,误点、回退页面都可能重复触发修改操作。
- 可被添加书签:如果用户把这个修改URL存成书签,以后一点击就会再次执行修改,完全违背用户预期。
- 可分发&共享:用户把URL发给别人,对方打开链接就会触发同样的修改,不管是安全还是易用性都有大问题。
- 易被攻击:针对GET请求的CSRF(跨站请求伪造)攻击实施成本极低,攻击者只要诱导用户点击恶意链接,就能执行未授权的修改操作。
内容的提问来源于stack exchange,提问作者Yusha
相关产品推荐
相关产品推荐

