post提交数据相对于get的安全性高一些

时间:2026-10-17 05:06:40 来源:力不从心网

浏览器地址栏里那串长长的提交URL,就是数据GET请求的“作案现场”。你输入密码登录,相对如果走的全性是GET,密码会直接挂在网址后面,提交像“?数据user=admin&pass=123456”这样明晃晃地躺在历史记录、服务器日志、相对甚至路由器缓存里。全性隔壁工位的提交同事只要瞥一眼你的屏幕,你的数据密码就裸奔了。

POST不一样。相对它把数据塞进了请求体,全性就像把信装进信封再寄出去,提交而不是数据把信的内容写在明信片上。URL保持干净,相对浏览器历史记录里只有“example.com/login”这种光秃秃的地址,至于你传了什么,服务器日志里看不到,代理服务器也看不到。就凭这一点,POST就比GET体面得多。

但别急着给POST发“安全卫士”奖章。它只是相对安全,不是绝对安全。我拿抓包工具试过——用Fiddler或者Wireshark一抓,POST提交的数据照样以明文形式躺在HTTP报文里。你输入“password:123456”,抓包软件里显示的就是“password=123456”,连加密都没有。这就像把信装进信封,但信封是透明的。

所以POST真正的优势在于“不暴露在表面”。它减少了意外泄露的概率,比如你顺手把登录链接发给别人,或者浏览器自动补全时把参数带出去,又或者公司防火墙记录URL时把你的密码存进审计系统。这些场景下,GET是裸奔,POST至少穿了条短裤。

还有个实际差别——浏览器和服务器对URL长度有限制。GET把参数全塞在URL里,IE老版本限制2083个字符,超过就被截断。POST没有这个限制,因为数据在请求体里,所以上传大段文本、文件、JSON数据时,只能用POST。这个限制本身也构成一种安全边界:GET不适合承载敏感或大体量数据,不是因为它不安全,而是因为它根本装不下。

我做过一个小实验。用GET提交一个包含中文和特殊字符的字符串,浏览器会自动URL编码,变成一串%号加十六进制数字。但服务器日志记录的是解码前的原始URL,也就是说,你发的“你好”会变成“%E4%BD%A0%E5%A5%BD”存进日志。而POST提交相同内容,日志里只有请求体大小,具体内容不会出现在访问日志里。你说哪个更让运维人员头疼?显然是GET——日志文件里塞满了用户输入的原始数据,哪天泄露出去就是安全事故。

当然,真正敏感的数据,POST也不够。必须上HTTPS,让整个HTTP报文在TLS隧道里加密传输。这时候POST和GET的差异就缩小了——HTTPS下两者都是密文。但GET的URL仍然会出现在浏览器历史、收藏夹、代理缓存里,这些地方不会因为HTTPS就消失。POST的数据在请求体里,只要服务器不主动记录,这些数据就不会被持久化到任何地方。

所以我的结论是:POST比GET安全,不是因为它加密了,而是因为它降低了数据暴露的“表面积”。你用GET提交密码,等于把密码写在便利贴上贴在公共场所;用POST提交,等于把密码写在纸上放进自己口袋。都算不上绝对安全,但后者明显更靠谱。开发时记住一个原则——凡是改变服务器状态的操作(登录、下单、改密码),一律用POST;凡是只读查询(搜索、翻页),才用GET。这不是教条,这是用无数次数据泄露换来的教训。

推荐内容