Как узнать, вызывается ли php-скрипт через require_once ()? - PullRequest
2 голосов
/ 28 декабря 2010

В моем веб-приложении есть набор модулей.У каждого модуля есть «основной» php-скрипт, который загружает подмодули на основе запроса, отправленного главному модулю:

//file: clientes.php

//check for valid user...
//import CSS and JS...

switch( $_GET["action"] )
{
    case "lista" :          require_once("clientes.lista.php"); break;
    case "listaDeudores" :  require_once("clientes.listaDeudores.php"); break;
    case "nuevo" :          require_once("clientes.nuevo.php"); break;
    case "detalles" :       require_once("clientes.detalles.php"); break;
    case "editar" :         require_once("clientes.editar.php"); break;         
    default : echo "<h1>Error</h1><p>El sitio ha encontrado un error.</p>";
} 

Этот основной модуль имеет дело с безопасностью и импортирует много ресурсов, необходимых всем подмодулям.Большая проблема проявляется, когда пользователь запрашивает любой из подмодулей, минуя все меры безопасности на главном модуле!Моя идея состояла в том, чтобы добавить строку в каждый подмодуль, чтобы проверить, вызывается ли он напрямую и запретить доступ, или он вызывался через другой скрипт, и продолжить.Меньшее, что я хотел бы сделать, это повторить проверку безопасности для каждого отдельного файла, поскольку он выполняет несколько запросов к базе данных.

Знает ли скрипт php, был ли он вызван с помощью require_once() илипрямой звонок?Я пытался реализовать какую-то ловушку $_SERVER['REQUEST_URI'] и $_SERVER['PHP_SELF'], но мне было интересно, есть ли какой-нибудь элегантный способ сделать это.

Ответы [ 11 ]

0 голосов
/ 28 декабря 2010

По привычке у меня есть консольный класс, созданный для отправки сообщений, ошибок и т. Д. На консоль с FirePHP.Внутри метода write () класса Console у меня есть проверка, чтобы увидеть, является ли $ _REQUEST [debug] == 1, таким образом, я не показываю ошибки пользователям, если что-то всплывает на производстве, и они должны знать, что запроспеременная для доступа к отладочной информации.

В верхней части каждого файла, который я добавляю:

Console::debug('fileName.php is loaded.');

приведен фрагмент кода, чтобы дать вам правильное представление:

class Console{

  public static function write($msg,$msg_type='info',$msg_label=''){
    if(isset($_REQUEST['debug']) && $_REQUEST['debug'] == 'PANCAKE!'){
      ob_start();
      switch($msg_type){
        case 'info':
          FB::info($msg, $msg_label);
          break;
        case 'debug':
          FB::info($msg, 'DEBUG')
          break;
          ...
      }
    }
  }

  public static function debug($msg){
    Console::write($msg, '');
  }
}
...