我有一个页面,我只想在有人点击表单上的“提交”时访问它为什么我在输入 URL 时可以访问该页面? 单一模板

问题描述

我在标记为“私人”的文件夹中有一个名为“booking.inc.PHP”的页面。这是我编写的 PHP 代码,用于防止有人通过输入 URL 来访问该页面,除非他们单击具有“提交”属性名称“书”的按钮...

<?PHP 

if (isset($_POST['book'])) {
echo "It works!"; 
}   
else {
header("location: ../index.PHP");
}

HTML 页面名为“booking.PHP”,不在 Private 文件夹中。

<!DOCTYPE html>
<html>
<head>
<?PHP require "header.PHP" ?>
<title>My Website</title>
</head>
<body>
<form action="private/booking.inc.PHP" method="post">
<input type="text">
<input type="text">
<button type="submit" name="book">Submit</button>
</form>
</body>
</html>

当我在表单中输入一些文本并单击“提交”时,我只看到一个白页,没有其他内容。没有回声声明说,“它有效!”此外,当我在浏览器中输入路径以访问 booking.inc.PHP 时,我也只会得到一个空白页面,而不是被定向到 index.PHP

我做错了什么?

解决方法

这就是你要找的吗?如果有人尝试直接访问“booking.inc.php”,代码会将他们重定向到另一个位置。使用“booking.inc.php”顶部的代码。

if(!isset($_SERVER['HTTP_REFERER'])){
// redirect them to another uri
header('location:../somefile.php');
exit;
}
,

“私人”目录

您创建的私有目录在任何情况下都不是私有的。它只是一个子目录。因此我建议不要选择这个名字。

单一模板

您拥有所有选项,但您可能会考虑根本不创建新文件。如果您选择这样做,您可以将操作发送到同一个文件并根据它是否是 GETPOST 请求相应地处理请求。这将在语义上处理预订模板。如果某些信息有误,它甚至可以让您重新呈现页面,并使用先前设置的值重新填充表单,以优雅地处理错误。

重定向

我不是 100% 在这件事上,但重定向可能没问题;只是它不适用于您的设置。据我所知,您在使用 localhost 时可能不会收到任何标头。

如果你在那里放一个 echo "You got blocked"; 而不是标题,它应该可以工作。还有其他重定向方式,但在专用 Web 服务器上应该没问题。

安全

如果您认为此检查会以某种方式保护您的表单提交,那您就错了。如果表单应该是安全的,则此检查是不够的。

由于文件的名称是 booking.inc.php 我认为它可能会处理一些导致销售的用户操作,因此应该受到保护!如果这就是您真正要问的问题,prevention section of the CSRF Wikipedia article 中列出了您应该寻找的技术。