Надежно создать экземпляр класса PHP из URL получить параметр? - PullRequest
0 голосов
/ 26 апреля 2018

Я написал небольшой фрагмент кода, который должен создавать экземпляр класса php на основе get-параметра.

(Код отредактирован на основе предложений @ sietse85 и @CBroe:)

  $this->pageVal = preg_replace('/[^A-Za-z]/', '', filter_input(INPUT_GET, 'page')) ? preg_replace('/[^A-Za-z]/', '', filter_input(INPUT_GET, 'page')) : "index";

  $file = $this->moduleDir . $this->pageVal . ".php";
  if (file_exists($file)) {
    require_once $file;
    $class = new $this->pageVal($this);
  } else {
    header($_SERVER["SERVER_PROTOCOL"] . " 404 Not Found", true, 404);
    $this->loadPage("404");
  }

В этом похожем вопросе предлагается сделать что-то вроде этого: Вызов функции PHP из URL?

В других вопросах люди иногда получают предупреждение, когда используют небезопасный код - теперь я пытался удалить некоторые проблемы безопасности (в моем коде) на основе этих предупреждений, используя filter_input и Requiere только файлы, которые существуют. Возможно, этого недостаточно или неправильная процедура?

Должен ли я добавить в белый список существующие страницы и возможные параметры или сделать что-то еще, чтобы избежать проблем безопасности, или это не нужно?

Как это:

$existingPages = ["index", "profile", "login", "register"];

if(in_array(filter_input(INPUT_GET, 'page'), $existingPages)) {

  //GO ON WITH PROCESSING
  $this->pageVal = filter_input(...)

}

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

Спасибо!

1 Ответ

0 голосов
/ 26 апреля 2018

Я попытался удалить проблемы безопасности (в моем коде) на основе этих предупреждений с помощью filter_input

Извините - вы не устранили проблемы безопасности, этот код все еще уязвим для обхода каталога. Функция filter_input() является ИМХО очень неуместной функцией. Вы никогда не должны изменять представление ввода, но вы должны проверить его. Однако filter_input () нужно указать , как вы хотите его проверить. И у него нет опции для частичного имени файла.

Должен ли я внести в белый список существующие страницы

Если вы исправите проблему обхода каталога, то вы добавили в белый список те сценарии, которые можно запустить - запускать сценарии можно будет только в указанном каталоге.

Рассмотрим:

$this->pageVal = basename($_GET['file']);
$file = $this->moduleDir . $this->pageVal . ".php";
if (!is_readable($file)) {
    trigger_warning("User attempted to access non-existent code: " 
      . base64encode($_GET['page']), E_USER_WARNING);
    $this->pageVal = 'index';
    $file = $this->moduleDir . $this->pageVal . ".php";
}
require_once $file;

Использование регулярных выражений для удаления / сохранения произвольных символов не является элегантным решением.

...