PHP включают () альтернативу?

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

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

<?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; 
} ?>
5
задан PeeHaa 3 November 2013 в 16:59
поделиться

6 ответов

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

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

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

6
ответ дан 14 December 2019 в 13:31
поделиться

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

0
ответ дан 14 December 2019 в 13:31
поделиться

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

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

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

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

1
ответ дан 14 December 2019 в 13:31
поделиться

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

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

0
ответ дан 14 December 2019 в 13:31
поделиться

Вы можете сделать это более читаемым, следующим образом:

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

В остальном он безопасен, как указывали другие.

-1
ответ дан 14 December 2019 в 13:31
поделиться

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

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

0
ответ дан 14 December 2019 в 13:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: