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