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

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(使用前将#替换为@)

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

  • gmail 不断阻止 PHPmailer 登录

    我将在接下来的 8 小时内部署一个网站 而 Gmail 刚刚停止接受 PHPmailer 登录我的帐户 起初 它在测试过程中工作了几个小时 然后 它就停止工作了 我已经允许所有允许不太安全的应用程序从 gmail 登录 但它仍然不允许 ph
  • PHP MySQL 使用选项/选择 HTML 表单标签进行多重搜索查询

    我正在尝试使用两个搜索字段设置基本的 MySQL LIKE 搜索 我不想拥有它 所以它有多个可选搜索字段 例如if isset POST city isset POST name 我不知道如何用 HTML 来做到这一点
  • FPDI/FPDF:水印和打印多页

    我修改了这个堆栈问题 当用户尝试下载文件时在 pdf 文件上应用水印 https stackoverflow com questions 3983432 applying watermarks on pdf files when users
  • 如何在响应ajax codeigniter后停止执行其他控制器

    我想知道如何在响应输出 json 数据后停止执行函数和涉及的其他控制器 就我这里的情况而言 我只是打电话test 函数于dashboard控制器 In dashboard构造函数将执行MY Login library In MY Login
  • Woocommerce 让产品显示在存档页面中

    我正在尝试让所有产品显示在我商店的存档页面中 我想知道他们的id我正在使用我的一个钩子 它在 wp head 上运行并检查 if is product category 我想以某种方式访问 产品的查询并获取它们的 ID if is prod
  • 如何使用 php 发送服务器错误响应?

    一旦用户点击删除按钮我的 jQuery 脚本要求服务器删除所选项目 现在我想要我的php发送成功或错误响应的脚本 是否有可能触发错误回调万一该项目无法删除 Thanks 我的 jQuery 代码 ajax type post url myA
  • 使用 Google Storage Transfer API 将数据从外部 GCS 传输到我的 GCS

    我正在开发一个由 ReactJs 前端和 Java SpringBoot 后端组成的 Web 应用程序 该应用程序要求用户将数据从他们自己的 Google Cloud 存储上传到我的 Google Cloud 存储 申请流程如下 前端请求用
  • posts_search 中的自定义查询

    如何使用此查询作为我的自定义搜索查询 add filter posts search my search is perfect 20 2 function my search is perfect search wp query sWord
  • 蛋糕控制台 2.2.1:烘焙错误

    运行 MAMP 的 OSX 机器 CakePHP 2 2 1 已正确安装和配置 这意味着当我浏览到 Index php 文件时 所有绿色条都显示出来 我已经完成了博客教程 并且正在开发我的第二个应用程序 其中脚手架已启动并运行 现在我第一次
  • “使用未定义常量”注意,但该常量应该被定义

    共有三个文件 common php controller php 和 user php 文件 common php 如下所示 文件controller php看起来像 文件 user php 如下所示 执行脚本时 会给出通知 注意 使用未定
  • 随机组合 MySQL 数据库中的两个单词

    我有一个包含名词和形容词的数据库 例如 id type word 1 noun apple 2 noun ball 3 adj clammy 4 noun keyboard 5 adj bloody ect 我想创建一个查询 它将抓取 10
  • PHP 与 MySQL 查询性能( if 、 函数 )

    我只看到这个artice http www onextrapixel com 2010 06 23 mysql has functions part 5 php vs mysql performance 我需要知道在这种情况下什么是最好的表
  • 使用 Ajax.Request 将 JSON 从浏览器传递到 PHP 的最佳方法

    您好 我有一个 JSON 对象 它是一个二维数组 我需要使用 Ajax Request 将其传递给 PHP 我知道的唯一方法 现在我使用js函数手动序列化我的数组 并获取以下格式的数据 s 1 d 3 4等 我的问题是 有没有办法更直接 有
  • CURL 中的 data-urlencode 是什么意思?

    我搜索了很多个小时试图弄清楚 php curl 中的 data urlencode 是什么 我尝试过这个 但我认为这是不对的 xmlpost object1 file https www lob com goblue pdf 在文档中是 d
  • Coldfusion 跨站点身份验证

    好的 在我正在开发的 Coldfusion 网站上 我刚刚安装了一个名为 Galleon 的第三方 开源 CF 论坛 我不久前问过类似的问题 但现在我们已经取得了一些进展 目前的问题是 它不会识别父站点本身存在的任何变量 会话等 论坛本身存
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • 一次播种多行 laravel 5

    我目前正在尝试为我的用户表播种 如果我像这样尝试 2 行 就会失败 如果我只使用单个数组而不是 users 数组内的 2 个数组来创建一些假数据 那么效果很好 我做错了什么 正确的方法是什么 class UserTableSeeder ex
  • 如何在 Laravel 中使用 PUT http 动词提交表单

    我知道这个问题可能已经提出 但我就是无法让它发挥作用 如果有人可以帮助我 我将非常感激 我安装了 colletive form 但答案也可以是 html 表单标签 现在列出我的表格 我的路线和我的例外情况 Form model array
  • ini_set 'session.gc_maxlifetime' 为 1 天

    If I do ini set session gc maxlifetime 86400 这是否意味着用户可以将浏览器留在同一页面 非活动状态 最多 1 天 而不必担心会话被垃圾收集并被注销 如果服务器配置不支持此功能会发生什么 它会给我一
  • 如何使用 PHPExcel 库从 Excel 获取日期

    我正在尝试使用 PHPExcel 从 Excel 获取日期 但我没有得到日期 我得到的字符串值不是 1970 以来的秒数 我尝试过的代码是 InvDate trim excel gt getActiveSheet gt getCell B

随机推荐

  • 尝试让 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