我想知道,我在一个不同的目录中保存了根目录之外的一些文件,我试图使用HTML表单将信息发布到位于根目录外的php文件
这可能吗?如果是这样,怎么样?
答案 0 :(得分:6)
创建一个代理脚本......在web目录中 的东西,但它只是包含相应的“受保护”文件:
DOCROOT / form_handler.php
<?php
include "../secret/form_handler.php";
DOCROOT / form.html
...
<form action="form_handler.php">
...
实际上,这是设置了多少站点(至少在本质上)。通常将大多数脚本放在DOCROOT之外,因为在极少数情况下,Apache或类似程序不会解析您的PHP(即,如果配置错误),它不会无意中发送您的源代码。
答案 1 :(得分:2)
在我的网站上,我从这段代码开始的每一个表单:
<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
来确保黑客无法遍历不同的目录。
答案 2 :(得分:1)
是的,它是可行的。该目录应作为单独的站点托管,然后您可以将该文件的绝对URL作为表单操作
答案 3 :(得分:0)
该文件必须可从网上访问 如果“Root之外”目录意味着在DocumentRoot之外,那么这是不可能的。
你可以在DocumentRoot中拥有一个基本的Controller,它包含或调度动作。