我在考虑REST web Service API的安全性,并决定看看其他大型服务以及它们是如何实现的。作为一个例子,我决定研究Twitter的OAuth。看完初学者指南后,我有点困惑和震惊。
正如我所理解的,服务提供商有责任验证用户,并向用户显示消费者所要求的访问类型(例如,它希望对特定资源进行只读访问)。但我看到服务提供商并没有告知用户消费者要求什么类型的访问(甚至现在还显示消费者的身份)。问题的第二部分是,消费者可以在IFrame中显示他自己的自定义提供商服务身份验证表单,只需隐藏访问详细信息,他们可以窃取你的密码,或请求无限访问你的资源,他们基本上可以为所欲为,有很多方法可以欺骗用户。
让我们以领英为例。他们在自己的表单中请求你的gmail用户名和密码,而你不知道他们将如何使用它。他们可以窃取它并存储在他们的数据库中,他们可以用它对gmail进行OAuth(他们不会在gmail的页面上显示他们请求的访问类型),他们可以对这些信息为所欲为。
我想说的并不是OAuth通信协议不安全,而是有很多方法可以不正确地使用它来欺骗用户并获取他的凭据。
顺便说一句,OAuth协议本身存在一些安全缺陷:(http://oauth.net/advisories/2009-1/),我很确定还有更多,但没有人愿意找到它们。