隐藏表单处理文件(不直接访问)的最佳做法是什么


What's the best practice to hide a form-processing file, from direct access?

我有一个包含以下代码的表单:

<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