PHP include () альтернатива? - PullRequest
       14

PHP include () альтернатива?

5 голосов
/ 11 апреля 2010

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

Итак, это мой пример кода, это безопасно? Как я могу сделать это безопаснее? Спасибо!

<?php switch($_GET['p']){
   case 'test1':
      include 'test1.php';
      break;
   case 'test2':
      include 'test2.php';
      break;
   case 'test':
                echo 'something';
      include 'pages/test.php';
                echo 'something';
      break;
   default: 
      include 'main.php';
      break; 
} ?>

Ответы [ 6 ]

6 голосов
/ 11 апреля 2010

Ваш код в порядке. Нет проблем условно, включая файлы, как вы делаете, так как имена файлов жестко закодированы. Проблема возникает, когда включенный файл основан на необработанном значении пользователя. * 1001 например *

include $_GET['p'];

Что может включать в себя все, что хочет пользователь (в зависимости от настроек PHP, оно может также включать файлы в других доменах)

Другие варианты - это варианты того, что вы делаете

require и require_once завершатся ошибкой, если файл не существует. inlucde_once и require_once гарантируют, что файл будет включен только один раз, поэтому он не будет включен в этот файл в другом месте программы.

include_once 'myfile.php';
include_once 'myfile.php'; //does nothing as the file is already included

Если у вас есть классы использования, есть также опция автозагрузчик . Судя по внешнему виду вашего приложения, вам придется реструктурировать его, чтобы иметь возможность использовать его.

1 голос
/ 11 апреля 2010

Возможно, вы даже рассмотрите содержимое $_GET['p'] до того, как войдете в коммутатор. Если он содержит специальные символы, мусор или что-то еще, ваша программа может захотеть записать инцидент (и не тратить время на рендеринг страницы).

По крайней мере, хорошая и вежливая страница "Извините, мы не смогли обработать ваш запрос" была бы в порядке.

Это по-прежнему позволяет переключателю переключаться на главную страницу, при условии, что p содержит что-то, достойное переключателя, оценивающего в первую очередь.

Это особенно верно, если главная страница выполняет какое-либо количество запросов для отображения. Рано или поздно кто-то заметит вашу структуру URI и решит, что с ней может быть интересно поиграть, не сжигайте циклы ЦП на идиотах:)

0 голосов
/ 11 апреля 2010

Это безопасно, как есть, и оператор switch сделал логику более понятной. Просто чтобы сделать его более безопасным, возможно, вы можете использовать $ __ POST, чтобы скрыть переменный источник данных переключателя, чтобы сделать его немного более безопасным. : D

0 голосов
/ 11 апреля 2010

Вы можете сделать это более читабельным, как показано ниже:

$safeIncludes = array('test1', 'test2', 'test3');
$p = $_GET['p'];
if(in_array($p, $safeIncludes)) {
    $scriptName = $p . '.php';
    include($scriptName);
}

Кроме этого, он безопасен , как указали другие.

0 голосов
/ 11 апреля 2010

Да, совершенно безопасно.

Вы включаете файлы, содержимое которых вам известно, а не делаете это на основе переменных, поступающих из внешних источников. включение не приведет к сбою вашего скрипта, если он не может загрузиться, если вы хотите получить такой результат, выберите require('filename');.

0 голосов
/ 11 апреля 2010

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

Что касается вашего вопроса, единственной альтернативой include является require, но это не обязательно безопаснее, просто она работает по-другому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...