3

首先,我很确定 Stack Overflow 上也会有类似的问题,但我并没有真正找到它。可能是因为我使用了错误的关键字。所以不要因此而开枪打我。

我的问题基本上是,我想包含 php 文件,但我只希望它们被包含,而不是让人们用他们的浏览器打开。他们应该得到一个错误。

例如,我有一个包含 php 文件的包含目录,其中包含我与数据库的连接(密码等。危险?)。我希望能够包含它,但我不希望人们直接访问该页面。

使用 htaccess 在包含目录上设置密码可以解决我的问题吗?首先我认为它不会,因为可以为无权访问它的用户包含页面会很奇怪。但这似乎有效,这是怎么来的?还有其他更好的选择吗?Web开发人员通常做什么?

我也可以为 javascript 文件做类似的事情吗?我的猜测是不会是这种情况,但我只是在问。js 文件包含对某些页面的 ajax 调用,但我想如果我能保护 php 页面不被访问,我会很高兴。

无论如何提前谢谢:)

4

5 回答 5

9

我认为解释这些部分如何协同工作将有助于消除混乱。

一个请求进来(来自用户的网络浏览器)。您的 Web 服务器(在本例中为 Apache)接收此信息。首先,它检查<Location>权限。然后它查看配置的其余部分,并最终将请求 URI 映射到文件系统。现在,最后,它可以检查<Directory>权限以及.htaccess.

如果这些权限检查中的任何一个失败(例如,deny from all),Apache 将停止处理请求,并返回一个错误(或在 HTTP 基本身份验证的情况下请求用户名和密码)。

一旦所有权限检查通过,Apache 就会查看该文件,并注意到它是一个.php文件。在您(或您的网络主机)的 Apache 配置中,有一个AddHandler指令告诉 Apache 将此请求传递给 PHP 引擎(可以是 mod_php,或通过快速 cgi)。(对于大多数文件,它会将文件的内容发送到浏览器。但脚本文件是特殊的,因此AddHandler。)

现在,PHP 读取您的脚本文件。然后它还直接读取您的包含文件。这不会通过 Apache 返回,因此.htaccess不适用。这也意味着您的 PHP 包含不需要在您的文档根目录中。它们可以是 PHP 进程可以访问的任何地方(基于 UNIX 权限和 PHP 配置)。在 php.ini 中设置 include_dir 可以很容易地将它们放在任何地方。

客户端 JavaScript 由用户的浏览器运行。它不是在服务器端解释的(就像 PHP 一样)。所以用户必须能够访问它,就像用户必须能够访问您的 .html 文件一样。

所以,简而言之:

  • 您可以在 PHP 包含目录中放置一个.htaccesswith Deny from all。PHP 的include指令不通过 Apache,所以它不会在意。理想情况下,您甚至根本不将 PHP 包含目录放在文档根目录下。
  • 您不能对 JavaScript 执行此操作,因为 JavaScript 访问通过 Apache(就像 .html、.png 等访问一样)。
于 2012-06-06T23:06:53.253 回答
3

理想情况下,您的 PHP 包含应位于 Web 无法直接访问的文件夹中。

例如:假设您的网站位于 中/var/www/htdocs/,那么您将放入index.php其中,但包含应位于 Web 可访问区域之外的单独文件夹中。在此示例中,您可以在旁边有一个htdocs名为的文件夹/var/www/includes/,PHP 包含将在其中存在。

通过这种方式,他们可以完全免受不需要的直接 Web 访问。

此外,您应该编写 PHP 代码,使包含文件仅包含类或函数。这意味着如果从网络以某种方式访问​​它,什么都不会发生:PHP 将加载所有函数,但不会运行其中任何一个,因此用户只会看到一个空白页面。

如果另一个页面想要包含该文件,则需要包含,然后还调用其中的函数;你不应该有一个立即运行代码的包含。

您应该只编写在旨在供用户直接访问的页面上立即运行的 PHP 代码,例如index.php.

希望有帮助。

于 2012-06-06T23:06:37.667 回答
2

您确实可以选择不使用 .htaccess 来执行此操作(并不是说这是一个更好的解决方案,只是一个不同的解决方案)。

在您希望用户直接访问的文件中,将以下内容放在任何包含之前:

@define('IN_APPLICATION', true);
require 'file.class.php'; //sample include

然后在包含(类文件)中,将以下代码放在顶部:

if (!defined('IN_APPLICATION')){
    die(header('HTTP/1.0 404 Not Found')); //or just die();
}

这将确保类文件仅在包含在定义IN_APPLICATION. die()您也可以只用 a本身杀死类文件,而不是伪造 404。

于 2012-06-06T23:11:47.247 回答
1

在您的包含目录中创建一个 .htaccess 文件

deny from all

不能为客户端脚本完成,因为浏览器必须能够访问它们。你能做的最好的就是混淆它们

于 2012-06-06T22:57:35.263 回答
0

嗯,如前所述,htaccess 不会阻止 php 访问 htpassword 安全文件夹。因此,必须调用 Apache 才能使用它非常安全的安全功能,至少对于 https 恕我直言,例如:

header('Location: secret/index.php');

使用 htaccess 保护文件夹机密的位置。

index.php 可能如下所示:

<?php
$a = $_REQUEST['a'] ;
if ($a==secret)  
    header('Location: secret/index.php');    
include_once("index_head.php");
include_once("index_tail.php");
?>

和秘密/index.php

<?php 
include_once("../index_head.php");
include_once("./secret.php");
include_once("../index_tail.php");
?>

剩下的主要问题是,secret/index.php 将找不到任何链接,如 ./main.css 等。因此必须定义绝对链接而不是相对链接,但我相信你们现在该怎么做;- )

一个正在运行的示例在http://promotio.ch/secret.php/

于 2015-02-07T20:29:34.083 回答