2012-07-09 34 views

回答

4

做一个代理脚本...这东西是 web目录里面,但它是所有包含适当的 “保护” 文件:

DOCROOT/form_handler.php

<?php 
include "../secret/form_handler.php"; 

DOCROOT/form.html

... 
<form action="form_handler.php"> 
... 

事实上,这是设置了多少个网站(本质上至少)。在这种罕见的情况下,将Apache的大部分脚本放在DOCROOT之外是很常见的情况,即在Apache或类似文件不解析PHP的情况下(即,如果配置错误),它不会无意中发送源代码。

+0

我该如何使用HTML表单发布到那个呢? – Kalcoder 2012-07-09 07:37:46

+0

@Kalcoder:您需要创建一个可从'public_html'目录中看到的文件,然后将表单发布到该目录。要让文件在webroot之外执行的唯一方法是将其包含在webroot中的文件中。 - 或者可能有一些花哨的网络服务器配置。 – Leigh 2012-07-09 07:41:11

+0

好点@Leigh,这*是可能的mod_rewrite(替换可以是文件系统路径)。如果你有兴趣,你应该提交作为答案:-) – 2012-07-09 07:51:00

1

是的,它是可行的。该目录应作为单独的网站托管,然后您可以提供该文件的绝对URL作为表单动作

+0

那种似乎是矫枉过正.. – 2012-07-09 07:10:08

+0

这不是他要求的。另外“是的,这是可能的”是最糟糕的答案。 – Leigh 2012-07-09 07:10:24

+0

问题不包括“是否有可能?” – Rodrigo 2015-10-21 18:45:43

0

该文件必须可从网上访问。
如果“根之外”目录意味着DocumentRoot之外,这是不可能的。

您可以在DocumentRoot中包含或派发该操作的基本Controller。

+0

如果它在文档根目录下,但不在public_html中,该怎么办? – Kalcoder 2012-07-09 07:14:04

+0

该文件必须从网络上调用,所以如果你可以调用它,就像f.e. /onedirunderdocumentroot/form.php你可以使用它。通常public_html是document_root,因此可以访问它下面的所有内容。 – ivoba 2012-07-09 07:22:17

1

在我的网站上,各种形式的我开始使用此代码:

<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,以确保黑客无法穿越到不同的目录。

相关问题