仅当请求来自另一个特定网站时才允许登录网站

2023-12-11

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

  1. 转到网站 1 登录页面并在典型的登录表单中输入代码
  2. 单击网站 2 中的链接,该链接带有 PIN 码作为 GET 值。该链接的格式为http://myURL.com/login.php?pin=123456789。这只是调用一个函数,该函数接收 PIN 作为参数并处理登录。网站 2 与网站 1 位于不同的域/服务器中.

直到这里一切正常。

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

按照现在的工作方式,任何知道该链接的人都可以使用它登录网站 1。我想防止这种情况发生,如果在网站 2 中单击该链接,我希望允许这种情况发生。

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

如果使用“普通”链接不允许这样做,那不会是问题,我可以灵活地选择使用什么方式来实现此目的,但最终它需要是仅意味着单击的东西网站 2 中的用户。

EDIT

我认为添加此内容很好,因为一些评论/回复讨论了这样做的安全性(这当然很棒)。这样做的主要原因是“强制”用户在访问网站 1 之前先访问网站 2。基本上,这样他们就无法在浏览器中输入该 URL 并登录网站 1,我只想能够使用该 URL如果他们从网站 2 单击它,则链接。我解释这一点是因为安全性在这里并不是一个重要因素,如果一些精明的用户可以绕过我实现的任何方法,那么这没什么大不了的,更重要的是该方法很简单尽可能在网站 2 中实施(因为我不运行该网站,我需要要求那里的人做任何需要做的事情)。


我认为您正在寻找单点登录的变体。这是一种技术,其中一个站点中的身份验证可以在另一个站点中透明地识别。以下是它在您的情况下的工作原理。

通常,您在 site2.com 中会有一个如下所示的链接:

http://site1.com/login.php?pin=123456789

然而,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 看到它时,它可以立即获取 PIN,重复该算法,并检查哈希是否确实来自 site2.com。如果您有多个引用站点,则 site1.com 应为所有站点存储一个单独的密钥,然后它可以安全地检查引用站点以查看应加载哪个站点。

共享秘密应该足够大,以至于无法被猜到;我倾向于使用 40-60 个字符左右。

然而,该计划中剩下的缺陷是,有人可以访问 site2.com 并窃取他们的链接,而且只要他们每次想要访问时都愿意伪造引荐来源网址,该计划仍然有效。因此,在算法中添加时间戳也可能很有用:

// The time is rounded to the nearest 500 seconds, to account for
// out of sync clocks. Adjust this depending on how long you want links to
// remain active for
$time = floor(time() / 500) * 500;
$hash = hashFunction($pin . $sharedSecret . $time);

然后在 site1.com 上您应该计算两个哈希值:

  • One for floor(time() / 500) * 500
  • One for floor(time() / 500) * 500 - 500

如果提供的哈希值与其中任何一个匹配,则允许该链接解锁内容。这说明了一台服务器与另一台服务器之间的时间可能超过 +/-500 边界的可能性。

我在这里没有提到特定的哈希函数。 SHA256 应该没问题,但请注意我不是密码学家。如果您再次想要更高的安全性,可能值得检查以确保有人不会通过猜测淹没您的系统来暴力破解系统 - 尽管在互联网上这几乎不值得他们尝试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仅当请求来自另一个特定网站时才允许登录网站 的相关文章

