使用include时无法直接访问脚本

时间:2013-08-22 15:17:00

标签: php 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 / xamppfiles / htdocs中/ tslocal / textbook_scripts

     

无法直接访问脚本。

database.php的第一行是这一行:

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

我猜这个CMS已经以某种方式“保护”了配置文件,这阻止了我将其包含在内。什么是“无直接脚本访问”?谷歌为我提供了许多寻求添加此功能的人的例子。我希望将其删除。可能?可能性有多大?我怎么告诉PHP让我访问database.php?

2 个答案:

答案 0 :(得分:6)

解决这个问题的基本方法是在应用程序的某个地方(在加载database.php之前),有一行代码:

define( 'APPLICATION_LOADED', true );

在database.php中,对此执行检查,类似于:

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

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

答案 1 :(得分:2)

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

<?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 method "defined"检查给定常量是否存在并定义。

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

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

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