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

标签 php mysql ios

场景是这样的:

  • iPhone 应用程序使用 Appache、PHP 和 MySQL 连接到 WebServer。

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

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

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

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

如果另一个 php 脚本正在使用相同的数据执行,有什么方法可以阻止它执行?还是有其他解决方案来解决这个问题?

最佳答案

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

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

关于php - 如何防止尝试创建同一个用户两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24740020/

相关文章:

php - 使用带有连字符的 extract()

php - 请检查更新查询不起作用。我是 Mysql 新手,请

java - 尝试从现有项目生成变更日志文件时出现错误 "Table name pattern can not be NULL or Empty"

ios - 在iOS上捕获60fps帧以减少运动模糊

php - 我想写一个查询,其名称的第一个字符有 a 或 b 或 c 或 c-g

javascript - 如何使用jquery取消选中复选框

php - 从 PHP 变量中过滤特定标签内容?

php - 数据库查询执行时间太长

ios - 将ScrollView添加到UIView中

ios - 通过我的应用程序打开 Instagram 应用程序