我想知道,我在根目录之外的另一个目录中保存了一些文件,我正试图使用HTML表单将信息发布到位于根目录之外的php文件中
这可能吗?如果是,如何?
制作一个代理脚本。。。是网络目录中的,但它所做的只是包括适当的"受保护"文件:
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文件。如果使用Ajax发布表单,请不要调用隐藏字段action
,因为这可能会导致冲突。此外,我已经将.htaccess
文件设置为删除php扩展名,因此您可能需要在HTML代码中将.php
添加到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访问
如果"outside of Root"目录意味着在DocumentRoot之外,这是不可能的。
您可以在DocumentRoot中有一个基本的控制器,它包括或调度操作。