在根目录之外使用php文件的HTML表单操作


HTML form action using a php file outside of root directory?

我想知道,我在根目录之外的另一个目录中保存了一些文件,我正试图使用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中有一个基本的控制器,它包括或调度操作。