2012-06-04 30 views
7

我很抱歉,如果这可能是一些常识,但我还在学习。我有一个将文件同步到网络服务器的iOS应用程序。一旦用户登录设备,他将保持登录状态,除非他退出。目前,只要用户发起服务器请求(例如添加,更新或删除文件),我只会将用户的电子邮件而不是密码发送到服务器,因为用户已在设备上进行身份验证。我应该为每个服务器请求验证用户的密码吗?

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

回答

5

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

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

电子邮件地址是公开的。您只能使用密码来验证请求,例如密码或会话标识符。

+0

因此,每个用户都有一个一次生成的会话标识符?这种类似于服务器请求的唯一ID吗?它是随每个请求而改变,还是它是一个生命期标识符?密码散列怎么样?我可以用它来代替吗? – Snowman

+0

您每次登录时都会生成一个新的会话标识符。不确定您用于服务器的是什么,但大多数会自动为您执行此操作。关键在于,如果服务器在用户登录之前生成会话ID cookie *,并且通过不安全的渠道将该cookie发送出去,则必须使会话无效并在登录时创建一个新的cookie。所有经过身份验证的请求必须通过HTTPS执行。 – erickson

+0

因此,例如Facebook的iOS应用程序..用户通常会保持登录数月。他们会怎么做?无论用户登录多少个月,他们都会使用相同的会话ID?他们是否发送电子邮件或密码?他们如何查找用户? – Snowman

4

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

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

如果您使用的是HTTPS,那么您可能无需担心太多。如果它是未加密的流量,那么您可能希望使用额外的散列值对每条消息进行“签名”。

2

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

OWASP的好人有一个session management cheat sheet这是一个很好的起点,任何设计。

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

-2

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

而且因为它的iOS应用程序,你可以存储在NSUserDefaults的凭证(这是沙箱到您的特定应用程序,并没有其他的应用程序可以访问它)

请了投票,并接受,其他的答案是误导

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

+0

这不是一个简单的服务器上的编程接口。大多数Web应用程序容器都假定使用会话标识符并自动为您进行管理。任何体面的HTTP客户端库将提供类似的,因为它是一个广泛遵循的惯例。 – erickson

+1

@erickson其实它更简单。想象一下。客户端发送令牌。服务器发回令牌无效。客户端必须请求新的令牌。那里就是另一个不必要的步骤。 – MobileMon

+0

@erickson能否解释在这种情况下使用令牌的真正好处?也许我可以学到一些东西 – MobileMon

相关问题