我有一个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");
?>
然后不再抛出错误。但是,我们不得不想知道为什么开发人员会设置这个特定的限制,如果我们绕过它会发生什么。