使用include时没有直接的脚本访问权限


No direct script access when using include

我有一个PHP驱动的CMS网站。我想在PHP脚本中包含database.php。database.php位于config文件夹中,具有数据库连接的详细信息(pass、db_name等)。

这是脚本:

<?php 
  echo __DIR__ ."<br /><br />"; 
  //make sure your assumptions on directories and path are correct for the 
  //include below
  include '../application/config/database.php';
?>

运行脚本时,我得到以下消息:

/应用程序/XAMPP/examplefiles/htdocs/tslocal/textbook_scripts

没有直接的脚本访问权限。

database.php的第一行是这行:

<?php defined('SYSPATH') or die('No direct script access.');

我猜CMS以某种方式"保护"了配置文件,这使我无法将其包括在内。什么是"没有直接脚本访问"?谷歌给了我很多想要添加此功能的人的例子。我想把它取下来。可能吗?可能的如何告诉PHP允许我访问database.PHP?

实现这一点的基本方法是在应用程序中的某个位置(在加载database.php之前),有一行类似以下内容:

define( 'APPLICATION_LOADED', true );

在database.php中,有一个针对此执行的检查,类似于:

if( !defined('APPLICATION_LOADED') || !APPLICATION_LOADED ) {
    die( 'No direct script access.' );
}

查看database.php及其包含的任何文件,以确定它是如何检查脚本是否被直接访问的。然后,如果您想在脚本中包含该文件,则可以模拟必要的条件。

我从Codeigniter的名为CI_Email.PHP的Email.PHP类中得到了这个PHP错误:

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class CI_Email {
   var $smtp_default_from = '';
   var $smtp_default_name = '';
   var $useragent = "CodeIgniter";
   var $mailpath  = "/usr/sbin/sendmail";
   //more code omitted
}

我所做的是尝试像这样直接包含这个类:

<?php
    include("Email.php");
?>

当我运行它时,它会说:

No direct script access.

PHP方法"defined"检查给定常量是否存在以及是否已定义。

所以对于我的特定类,它说必须定义BASEPATH。因此,如果你这样定义它:

<?php
  define('BASEPATH', "foobar");
  include("Email.php");
?>

然后不再抛出错误。但是,我们不得不想知道为什么开发人员会设置这个特定的限制,如果我们绕过它会发生什么。