如何防止尝试两次创建同一个用户?

时间:2014-07-14 15:22:52

标签: php mysql ios

情景如下:

  • iPhone应用程序使用Appache,PHP& amp; MySQL的。

  • iPhone应用程序连接超时为5秒(Async NSURLConnection)。如果来自服务器的响应在超时之后到来,则应用程序不知道并尝试再次发送数据。

  • 在服务器上,php脚本运行两次。一旦第一组数据到达。它在数据库中创建一个新用户,但是当应该响应应用程序超时的响应时。应用程序第二次尝试创建用户时会收到错误,因为用户名应该是唯一的。这是因为php脚本第一次将用户插入数据库。

  • 在这种情况下,用户是在服务器上创建的,但用户并不知道这一点,因为他收到了用户已经创建的错误。

一些事情:
- 超时可以增加,但并不重要。在负载下,服务器可以更多地创建用户 - 我可以测试用户是否可以登录而不是尝试创建我只是正常登录他。这里的问题是如果两个用户尝试使用相同的用户名和密码创建用户会发生什么,因为在这种情况下第二个用户将自动登录。在这种情况下,我确实可以添加一个检查,以查看用户是否在最后一刻创建,如果是,则只需登录。 (问题是如果脚本执行服务器的时间超过1分钟应首先崩溃,则创建用户脚本需要0.001秒才能执行,而在加载时需要3-4秒。

有没有办法阻止php脚本执行,如果另一个正在执行相同的数据?或者是否有另一种解决这个问题的方法?

3 个答案:

答案 0 :(得分:1)

我不确定php路由,但是iPhone方面的一个解决方案是在客户端的http请求中包含来自UIDevice的identifierForVendor:的供应商特定设备标识符。这样,您可以识别创建请求是否来自相同的设备(相同的iPhone用户)或其他人。如果此唯一ID不匹配,您可以提供“抱歉,此用户名已被删除”消息。

作为旁注,如果用户使用相同的用户名和密码创建用户,则通常认为它是尝试登录多个设备(例如iPhone和iPad)的同一用户通常是有效的。这可能是您要支持的用例。两个用户独立尝试创建相同用户/密码帐户的可能性极小。与某人随机猜测用户名/密码组合并通过该路由获取访问权限的常见情况相比,这种情况不太可能发生。如果您使用的是用户名/密码系统,那么潜在的假设是,这代表了可接受的风险级别。最小化此风险的一些策略是使用密码复杂性规则,强制用户名是有效的和确认的电子邮件地址,并且在极端情况下使用两个因素(或更多)身份验证。

答案 1 :(得分:1)

所有iphone中都有一个设备ID,它们都是唯一的,请验证您的语言,一旦用户尝试使用iphone注册,您将如何获得该设备ID。因此,使用该设备ID,他们无法进行多次注册。

答案 2 :(得分:1)

第一种选择可能是假设他们是同一个用户(或者应该选择更好的密码)并让他们进入,正如@Aaron所说。

另外两种可能性,取决于重复用户的重要性: 1)使用电子邮件地址并让他们验证用户创建操作。如果您收到重复的注册请求,您可以提出相同的"看到您的电子邮件,点击此处重新发送"屏幕。

2)使用数据库事务确保只有一个连接可以同时登录/注册。可怕的可扩展性。