6

我有一个 PHP 驱动的 CMS 网站。我想包含database.php在 PHP 脚本中。database.php 位于 config 文件夹中,并具有 db 连接详细信息(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';

?>

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

/Applications/XAMPP/xamppfiles/htdocs/tslocal/textbook_scripts

没有直接的脚本访问。

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

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

我猜 CMS 以某种方式“保护”了阻止我包含它的配置文件。什么是“无直接脚本访问”?谷歌给了我很多试图添加这个功能的人的例子。我想删除它。可能的?可能吗?如何告诉 PHP 让我访问 database.php?

4

2 回答 2

8

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

define( 'APPLICATION_LOADED', true );

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

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

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

于 2013-08-22T15:21:45.570 回答
5

我从 Codeigniter 的名为 CI_Email 的 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方法“已定义”检查给定常量是否存在并已定义。

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

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

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

于 2014-04-16T14:09:33.157 回答