我应该为每个服务器请求验证用户的密码吗?

时间:2012-06-04 15:57:24

标签: iphone ios web-services security

如果这对某些人来说可能是常识,我道歉,但我还在学习。我有一个iOS应用程序,可以将文件同步到Web服务器。一旦用户登录设备,他仍然会登录,除非他退出。目前,每当用户发起服务器请求(例如添加,更新或删除文件)时,我只将用户的电子邮件而不是密码发送到服务器,因为用户已经在设备上进行了身份验证。

我是否应该在每次提出请求时发送用户存储的密码并让服务器在继续请求之前对其进行身份验证?为什么或为什么不呢?

4 个答案:

答案 0 :(得分:5)

您应该发送会话标识符,而不是电子邮件地址。

当用户成功通过身份验证时,会话标识符是加密随机数生成器选择的大数(128位就足够了)。它在用户的网络设备中设置为“cookie”,并通过安全通道(TLS)与每个请求一起发送。

电子邮件地址是公开的。您只能对包含密码的请求进行身份验证,例如密码或会话标识符。

答案 1 :(得分:4)

我不是专家,但在你得到更好的答案之前,这里有一些提示:

  • 每个请求都应包含某种“会话标识符”,以表明它是登录会话的一部分。攻击者无法猜测或重用此标识符是不可能/困难的。通常使用HTTP cookie,但您可以将它们包含在URL中。
  • 您永远不应该通过网络发送明文密码,因为任何嗅探网络的人都会看到它们。相反,您应该发送某种散列密码或使用质询 - 响应协议。

如果您使用的是HTTPS,那么您可能不需要太担心这一点。如果是未加密的流量,那么您可能希望使用额外的哈希值“签名”每条消息。

答案 2 :(得分:2)

使用电子邮件地址识别用户意味着有人可以使用现有用户电子邮件地址伪造对您服务的访问权限。正如Kristopher Johnson建议的那样,使用会话标识符可以避免暴露凭证,这可能是一个很好的设计选择。

OWASP的好人有session management cheat sheet,这是任何设计的绝佳起点。

他们建议使用现有的会话管理框架(Java EE,ASP.NET,PHP)(如果有)。

答案 3 :(得分:-2)

如果您要通过SSL,那么最好在每次请求时发送用户名和密码。为什么?因为它更简单的编程接口,因为令牌没有增加真正的价值。在某些时候获取令牌你必须发送凭证,所以如果你每次都发送凭证有什么关系?没有人能够在有时间的时间内解密SSL。现在可能存在其他安全漏洞,例如Web服务器本身,但这与从客户端到服务器(受保护)的传输无关。因此,用户/传递每个请求是最好的。

由于它是一个iOS应用程序,您可以将凭据存储在NSUserDefaults中(沙箱映射到您的特定应用程序,而其他任何应用程序都无法访问它)

请投票并接受,其他答案具有误导性

现在,如果它不是iOS应用程序,您必须将凭据存储在cookie而不是NSUserDefaults中,那么确定,也许您可​​以使用会话进行参数。但除此之外的会议不值得头疼!