Php 仅当请求来自其他特定网站时才允许登录网站
我有一个PHP/MySQL网站(网站1),它的登录系统只要求输入PIN码(只是一个长的数字字符串)。用户有两种使用此代码登录的方式:Php 仅当请求来自其他特定网站时才允许登录网站,php,login,referrer,Php,Login,Referrer,我有一个PHP/MySQL网站(网站1),它的登录系统只要求输入PIN码(只是一个长的数字字符串)。用户有两种使用此代码登录的方式: 转到website 1登录页面,并以典型的登录表单输入代码 在网站2中点击一个链接,该链接带有他的PIN码作为获取值。该链接具有相同的格式。它只调用一个函数,该函数接收PIN作为参数并处理登录网站2位于与网站1不同的域/服务器中 在这之前一切都很好 现在问题来了。我想知道,当使用上述第二种方法时,是否可以仅允许登录(假设PIN是正确的)只允许在特定网站中单击该链接
我认为添加这一点很好,因为一些评论/回复谈到了这样做的安全性(当然这很好)。这样做的主要原因是“强迫”用户在访问网站1之前访问网站2。基本上,他们无法在浏览器中输入该URL并登录到网站1,我只想在他们从网站2单击该链接时才能使用该链接。我解释这一点是因为安全性在这里不是一个很大的因素,如果一些精明的用户可以绕过我实现的任何方法,这不是什么大问题,更重要的是,该方法尽可能简单地在网站2中实现(因为我不运行该网站,我需要让那里的人做任何需要的事情)这个问题是多方面的$_服务器['HTTP_REFERER']可供PHP使用,但可以被欺骗或忽略,并且被认为是不可靠的 跨域cookie也是一个挑战;我知道这是可能的,但还没有找到时间来实现它(我们有一个用例在工作)。无论如何,cookies也是很容易被利用的
可能您的最佳选择是将“站点A”上的链接点指向“站点A”上的资源,该资源将随机密钥/令牌和时间戳设置到共享数据库中,并使用该令牌将浏览器转发到“站点B”。“站点B”上的接收页面随后将验证GET字符串中是否存在密钥/令牌,检查数据库中是否存在该密钥/令牌,并可能匹配用户代理和Referer数据,并检查该时间是否在该密钥/令牌的时间戳条目后$smallnum秒内。我认为您正在寻找单点登录的变体。这是一种技术,其中一个站点中的身份验证在另一个站点中被透明地识别。以下是它在您的案例中的工作原理 通常,您在site2.com中会有如下链接:
$hash = hashFunction($pin . $sharedSecret);
然而,site1.com无法从推荐人那里分辨出它真正来自哪个网站,因为它可能是轻微的伪造。当然,如果您只需要一个简单的安全级别,那么这对于您的用例可能并不重要。但是如果你想要更好的东西,请继续读下去
您可以使用散列系统和共享秘密来创建只能来自一个源的内容。两个站点都有相同的共享机密,存储在一个文件中。我们称之为$sharedSecret
。算法如下所示:
$hash = hashFunction($pin . $sharedSecret);
然后,您可以在site2.com中执行此操作:
<a
href="http://site1.com/login.php?pin=<?php echo (int) $pin ?>&hash=<?php echo $hash ?>"
alt="Authenticated link"
>
然后在site1.com上,您应该计算两个哈希:
- 一个用于
楼层(时间()/500)*500
- 一个用于楼层(时间()/500)*500-500
我在这里没有提到具体的哈希函数。SHA256应该没问题,但请注意我不是密码学家。如果你想再次获得更高的安全性,可能需要进行检查,以确保有人没有通过猜测来强行进入系统——尽管在互联网上这几乎不值得他们尝试。我将发布这个答案,感谢其他SO用户的回答/评论。我认为这是一个非常简单的方法(在这种情况下,简单性是很好的),它应该可以工作,但当然,如果它有任何大的缺陷,我很高兴知道:) 正如我在OP中所说,安全性(就一些精明的用户绕过这个问题,直接使用链接而不是从网站2)在这里不是一个大问题,我们可以处理少量的例外情况 我的想法是:
- 为网站2中的用户提供指向同一域中某个函数的链接
- 该函数获取每个用户将拥有的PIN码(即1234567890)和当前时间戳(即1417812842),使用这两个值创建一个令牌,使用两个网站都知道的另一个函数(例如,某种形式的盐哈希)
- 生成从网站2到网站1的重定向,URL包括PIN和令牌,类似:
http://myURL.com/process_login_request.php?pin=123456789&token=abc123def456
中的一个函数,使用与在网站2中生成令牌相同的函数,将使用过去10秒的PIN和时间戳,在过去X秒(比方说10秒)生成大量令牌process\u login\u request.php
-