【问题标题】:How can I protect my included php files from direct access?如何保护我包含的 php 文件不被直接访问?
【发布时间】:2011-04-24 19:29:46
【问题描述】:

我的脚本...

index.php

DEFINE('DIR', 'http://www.example.com');
DEFINE('IN_PAGE', TRUE);

INCLUDE DIR . ('/incl/header.php');
INCLUDE DIR . ('/incl/content.php');
INCLUDE DIR . ('/incl/footer.php');

/incl/header.php

if (!defined('IN_PAGE'))
{
    header("Status: 403 Forbidden");
    exit('<B>403 Forbidden</B>');
}

访问 index.php

警告: 包括(http://www.example.com/incl/header.php) [function.include]:打开失败 流:HTTP 请求失败! HTTP/1.1 403 禁入 /public_html/incl/index-incl.php 在第 4 行

警告:include() [function.include]: 打开失败 'http://www.example.com/incl/header.php' 纳入 (include_path='.:/usr/lib64/php:/usr/lib/php') 在 /public_html/incl/index-incl.php 在第 4 行


它有点工作,如果我尝试直接访问该文件,我会收到我想要的“禁止”消息。但我不能将它包含在我的脚本中。即使我很确定我正确地遵循了 phpBB 的开发 wiki .

我是该死的新手,非常感谢您的帮助! =]

【问题讨论】:

  • 最好的方法是将包含文件放在文档根目录之外,或者将服务器配置为不在它们所在的目录中执行脚本。
  • “我的脚本中不能包含它”是什么意思?以什么方式?

标签: php include


【解决方案1】:

理想的方法是将包含文件放在 webroot 之外。

这并不总是可行的,因此请确保您的包含文件不会自行“运行”任何代码。采用面向对象的方法,其中一个文件包含可运行的代码,或者它是一个自身不做任何事情的类文件。

另一种选择是更改包含文件的扩展名(例如更改为 .inc)并拒绝使用 htaccess 直接访问这些文件。

作为专业提示:当您包含文件时,始终包含绝对路径:

include(dirname(__FILE__) . "/includes/template.inc");
// __FILE__ is the diskpath of the current file

而不是:

include("includes/template.inc");

这样可以省去很多麻烦。

正如其他人所说,永远不要包含来自另一个网络服务器 (http://) 的文件,这意味着你在做一些根本错误的事情:P

【讨论】:

  • 我以为我是这样做的,使用DIR . ('/incl/footer.php'); DIR 是路径,因为站点不存在,所以路径变为生命时会改变,因此我需要重新定义 DIR。
  • 我现在明白了.. 谢谢.. 我不明白为什么它不能使用绝对路径,它正在工作.. 我创建了两个不同的定义,一个用于包含的文件,一个用于对于图像等.. 因为如果我试图调用图像或 css 文件,__FILE__ 将不起作用。
  • 我的意思是我不明白为什么当我提供 URL www.example.com 而不是 /public_html/username/domain/(磁盘路径)时它不起作用
【解决方案2】:

去使用htaccess

【讨论】:

  • 他可以阻止 *.inc.php 文件被服务
【解决方案3】:

您正在尝试包含类似 包括('http://www.example.com/incl/header.php'); 基本上

将目录更改为 DEFINE('DIR', 目录名(__FILE__));

或类似的东西,因此它不在包含路径中使用域,这意味着包含是在本地完成的。

【讨论】:

    【解决方案4】:

    您尝试包含一个远程文件DEFINE('DIR', 'http://www.example.com');,以便您的服务器实际调用该 url,获取错误并显示它 使用相对路径,例如。改为DEFINE('DIR', '/');

    【讨论】:

      【解决方案5】:

      您的问题是,include 使用文件的本地路径,而不是 url。您需要知道您帐户中文件的根路径是什么,例如/home/your_account/public_html/

      【讨论】:

      • 谢谢你的解释。我应该更密切地关注手册。 :]
      猜你喜欢
      • 1970-01-01
      • 2017-05-29
      • 1970-01-01
      • 1970-01-01
      • 2014-05-03
      • 2012-08-26
      • 2010-09-29
      相关资源
      最近更新 更多