HTTP POST有多安全?

84

使用POST提交登录凭证安全吗?

还是必须使用SSL连接?


1
请参见之前的问题 (https://dev59.com/PUjSa4cB1Zd3GeqPCAyt)。 - Matthew Flaschen
7
嗨,马特,在你问之前,是的,你需要对存储在服务器上的登录密码进行哈希处理。 - erickson
1
我认为这是一个严肃的问题。看看马特的其他问题,你会发现他可能是个新手,因此这个问题看起来很天真。 - JohnFx
3
没问题! - Andy Mikula
3
这是一个严肃的问题。我曾认为,由于数据没有通过查询字符串传递,因此黑客不容易检索到它。我只是用登录凭据作为示例,因为我知道很多人在涉及程序员处理凭据的方式时会感到担忧。 - Matt
显示剩余2条评论
14个回答

98

SSL是必需的。

POST方法并不比GET更安全,因为它也会以未加密的方式在网络上发送。

SSL将覆盖整个HTTP通信,并加密客户端和服务器之间传输的HTTP数据。


12
必须吗?针对一个小马宝莉迷论坛而言?难道需要鸟类雷达屏蔽终端、量子加密以及经过测试的租用线路吗? - Martin Beckett
16
@mgb: 租赁?你一定是在开玩笑。如果你不拥有整条铜线,怎么能确定它是安全的?! - Andy Mikula
154
因为人们在小马宝莉论坛和他们的银行账户上都使用相同的密码。 - erickson
80
ponygirl88想要一个账户,妈妈为她创建了一个。妈妈使用了她用于投资账户的相同用户名和密码。MLP开发人员忘记要求SSL身份验证。妈妈损失了所有的钱,现在ponygirl88无法上大学。只需要使用SSL即可。 - yfeldblum
14
不是讽刺,我不确定为什么你会认为是。这是一个巨大的问题;大多数程序员甚至没有意识到这个问题,那些意识到的人并不应该期望“普通”人关心它。 - erickson
显示剩余6条评论

44

<shameless plug>我写了一篇关于HTTP请求和GET请求与POST请求的比较的博客文章。为了简洁起见,GET请求:

GET /?page=123 HTTP/1.1 CRLF
Host: jasonmbaker.wordpress.com CRLF
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 CRLF
Connection: close CRLF

并且使用POST请求:

POST / HTTP/1.1 CRLF
Host: jasonmbaker.wordpress.com CRLF
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1 CRLF
Connection: close CRLF
CRLF
page=123

(CRLF仅表示换行符)

如您所见,仅从形成请求的角度来看,POST请求与URI请求的区别在于使用POST单词,并且表单数据是发送到请求正文而非URI中。因此,使用HTTP POST是安全性通过混淆进行保护。如果要保护数据,应该使用SSL。

* 请注意,还其他差异


9
感谢提供为什么POST不再安全的可视化展示,+1。 - Rob Wilkerson
19
你是说你要编译你的 XML 文件吗? - dimo414

9

HTTP POST请求并未加密,这意味着它可以被网络抓包工具截获,代理服务器或自定义日志级别的服务器记录泄露。是的,相对于GET请求,POST请求更安全,因为代理服务器或者服务器并不通常记录POST数据,但也不是完全安全的。 如果要保护密码或其他机密数据,必须在进行POST请求之前使用SSL或对数据进行加密。另外一种选择是在浏览器端使用摘要认证(详见RFC 2617)。请记住,(自制的)加密并不足以防止重放攻击,必须在加密前将一个随机数和其他数据(例如领域)连接起来(请参阅RFC 2617了解如何在摘要认证中执行此操作)。


8

这取决于您的具体情况,攻击者窃取凭据的成本有多高?

如果只是登录到一个软件问答网站,那么可能不需要SSL,但如果是在线银行网站或者您存储信用卡数据,则需要使用SSL。
这是一个业务而非技术决策。


1
Malfist:人们经常重复使用密码,但如果你截获了一个随机密码,你知道在哪里还可以使用它吗? - TheTXI
2
如果您正在监听流量以获取凭据,则可以查看用户访问的任何站点。 SSL并不隐藏地址,只是数据。 - Jim
1
Malfist,你说得很对 - 但是,“你必须做X”回答其中X是SSL、单元测试、备份、RAD等而不质疑成本效益几乎总是错误的答案。在这种情况下,gumbo指出POST与GET一样安全,这是正确的。 - Martin Beckett

5

SSL是必须的 :)

HTTP Post以明文形式传输。例如,下载并使用Fiddler观察HTTP流量。你可以轻松地在那里看到整个post(或通过像WireShark这样的网络流量监视器)


5

这不安全。POST请求和GET请求一样容易被嗅探。


2

不要使用POST请求,它并不够安全。SSL是必须的。

POST只能有效地隐藏查询字符串中的参数。但这些参数仍然可以被截取浏览器与终点之间的通信流量的任何人获取。


2
不要使用POST,应该使用SSL。使用POST提交的值仍然以明文形式提交,除非使用SSL加密。

2
最安全的方式是根本不发送凭据。
如果您使用 摘要验证(Digest Authentication),那么SSL不是必须的
(注:我并不意味着通过HTTP进行的摘要验证始终比在HTTPS上使用POST更安全)。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接