我有一个包含以下代码的表单:
<form action="/directory/" method="POST" target="_blank">
<input name="hello" type="hidden" value="something"/>
<input name="there" type="hidden" value="something"/>
在/directory/
文件夹中,我放置了一个index.php
文件来处理表单,具有以下代码:
<?php
if(isset($_POST['hello']));
switch ($_POST['hello']) {
case "1":
$var1 = "word1";
break;
case "2":
$var1 = "word2";
break;
default:
$var1 = "other";
}
?>
<?php
if(isset($_POST['there']));
switch ($_POST['there']) {
case "1":
$var2 = "word3";
break;
case "2":
$var2 = "word4";
break;
default:
$var2 = "other";
}
?>
<!doctype html>
<html>
<head>
<title>test</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<div>
Content, <?php echo $var1; ?>, Content, <?php echo $var2; ?>, Content.
</div>
</body>
</html>
但是我不希望好奇的用户能够直接进入mydomain.com/directory/
并查看index.php
的输出,除非他通过表单到达那里。
那么,我如何隐藏/使index.php
无法访问,或者更改.php中的某些内容,同时或多或少地保持action="/directory/"
标签相同?
最佳做法是什么?
但我不希望好奇的用户能够直接进入 mydomain.com/directory/并查看 index.php 的输出,除非他通过表单到达那里。
我不认为你了解HTTP请求是如何工作的。 当用户提交表单时,他们不一定通过表单到达那里。 他们只是向特定资源提交 POST 请求(在本例中为 /directory/index.php
)。 为了使该资源接受来自用户的 POST 请求,他们需要能够访问它。
表单所做的只是为用户提供有关该资源在 POST 请求中期望的内容的信息,例如它要查找的值。 但是这样的请求也可以手动提出,服务器不知道区别。 如果需要,可以将对该资源的访问限制为仅 POST 请求。 实现此目的的一种方法可能是让页面检查$_POST[]
是否存在,并确保它具有预期的值(您已经这样做了)。
如果要确保用户必须首先请求表单,然后才执行 POST 请求,则可能需要以某种方式跟踪该状态。 一种方法是提供唯一的令牌作为表单的一部分。 隐藏窗体字段中的 GUID 非常适合此目的。 显示表单时,您将在数据库中跟踪生成的令牌(甚至可以为其分配时间戳,以便它可以过期)。 然后在 POST 处理程序页面中,将提交的令牌与数据库中的已知令牌进行比较,如果不匹配,则显示错误。 这将允许您拒绝不包含已知令牌的 POST 请求,要求用户在执行 POST 之前首先请求表单。
<小时 />为了响应下面的评论,如果页面的某些前提条件失败,您可以返回错误而不是显示内容。 这可以像以下简单这样简单:
<?php
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
?>
<p>This is an error message.</p>
<?php
} else {
?>
<p>This is the normal page content.</p>
<?php
}
?>
有很多不同的方法来组织它。 也许结束响应而不是将其余部分放在else
块中? 我的PHP有点生疏,但你应该能够弄清楚一些事情。 您甚至可以只返回HTTP错误代码并让用户弄清楚:
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
header('HTTP/1.1 500 Internal Server Error');
} else {
?>
<p>This is the normal page content.</p>
<?php
}
?>
为此,有很多HTTP错误代码可供选择。 最终,逻辑和布局是你想要的。 您可以控制向用户显示的内容以及显示该内容的逻辑条件。
您应该查看htaccess限制,请访问此链接:
http://www.javascriptkit.com/howto/htaccess.shtml