Я хочу знать, безопасен ли мой код и если существуют другие более безопасные альтернативы для включения внешних файлов..
Таким образом, это - мой пример кода, действительно ли это безопасно? Как я могу сделать это более безопасным?Спасибо!
<?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;
} ?>
Ваш код в порядке. Нет проблем с условным включением файлов, как вы делаете, поскольку имена файлов жестко запрограммированы. Проблема возникает, когда включенный файл основан на незарегистрированном значении от пользователя. Например,
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
Если у вас есть классы использования, есть также опция автозагрузчика . Судя по внешнему виду вашего приложения, вам придется реструктурировать его, чтобы иметь возможность его использовать.
Это безопасно, и оператор switch сделал логику более понятной. Чтобы сделать его более безопасным, возможно, вы можете использовать $ __ POST, чтобы скрыть источник данных переменной переключателя, чтобы сделать его немного безопаснее. : D
Вы можете изучить содержимое $ _ GET ['p']
, прежде чем даже вводить переключатель. Если он содержит специальные символы, мусор или что-то еще, ваша программа может захотеть зарегистрировать инцидент (и не тратить время на рендеринг страницы).
По крайней мере, хорошая и вежливая страница «Извините, мы не смогли обработать ваш запрос» была бы в порядке.
Это по-прежнему позволяет переключателю перейти на главную страницу при условии, что p
содержит что-то достойное оценки переключателя в первую очередь.
Это особенно верно, если главная страница выполняет любое количество запросов для отображения. Рано или поздно кто-то заметит вашу структуру URI и решит, что с ней может быть интересно поиграть, не сжигайте циклы процессора на идиотах :)
Да, совершенно безопасно.
Вы включаете файлы, содержимое которых вам известно, а не делаете это на основе переменных, поступающих из внешних источников. включение не приведет к сбою вашего скрипта, если он не может загрузиться; если это тот результат, который вам нужен, выберите require ('filename');
.
Вы можете сделать это более читаемым, следующим образом:
$safeIncludes = array('test1', 'test2', 'test3');
$p = $_GET['p'];
if(in_array($p, $safeIncludes)) {
$scriptName = $p . '.php';
include($scriptName);
}
В остальном он безопасен, как указывали другие.
Поскольку вы включаете только те, которые жестко запрограммировали, я не понимаю, почему это может быть небезопасно. Это не внешние файлы, но я понимаю, что вы имеете в виду. Внешний будет означать на другом сервере.
Что касается вашего вопроса, то единственная альтернатива include
- это require
, но это не обязательно безопаснее, просто работает иначе.