随机推荐

  • 尝试让 Pyramid 在 Apache + mod_wsgi 下运行,但失败

    我已经安装了 mod wsgi 并运行 Apache2 我已经确认 mod wsgi 实际上可以通过以下方式工作this 当我尝试运行 Pyramid 时 问题就出现了 我收到内部服务器错误 并且我的 Apache 错误日志包含异常 Ass
  • Android 中的 https 请求、身份验证

    我目前正在尝试通过 http Get 调用对服务器进行身份验证 下面提供的代码在 java 项目中编译时可以工作 将正确的令牌返回给程序 但是 每当我尝试在 Android 中实现相同的代码时 我都不会通过 Get 调用返回令牌 在 And
  • 旋转位图图像

    我想旋转位图图像我写了一些代码并且它可以工作 TransformedBitmap TempImage new TransformedBitmap TempImage BeginInit TempImage Source MyImageSou
  • 在 MVC 创建视图上保存多对多关系数据

    我在保存创建视图的结果时遇到多对多关系的一些问题 我想为新用户配置文件创建一个创建页面 其中包含一个清单 让他们选择课程 多对多关系 我的观点取自记录Courses数据库并用复选框显示它们 一旦用户发布数据 我想更新我的userprofil
  • IIS7 ISAPI 过滤器模块和 HttpModule 事件 - 它们如何排列?

    因此 集成管道模式下的 IIS7 使用 IsapiFilterModule 来填充 ISAPI 过滤器 DLL 并在过滤器上触发正确的 事件 这与经典模式下的 IIS 或 IIS7 的早期版本有很大不同 因为这意味着 HttpModule
  • H2数据库Json字段Hibernate转换器异常

    我只是尝试在 h2 中插入一个 json 值 然后我想用 hibernate 转换器返回这个 json 值作为对象 但错误如下所示 我的插入查询是 INSERT INTO log id activities date VALUES 1 ac
  • SQL:如何对存储过程结果集进行谓词?

    我无法弄清楚的简单问题 不是 SQL 专家 抱歉 我想对 sp who2 的结果集进行选择 我怎么能够 对于前 从 sp who2 的结果集 选择 SPID 使用这样的环回查询 SELECT SPID Status Login HostNa
  • PostgreSQL - 将字符串转换为 ASCII 整数

    如何在 PostgreSQL 中获取字符串的 ASCII 值作为 int 例如 字符串S06 6X9A 目前 我正在使用 ASCII 函数 但它仅返回给定字符串的第一个字符 Use string to array S06 6X9A null
  • 跨类加载器投射?

    我怎样才能做到这一点 class Foo public static Foo get throws Exception ClassLoader cl new URLClassLoader new URL foo jar null Foo c
  • 读取特定文件夹下的所有txt文件,并将所有内容写入一个txt文件中

    我尝试阅读全部 txt文件夹中的文件并将每个文件中的所有内容写入另一个 txt 文件 但不知何故它只将一行写入txt 文件 我尝试过fwrite and file put contents 都不起作用 这是我的代码
  • 导入/导出 DataFusion 管道

    有谁知道是否可以以编程方式导入 导出 DataFlow 管道 已部署或处于草稿状态 我们的想法是编写一个脚本来删除并创建一个 DataFusion 实例 以避免在不使用时计费 通过 gloud 命令行 可以配置 DataFusion 集群并
  • 通过xml更改Android ActionBar中的标题文本颜色

    我想更改应用程序中 ActionBar 的标题文本颜色 我尝试了很多方法但我无法实现 我不想以编程方式执行此操作 因为当应用程序启动时 它会显示具有先前颜色的操作栏 然后更改为新颜色 我支持 Api Level 8 我的 xml 是用And
  • 重写对集合的访问以避免“双重”查找

    我有这样的代码 std unordered map
  • 粘贴的形状不被视为“最新”形状

    我正在从 Excel 电子表格自动生成 PowerPoint 报告 在粘贴表格之前 我已经完成了该过程 我使用以下方法将表格粘贴到 PowerPoint 中PPApp CommandBars ExecuteMso PasteSourceFo
  • Fresco图片加载回调

    我刚刚迁移到Fresco用于在我的应用程序中加载图像的库 我需要听图像加载事件 当然我在文档中阅读了这篇文章监听下载事件 这正是我所需要的 但是 有几件事是我不喜欢的 我的目标是隐藏View如果从网上下载失败 我无法参考SimpleDraw
  • 是否可以通过 .net 应用程序以编程方式关闭“远程 PC”? [复制]

    这个问题在这里已经有答案了 我想知道 是否可以通过 net 应用程序以编程方式关闭远程 PC 如果是的话 怎么可能呢 See 此知识库文章 例如 System Diagnostics Process proc new System Diag
  • Flask 网站 -- 500 内部服务器错误

    我一生都无法弄清楚为什么我试图启动的这个烧瓶应用程序不起作用 我在 5 美元的 Digital Ocean Droplet 上运行它 这是 希望 您需要了解的所有信息 目录布局 包含在 var www FlaskApp FlaskApp i
  • 在悬停事件上设置 CSS 渐变背景动画

    我有一些菜单项 它们在悬停时使用背景渐变进行样式设置 使用以下样式 sidebar ul li a hover background image linear gradient bottom rgb 68 68 68 5 rgb 51 51
  • 外线 Seaborn 小提琴图/箱线图

    I am using the violinplot function from the Seaborn library Sometimes the outer lines are visualized and sometimes they
  • 仅当请求来自另一个特定网站时才允许登录网站

    我有一个 PHP MySQL 网站 网站 1 它的登录系统只要求输入 PIN 码 只是一个长数字字符串 用户有两种方式使用此代码登录 转到网站 1 登录页面并在典型的登录表单中输入代码 单击网站 2 中的链接 该链接带有 PIN 码作为 G