Php 仅当请求来自其他特定网站时才允许登录网站

Php 仅当请求来自其他特定网站时才允许登录网站,php,login,referrer,Php,Login,Referrer,我有一个PHP/MySQL网站(网站1),它的登录系统只要求输入PIN码(只是一个长的数字字符串)。用户有两种使用此代码登录的方式: 转到website 1登录页面,并以典型的登录表单输入代码 在网站2中点击一个链接,该链接带有他的PIN码作为获取值。该链接具有相同的格式。它只调用一个函数,该函数接收PIN作为参数并处理登录网站2位于与网站1不同的域/服务器中 在这之前一切都很好 现在问题来了。我想知道,当使用上述第二种方法时,是否可以仅允许登录(假设PIN是正确的)只允许在特定网站中单击该链接

我有一个PHP/MySQL网站(网站1),它的登录系统只要求输入PIN码(只是一个长的数字字符串)。用户有两种使用此代码登录的方式:

  • 转到website 1登录页面,并以典型的登录表单输入代码
  • 在网站2中点击一个链接,该链接带有他的PIN码作为获取值。该链接具有相同的格式。它只调用一个函数,该函数接收PIN作为参数并处理登录网站2位于与网站1不同的域/服务器中
  • 在这之前一切都很好

    现在问题来了。我想知道,当使用上述第二种方法时,是否可以仅允许登录(假设PIN是正确的)只允许在特定网站中单击该链接

    按照现在的工作方式,任何有链接的人都可以使用它登录到网站1。我想防止这种情况,我想让这种情况发生,如果该链接已被点击赢网站2

    其想法是在登录功能中“检测”引用的网站,并且仅当它与网站2的URL(或任何其他唯一标识符)匹配时才允许它

    如果使用“普通”链接不允许这样做,那也不会是一个问题,我可以灵活地选择我可以使用的方式,但最终它需要的是一些只意味着用户在网站2中点击的东西

    编辑


    我认为添加这一点很好,因为一些评论/回复谈到了这样做的安全性(当然这很好)。这样做的主要原因是“强迫”用户在访问网站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 ?>&amp;hash=<?php echo $hash ?>"
        alt="Authenticated link"
    >
    
    然后在site1.com上,您应该计算两个哈希:

    • 一个用于
      楼层(时间()/500)*500
    • 一个用于楼层(时间()/500)*500-500
    如果提供的哈希匹配,则允许链接解锁内容。这就解释了时间在一台服务器和下一台服务器之间超过+/-500边界的可能性


    我在这里没有提到具体的哈希函数。SHA256应该没问题,但请注意我不是密码学家。如果你想再次获得更高的安全性,可能需要进行检查,以确保有人没有通过猜测来强行进入系统——尽管在互联网上这几乎不值得他们尝试。

    我将发布这个答案,感谢其他SO用户的回答/评论。我认为这是一个非常简单的方法(在这种情况下,简单性是很好的),它应该可以工作,但当然,如果它有任何大的缺陷,我很高兴知道:)

    正如我在OP中所说,安全性(就一些精明的用户绕过这个问题,直接使用链接而不是从网站2)在这里不是一个大问题,我们可以处理少量的例外情况

    我的想法是: