首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将URL引用程序(原点)限制为根URL或同一页面

问将URL引用程序(原点)限制为根URL或同一页面
EN

Stack Overflow用户
提问于 2019-08-02 06:22:46
回答 1查看 139关注 0票数 2

我正在为我的网站建立一个2FA系统。

  • 登录位于example.com的根目录上
  • 2FA脚本位于example.com/2FA/verify.php中。

verify.php是由同一页上的两个部分组成的,由一个IF IF语句隔开。

  • Part1:输入电子邮件并发送令牌。
  • Part2:单击“发送”后,相同的页面刷新,用户可以输入令牌并单击“验证”,然后重定向到授权的主页。

为了达到这个目的,我限制热链接和直接访问verify.php,我试图把它放在我的页面的顶部:

代码语言:javascript
复制
$ref1 = $_SERVER['HTTP_REFERER'];
$ref2 = $_SERVER['PHP_SELF'];

if($ref1 !== 'https://example.com/' || $ref1 !== $ref2) {
  header('Location: https://example.com');
  session_destroy();
}

对verify.php的直接访问很好,它被重定向到根。不幸的是,当用户输入电子邮件并单击“发送”时,我会得到相同的结果。part2 of verify.php应该出现,但会被重定向到根。

如何修改我的顶级php代码段,以便识别相同的页面原点并完成脚本?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-02 07:06:50

您可以做的是使用会话检查客户端是否首先访问了站点的另一个页面。

在允许访问的“启动index.php”页面上,可以放置以下内容:

代码语言:javascript
复制
<?php

session_start();

$_SESSION['verifyStatus'] = "AccessGranded";

然后,在verify.php页面上可以这样做:

代码语言:javascript
复制
<?php

session_start();

if (!isset($_SESSION['verifyStatus']) || 
    ($_SESSION['verifyStatus'] != "AccessGranded")) {
     header('Location: https://example.com');
     die;
}

不过,所有这些都是检查客户端是否在index.php页面之前访问了verify.php页面。它不检查它是否就在它之前。

为了确保index.php是上一页,我们需要对这个想法做一些扩展。我会用一个随机标记来做这个。在您使用的index.php中:

代码语言:javascript
复制
<?php

session_start();

$_SESSION['verifyToken'] = bin2hex(random_bytes(16));

在同一页面上,当链接到verify.php时,必须将此令牌作为参数提供。如下所示:

代码语言:javascript
复制
echo '<a href="verify.php?token='.$_SESSION['verifyToken'].'">Go to verify</a>';

然后我们客户端进入verify.php页面,您有两个版本的令牌,一个在$_SESSION['verifyToken']中,一个在$_GET['token']中。他们一定是一样的。因此,在verify.php中您可以这样做:

代码语言:javascript
复制
<?php

session_start();

if (!isset($_SESSION['verifyToken']) ||
    !isset($_GET['token']) ||   
    ($_SESSION['verifyToken'] != $_GET['token'])) {
     header('Location: https://example.com');
     die;
}

现在,它的工作,或多或少,按要求。然后,当您再次进入verify.php时,您必须再次在URL中使用令牌,就像我前面所显示的那样,以便verify.php再次接受重新加载。

在第二次访问verify.php时,您可以重置会话中的令牌:

代码语言:javascript
复制
<?php

session_start();

unset($_SESSION['verifyToken']);

这意味着客户端不能再次访问verify.php,除非使用index.php页面。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57320950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档