Запретить прямой доступ к файлу php - PullRequest
155 голосов
/ 03 января 2009

У меня есть php-файл, который я буду использовать исключительно для включения. Поэтому я хотел бы выдать ошибку вместо того, чтобы выполнить ее, когда к ней обращаются напрямую, введя URL-адрес вместо включения.

В основном мне нужно выполнить проверку в php-файле следующим образом:

if ( $REQUEST_URL == $URL_OF_CURRENT_PAGE ) die ("Direct access not premitted");

Есть ли простой способ сделать это?

Ответы [ 34 ]

0 голосов
/ 31 января 2017

Вы можете использовать phpMyAdmin Style:

/**
 * block attempts to directly run this script
 */
if (getcwd() == dirname(__FILE__)) {
    die('Attack stopped');
}
0 голосов
/ 17 декабря 2015

Добавлено ранее упомянутое решение с проверкой версии PHP:

    $max_includes = version_compare(PHP_VERSION, '5', '<') ? 0 : 1;
    if (count(get_included_files()) <= $max_includes)
    {
        exit('Direct access is not allowed.');
    }
0 голосов
/ 16 октября 2015
if ( ! defined('BASEPATH')) exit('No direct script access allowed');

сделает работу гладко

0 голосов
/ 10 сентября 2015

Я не нашел предложения с .htaccess настолько хорошими, потому что они могут заблокировать другой контент в этой папке, к которому вы можете предоставить пользователю доступ, это мое решение:

$currentFileInfo = pathinfo(__FILE__);
$requestInfo = pathinfo($_SERVER['REQUEST_URI']);
if($currentFileInfo['basename'] == $requestInfo['basename']){
    // direct access to file
}
0 голосов
/ 10 сентября 2011

Вы можете использовать следующий метод ниже, хотя, у него есть недостаток, потому что он может быть подделан, за исключением случаев, когда вы можете добавить еще одну строку кода, чтобы убедиться, что запрос поступает только с вашего сервера либо с использованием Javascript. Вы можете разместить этот код в разделе «Тело» своего HTML-кода, чтобы там отображалась ошибка.

<?
if(!isset($_SERVER['HTTP_REQUEST'])) { include ('error_file.php'); }
else { ?>

Поместите другой код HTML здесь

<? } ?>

Завершите это так, чтобы вывод ошибки всегда отображался в разделе body, если вы хотите, чтобы он был таким.

0 голосов
/ 03 января 2009

сделать что-то вроде:

<?php
if ($_SERVER['SCRIPT_FILENAME'] == '<path to php include file>') {
    header('HTTP/1.0 403 Forbidden');
    exit('Forbidden');
}
?>
0 голосов
/ 08 марта 2014
<?php       
$url = 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
  if (false !== strpos($url,'.php')) {
      die ("Direct access not premitted");
  }
?>
0 голосов
/ 16 февраля 2011

Я нашел это php-единственное и неизменное решение, которое работает как с http, так и с cli:

Определить функцию:

function forbidDirectAccess($file) {
    $self = getcwd()."/".trim($_SERVER["PHP_SELF"], "/");
    (substr_compare($file, $self, -strlen($self)) != 0) or die('Restricted access');
}

Вызовите функцию в файле, к которому вы хотите запретить прямой доступ:

forbidDirectAccess(__FILE__);

Большинство приведенных выше решений этого вопроса не работают в режиме Cli.

0 голосов
/ 14 августа 2013

Самый простой способ - хранить ваши включения вне веб-каталога. Таким образом, сервер имеет доступ к ним, но не имеет внешней машины. Единственным недостатком является то, что вы должны иметь доступ к этой части вашего сервера. Плюс в том, что он не требует настройки, настройки или дополнительного кода / нагрузки на сервер.

0 голосов
/ 02 октября 2011

Вы также можете попробовать переименовать документ, к которому у людей нет доступа. Например, вы можете переименовать его в 47d8498d3w.php. Просто придумайте что-нибудь, что люди, скорее всего, не будут печатать как http-запрос. Если вы включите файл с помощью SSI или PHP, пользователь все равно не сможет увидеть название документа.

...