Файл существует безопасно? - PullRequest
3 голосов
/ 27 августа 2009
if (file_exists("pages/$page.php")) {
  include($page.'.php');
}

Это безопасно?

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

Ответы [ 6 ]

7 голосов
/ 27 августа 2009

Конечно нет, особенно если $page = "./configuration"

Я бы рекомендовал заменить его на что-то вроде этого:

$pages = array("blog", "home", "login");
if (in_array(strtolower($page), $pages))
  include("pages/$page.php");

РЕДАКТИРОВАТЬ: Вы можете создать этот список приемлемых страниц с этим кодом.

$pages = array();
if ($dh = opendir("pages")) {
  while (($file = readdir($dh)) !== false) {
    if (strstr($file, ".php") !== false) // make sure it is a .php file
      $pages[] = substr($file, -4); // remove the .php
  }
  closedir($dh);
}
2 голосов
/ 27 августа 2009

Код, который вы разместили, содержит опечатку, я верю. Должно быть:

if (file_exists("pages/$page.php")) {
  include("pages/$page.php");
}

Однако это приводит к внедрению кода, если позволяют настройки PHP, к удаленному включению файлов.

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

Обычно этот тип кода встречается в классе «Loader», использующем фабричный метод, однако в хороших реализациях он ограничивает файлы и классы, которые он загружает, в определенный каталог или определенный заранее определенный набор файлов. ,

1 голос
/ 27 августа 2009

Используйте базовое имя ($ _ REQUEST ['page']), чтобы предотвратить потенциальный доступ к другим каталогам, затем проверьте, существует ли он.

http://php.mirror.facebook.net/manual/en/function.basename.php

1 голос
/ 27 августа 2009

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

$page = basename($_GET['page']);
if (file_exists("pages/$page")) {
  include("pages/$page");
} else {
  include("pages/default.php");
}
1 голос
/ 27 августа 2009

Если $ page никогда не установлен, PHP попытается найти то, что может быть, следуя директиве variable_order внутри вашего php.ini. Эта директива сообщает PHP порядок, в котором нужно искать переменные. Поскольку по умолчанию для этого используется EGPCS, хитрый хакер затем вызывает ваш скрипт и сообщает ему, чтобы он включал любой файл, к которому PHP имеет доступ.

Ex:

www.example.com /? Страница = dbConfig.ini

0 голосов
/ 14 января 2013

Как отметил ceejayoz в ответе bucabay, запрошенная страница может иметь "../", что позволяет пользователю легко выйти из того места, где он должен быть. Мой ответ на другой вопрос должен вам хорошо послужить.

https://stackoverflow.com/a/12361051/1524693

Если ссылка не работает: в основном вы проверяете realpath () каталога include и запрошенный файл, если realpath () файла начинается с realpath () каталога include, его можно безопасно включить. (Я использовал strpos () == 0, чтобы проверить, начинается ли путь к файлу с пути включения)

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