我正在为我的网站建立一个2FA系统。
verify.php是由同一页上的两个部分组成的,由一个IF IF语句隔开。
为了达到这个目的,我限制热链接和直接访问verify.php,我试图把它放在我的页面的顶部:
$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代码段,以便识别相同的页面原点并完成脚本?
发布于 2019-08-02 07:06:50
您可以做的是使用会话检查客户端是否首先访问了站点的另一个页面。
在允许访问的“启动index.php”页面上,可以放置以下内容:
<?php
session_start();
$_SESSION['verifyStatus'] = "AccessGranded";然后,在verify.php页面上可以这样做:
<?php
session_start();
if (!isset($_SESSION['verifyStatus']) ||
($_SESSION['verifyStatus'] != "AccessGranded")) {
header('Location: https://example.com');
die;
}不过,所有这些都是检查客户端是否在index.php页面之前访问了verify.php页面。它不检查它是否就在它之前。
为了确保index.php是上一页,我们需要对这个想法做一些扩展。我会用一个随机标记来做这个。在您使用的index.php中:
<?php
session_start();
$_SESSION['verifyToken'] = bin2hex(random_bytes(16));在同一页面上,当链接到verify.php时,必须将此令牌作为参数提供。如下所示:
echo '<a href="verify.php?token='.$_SESSION['verifyToken'].'">Go to verify</a>';然后我们客户端进入verify.php页面,您有两个版本的令牌,一个在$_SESSION['verifyToken']中,一个在$_GET['token']中。他们一定是一样的。因此,在verify.php中您可以这样做:
<?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时,您可以重置会话中的令牌:
<?php
session_start();
unset($_SESSION['verifyToken']);这意味着客户端不能再次访问verify.php,除非使用index.php页面。
https://stackoverflow.com/questions/57320950
复制相似问题