define是不能跨页面的,但是最近看一个开源的PHP项目它是这样的:比如a.php :直接define('IN_TM', TRUE);
b.php直接<?php
if(!defined('IN_TM')) 
{
exit('Access Denied');
}

if($_SESSION["admin"]!="Silence")
{
include template('login.htm');
    exit;
}。。
就完全没用include包含!但是我这样模拟的时候define是不能跨页面的!它还有什么设置使得'IN_TM'在另一个页面有效吗?
类似于DISCUZ的防止地址栏直接访问后台文件又是怎么实现的呢?

解决方案 »

  1.   

    如果你能确认在判断之前没有文件被显式的嵌入的话
    那么他就是利用了 php.ini 中的 auto_prepend_file 其实只要项目能运行, 你只需 打印出 get_included_files 的结果就知道什么文件被嵌入了
      

  2.   

    这个肯定有用include包含,只是你没看到
      

  3.   

    discuz那个是防止用url直接访问部分php文件,因为这些文件是做为程序的一部分的,如果被单独请求时没有意义的,比如某个类文件。如何实现的,你给的代码中就已经说明了
      

  4.   

    但是我这样模拟的时候define是不能跨页面的!它还有什么设置使得'IN_TM'在另一个页面有效吗?b.php
    <?php
    if(!defined('IN_TM')) 
    {
    exit('Access Denied');
    }a.php
    <?php
    define('IN_TM', TRUE);
    include 'b.php';访问 b.php 必须通过访问 a.php 完成,否则就 Access Denied
      

  5.   

    其实这个a.php 已经被包含到其他页面去了,只是这个页面没include而已,include在其他页面