7

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

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

4

4 回答 4

5

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

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

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

于 2012-06-04T16:04:48.300 回答
4

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

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

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

于 2012-06-04T16:02:51.530 回答
2

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

OWASP的优秀人员有一个会话管理备忘单,这是任何设计的绝佳起点。

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

于 2012-06-05T01:01:51.693 回答
-2

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

而且因为它是一个 iOS 应用程序,您可以将凭据存储在 NSUserDefaults 中(它被沙箱化到您的特定应用程序并且没有其他应用程序可以访问它)

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

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

于 2014-10-31T17:12:14.433 回答