Динамическая безопасность

Есть ли способ безопасно включать страницы, не помещая их в массив?

 if (preg_match ('/ ^ [a-z0-9] + /', $ _GET ['page'])) {

 $ page = $ _GET ['page']. ". php";
 $ tpl = $ _GET ['page']. ". html";
 if (file_exists ($ page)) включает ($ page);
 if (file_exists ($ tpl)) включает ($ tpl);

 }

Что я должен добавить, чтобы сделать это довольно безопасным?

Я делаю это так, потому что мне не нравится включать материал, который должен быть включен на все страницы. «Include header> content> include footer» -way. Я также не хочу использовать никаких шаблонов / фреймворков.

Благодарю.

Слабость вашей текущей реализации заключается в том, что …

  1. регулярное выражение просто проверяет начало строки, поэтому « images/../../secret » пройдет, и
  2. без дополнительной проверки, « index » также будет действительным значением и вызовет рекурсию.

Чтобы сделать вашу реализацию безопасной, рекомендуется применить все, что должно быть включено, в свой собственный каталог (например, « includes » и « templates »). Исходя из этого, вам просто нужно убедиться, что из этого каталога нет выхода.

 if (preg_match('/^[a-z0-9]+$/', $_GET['page'])) { $page = realpath('includes/'.$_GET['page'].'.php'); $tpl = realpath('templates/'.$_GET['page'].'.html'); if ($page && $tpl) { include $page; include $tpl; } else { // log error! } } else { // log error! } 

Примечание: realpath возвращает абсолютный путь к данному относительному пути, если файл существует, а false противном случае. Поэтому file_exists не требуется.

Несмотря на то, что вы заявили о том, что не хотите хранить список доступных страниц в массиве, это, скорее всего, будет лучшим решением, отличным от db.

 $availFiles = array('index.php', 'forum.php'); if(in_array($_GET['page'].".php", $availFiles)) { //Good } else { //Not Good } 

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

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

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

Я согласен с Unkwntech. Это такой небезопасный способ включения файлов на ваш сайт, я хочу, чтобы PHP-программисты полностью покончили с этим. Тем не менее, массив со всеми возможными совпадениями, безусловно, безопаснее. Однако вы обнаружите, что шаблон MVC работает лучше, и он более безопасен. Я бы загрузил код воспламенителя и возьму учебник или два, вам понравится по той же причине, по которой вы хотите использовать динамические функции.