在两个不同的 Web 浏览器之间共享会话
Posted
技术标签:
【中文标题】在两个不同的 Web 浏览器之间共享会话【英文标题】:Sharing session between two different web browser 【发布时间】:2013-07-07 21:09:38 【问题描述】:我想制作一个 PHP 网络应用程序,其中在一台 PC 上一次只能有一个身份验证会话,即 用户 A 使用 Firefox 登录,但用户 B 无法在同一台 PC 上使用 IE 登录
如果从服务器端询问,我无法在浏览器之间进行会话共享
【问题讨论】:
嗨 Mesohisilis,欢迎来到 SO。 或来自客户端,因为一个浏览器无法在其他 cookie 中播放 @Orangepill 因此无法完成,因为浏览器无法检查其他浏览器仪式的会话? 那是不幸的现实 正确,如果您告诉我们如果确实发生了问题,我们可以建议替代方案 【参考方案1】:理论上,您可以使用session_id() 和数据库条目来执行此操作,但安全性会很棘手,因为恶意用户可能会尝试生成随机会话 ID 来模仿登录用户的会话。
会话信息存储在客户端浏览器中的 cookie 中,具有指定的 ID。通过存储该 ID 和数据的 JSON 字符串,无论何时更新,不同的用户都可以共享相同的数据。他们都必须不时轮询服务器以查看数据是否已更改。
但是到那时,您不再需要使用$_SESSION
,因此它几乎违背了您提出问题的目的。您可以使用常规变量获得相同的行为,这已经是一种安全改进。
简短回答:不,这不是会议的重点。
【讨论】:
这将确保给定用户只能拥有一个会话,但不会将会话限制为每台计算机一个。 @Steve 我理解你在同一个浏览器仪式上的意思是什么?实际上可以使用数据库会话在一个浏览器中强制单个用户进行身份验证,但我真正想要的是使用两个不同的浏览器进行检查。 @Orangepill - 使用session_id()
会将其限制为每个浏览器一个,但无论如何您都可以使用isset()
和常规变量来执行此操作……OP 也希望使用“同一台PC”。
@Mesophisilis - 是的,您使用“原始”会话中的 session_id()
作为共享数据的参考。但这只是一个 MD5 哈希(如果我没记错的话),所以无论如何你都可以使用常规变量,只是缓存在数据库中。会话实际上只供单浏览器使用。
@Steve 谢谢史蒂夫,这就是我的想法并且仍然相信它是,但这是一个要求,所以我有什么小知识我不想拒绝可能性:)【参考方案2】:
您可以通过使用识别设备的签名算法来完成此任务(假设您与一般用户合作,他们不会尝试欺骗用户代理和其他技巧)。你的算法可以有你认为合适的变量。
例如 REMOTE_ADDR、USER_AGENT。其他特殊变量可以通过在客户端执行基于闪存的代码来获得。当每个请求进来时,您可以将其与经过身份验证的现有密钥进行比较,如果您获得一个新会话,其中除浏览器字符串之外的所有变量都匹配,您可以安全地假设它是使用不同浏览器的同一用户。
您必须使用 Flash 组件收集额外的变量才能使其工作。通过 $_SERVER 可用的变量是不够的。因为代理背后可能有用户,您不想将它们识别为误报。
【讨论】:
我觉得很有趣,你能解释一下我如何识别设备以及签名算法是什么 请注意,您仍然需要在某处缓存数据。这个答案正在讨论如何识别该数据。 通常签名算法通过使用我讨论的变量作为输入来生成唯一密钥。在您的情况下,它可以只是一个md5("$IP.$AGENT.$FLASHVER.$MAC)
,您可以删除 $AGENT 并在没有代理的情况下生成它,因此,如果您尝试创建新会话时,您可以检查已登录用户密钥的表和您的尝试创建如果有匹配项,您可以拒绝访问。
可以使用flex获取mac地址。 http://littleprograming.blogspot.com/2011/09/flex-get-mac-address.html
@Mesophisilis:这不可靠。这个解决方案仍然不能保证任何事情。 为什么你需要那个?【参考方案3】:
您可以制作登录脚本,以便在登录时检查用户是否已经登录。如果已登录,它将拒绝任何进一步的登录。
如上所述,php 可以将会话 ID 存储在数据库中。检查数据库是否存在,然后根据它允许或禁止。
【讨论】:
以上是关于在两个不同的 Web 浏览器之间共享会话的主要内容,如果未能解决你的问题,请参考以下文章