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

Dou*_*Fir 4 php include

我有一个PHP驱动的CMS网站.我想要包含database.php在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';

?>
Run Code Online (Sandbox Code Playgroud)

运行脚本,我收到此消息:

/应用/ XAMPP/xamppfiles/htdocs中/ tslocal/textbook_scripts

没有直接的脚本访问.

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

<?php defined('SYSPATH') or die('No direct script access.');
Run Code Online (Sandbox Code Playgroud)

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

Jef*_*ert 6

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

define( 'APPLICATION_LOADED', true );
Run Code Online (Sandbox Code Playgroud)

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

if( !defined('APPLICATION_LOADED') || !APPLICATION_LOADED ) {
    die( 'No direct script access.' );
}
Run Code Online (Sandbox Code Playgroud)

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


Eri*_*ski 5

我从 Codeigniter 的 Email.php 类 CI_Email 中收到此 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

}
Run Code Online (Sandbox Code Playgroud)

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

<?php
    include("Email.php");
?>
Run Code Online (Sandbox Code Playgroud)

当我运行它时,它说:

No direct script access.
Run Code Online (Sandbox Code Playgroud)

PHP方法“define”检查给定常量是否存在且已定义。

因此,对于我的特定课程,它表示必须定义 BASEPATH。所以如果你这样定义它:

<?php
  define('BASEPATH', "foobar");
  include("Email.php");
?>
Run Code Online (Sandbox Code Playgroud)

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