我想知道,有一些文件我保存在根目录之外的不同目录中,我正在尝试使用 HTML 表单将信息发布到位于根目录之外的 php 文件
那可能吗?如果是这样,怎么做?
制作一个代理脚本......它位于web 目录中,但它所做的只是包含适当的“受保护”文件:
DOCROOT/form_handler.php
<?php
include "../secret/form_handler.php";
DOCROOT/form.html
...
<form action="form_handler.php">
...
实际上,这就是设置了多少个站点(至少本质上是这样)。像这样将大部分脚本放在 DOCROOT 之外是很典型的,因为在 Apache 或类似软件不解析您的 PHP(即,如果配置错误)的罕见情况下,它不会无意中发送您的源代码。
在我的网站上,每个表单都以以下代码开头:
<form action="action" method="post">
<input type="hidden" name="i-action" value="do-whatever" />
这避免了对多个代理脚本的需要,因为action.php
将使用隐藏字段的值来确定应该调用哪个 php 文件。action
如果您使用 Ajax 发布表单,请不要调用隐藏字段,因为它可能会导致冲突。此外,我已将.htaccess
文件设置为删除 php 扩展名,因此您可能需要在 HTML 代码中添加.php
to action
。
这里是action.php
:
if (!empty($_POST['i-action']))
{
$action = str_replace('.', '', $_POST['i-action']);
$action = str_replace('/', '', $action);
if (file_exists("../secret/directory/structure/$action".'.php'))
require_once("../secret/directory/structure/$action".'.php');
}
我曾经str_replace
确保黑客不能遍历到不同的目录。
是的,这是可能的。该目录应作为单独的站点托管,然后您可以将文件的绝对 URL 作为表单操作提供
该文件必须可从 Web 访问。
如果“root 之外”目录意味着 DocumentRoot 之外,这是不可能的。
您可以在 DocumentRoot 中有一个基本控制器,其中包含或调度操作。