草庐IT

php - 阻止用户与多个 IP 共享帐户?

coder 2024-04-27 原文

任何人都可以指点我关于如何将成员(member)区域的用户可以拥有的唯一 IP 数量限制在 5-6 左右的指南/教程。似乎我帮助管理的网站上的许多用户与数十至数百人共享他们的用户名。或者谁能​​解释我如何针对此实现某种安全措施?

最佳答案

IP 屏蔽不是解决之道。

考虑同一公司防火墙内的一群用户。当他们浏览网络时,由于代理服务器的缘故,他们所有人都将显示为具有相同的 IP 地址。代理服务器负责确保请求/响应到达正确的人。

所以,那是行不通的。

您可以做的是将登录绑定(bind)到 session 并踢出之前的登录。本质上:

  1. 收到登录请求。
  2. 服务器为该请求分配一个 session ID,将其存储在本地用户表中,然后在 cookie 中发回。
  3. 在每个后续请求中,都会验证 session ID 以查看它是否仍与用户相关联。如果没有,将他们踢出登录页面。

将会发生的是用户 Bob 将登录并获得 session ID 10。Bob 开始浏览您的站点,一切正常。

然后 Sue 登录(使用 Bob 的凭据)。这会将 session ID 22 分配给 bob 帐户。她开始浏览网站。

Bob 发出的下一个请求得到了重新验证.. 并且服务器看到 session 10 不再与 Bob 相关联。轰:踢到登录界面。

Bob 挠着头重新登录。这会分配一个新 ID:30。Sue 的下一个请求将 踢到登录页面。随之而来的是欢闹。

只是为了好玩,如果在特定时间段内(例如 2 分钟)将几个 session ID 分配给同一个帐户,请向存档的电子邮件地址发送一条消息,告知他们的帐户可能已被黑客入侵。甚至可能会关闭帐户,同时要求他们通过单击电子邮件中的链接重新确认帐户是否正常。让他们立即更改密码。

将要发生两件事。首先,许多用户会提示(有些人并不感到羞耻)。对于您如何使用这个奇特的新安全功能保护他们,一定要有一个友好而坚定的回应。不要让步。

第二件事是所有这些匿名用户都将获得自己的帐户(或离开)。原因是仅仅因为他们共享密码而被踢出网站并不是一件好事。如果我理解正确,这就是所需的行为。


有趣的是,这与一些公司(如 GoToMeeting)的工作方式类似。如果用户帐户当前正在主持 session ,然后该帐户在其他地方登录,则原始 session 将终止。相当有效。

关于php - 阻止用户与多个 IP 共享帐户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9387302/

有关php - 阻止用户与多个 IP 共享帐户?的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  3. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  4. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  5. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

  6. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

  7. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  8. ruby-on-rails - 在 ruby​​ .gemspec 文件中,如何指定依赖项的多个版本? - 2

    我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这

  9. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  10. ruby - 使用多个数组创建计数 - 2

    我正在尝试按0-9和a-z的顺序创建数字和字母列表。我有一组值value_array=['0','1','2','3','4','5','6','7','8','9','a','b','光盘','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','','u','v','w','x','y','z']和一个组合列表的数组,按顺序,这些数字可以产生x个字符,比方说三个list_array=[]和一个当前字母和数字组合的数组(在将它插入列表数组之前我会把它变成一个字符串,]current_combo['0','0','0']

随机推荐