Php 如何使用.htaccess保护服务器目录

Php 如何使用.htaccess保护服务器目录,php,.htaccess,directory,Php,.htaccess,Directory,我设计了一个网站,其中有一系列与我的系统交互的PHP脚本。例如,如果用户上载图像,则脚本将对此进行处理 image.php 如果用户登录,脚本将对此进行处理 login.php 所有这些脚本都存储在名为:scripts的文件夹中 如何确保有人无法访问这些页面,但仍能确保系统可以使用这些页面?我想确保PHP页面将接受post值、get值并可以重定向到其他页面,但不能通过地址栏直接访问或下载 我试图使用.htaccess阻止访问,使用deny from all和Limit GET,POST但这

我设计了一个网站,其中有一系列与我的系统交互的PHP脚本。例如,如果用户上载图像,则脚本将对此进行处理

image.php 
如果用户登录,脚本将对此进行处理

login.php
所有这些脚本都存储在名为:scripts的文件夹中

如何确保有人无法访问这些页面,但仍能确保系统可以使用这些页面?我想确保PHP页面将接受post值、get值并可以重定向到其他页面,但不能通过地址栏直接访问或下载


我试图使用.htaccess阻止访问,使用
deny from all
Limit GET,POST
但这阻止了系统工作,因为我根本无法访问这些文件。

您可以在.htaccess上设置“从所有人拒绝”并从一些可访问的目录中包含这些文件

您不能真正阻止对这些文件的直接请求,但仍然可以让其他请求访问这些文件。您所能做的最好的事情就是屏蔽它们的位置,并控制访问它们的方式

一种方法是创建一个PHP“switch”脚本,它将为您包含这些脚本,而不是让Apache直接请求它们

例如,如果使用
脚本/image.php
规则目标
switch.php?file=image.php
,则类似于:

RewriteRule ([^\.]+\.(jpe?g|png|gif)$ switch.php?file=image.php&rw=1&meta=$1 [L,QSA]
您可以将
deny from all
添加到
scripts/.htaccess
文件中,并在
switch.php
文件中执行此操作

<?php
/** File: switch.php **/
$allowed_files = array(
    'login.php',
    'image.php'
);
$script_dir = 'scripts/';
if(isset($_POST['rw']) && in_array($_REQUEST['file'], $allowed_files)) {
    include $script_dir . $allowed_files[$_REQUEST['file']];
}
else {
    header('HTTP/1.1 404 File Not Found');
    include 'error404.html'; // Or something to that effect.
}
?>

$\u POST['rw']
有一个弱检查,以查看规则是否来自重写规则,这意味着阻止对文件的直接请求。如果你知道它存在的话,很容易绕过它,但对机器人之类的随机请求很有效


这样,对
scripts/image.php
switch.php?file=image.php
的直接请求将失败,但对任何图像文件的请求都会触发
scripts/image.php
脚本。

使用htaccess阻止文件会使请求者(例如页面的访问者)无法访问文件。因此,您需要一个代理文件来将访问者的请求传递给这些文件。为此,请查看和

基本上,您要做的是将所有请求路由到单个入口点,例如index.php,并从那里决定调用哪个操作(脚本)来处理请求。然后,您可以将脚本和模板放置在可公开访问的文件夹之外,或者,如果这不可能(在某些共享主机上),则使用htaccess保护文件夹,就像您之前所做的那样(拒绝所有人)

要使用上传脚本,您需要一个类似
http://example.com/index.php?action=upload

超级简单的FrontController与

然后,您的actionScript将执行您需要对请求执行的所有操作,包括重定向、db访问、身份验证、上传内容、呈现模板等—您认为必要的任何操作。上面示例中的默认操作可能如下所示:

<?php // action404.php
    header('HTTP/1.1 404 File Not Found');
    fpassthru('path/to/template/directory/error404.html');

我想确保PHP页面将接受post值、get值并可以重定向到其他页面,但不能通过地址栏直接访问或下载?

只要将Apache配置为将所有.php文件与php应用程序关联,就没有人可以下载php内容本身。因此,如果有人浏览“mysite.com/image.php”,php将运行。用户将看不到您的PHP内容

这应该已经在httpd.conf文件中完成,如下所示:

  • AddType应用程序/x-httpd-php.php.phtml

现在,image.php需要某些post参数。除了实现上面Atli建议的MVC架构之外,如果没有提供任何缺少的参数,您可以优雅而安全地处理它们。然后,用户可以直接访问页面,但不需要对其进行任何操作。

许多应用程序只是将脚本之类的文件放在公用文件夹(如/public\u html/或/www/)中,而不是与公用文件夹放在同一根文件夹中

所以不是 root/public\u html/and root/public\u html/scripts/

但是 root/public\u html/and 根/脚本/


访问者无法访问公用文件夹上方文件夹中的任何内容,但通过在例如/public_html/index.php中指定文件“../scripts/yourscript.php”,php可以访问这些文件,访问者则无法访问。(文件夹../表示“在文件夹层次结构中向上移动一步”)

您所说的“已处理”是什么意思?这些文件是包含在内的还是HTML表单的目标?在后一种情况下,您无法执行任何操作(除了可能检查空的
$\u POST
变量)。
<?php // action404.php
    header('HTTP/1.1 404 File Not Found');
    fpassthru('path/to/template/directory/error404.html');