RealPath безопасно? - PullRequest
       16

RealPath безопасно?

0 голосов
/ 28 марта 2009
<?php
if (preg_match('/^[a-z0-9]+$/', $_GET['p'])) {
$page = realpath('pages/'.$_GET['p'].'.php');
$tpl = realpath('templates/'.$_GET['p'].'.html');
if ($page && $tpl) {
    include $page;
    include $tpl;
} else {
    include('error.php');
}
}
?>

Насколько безопасно это сказать?

Ответы [ 7 ]

2 голосов
/ 11 сентября 2012

Я использую это для файла шаблона, так что он может включать «страницы» вместо того, чтобы загромождать один файл с тоннами функций / строк / switch-case / elseifs (на выбор) или создавать тонны файлов с помощью тот же макет.

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

<?
#If you're worried about funky characters messing with stuff, use this
#preg_replace("/[^A-Za-z0-9_\-]+/","",$str);

if (isset($_REQUEST['page'])) {
    $path=realpath("../inc/page").DIRECTORY_SEPARATOR;
    $full_page=realpath($path.$_REQUEST['page'].".php");
    if (file_exists($full_page)&&(strpos($full_page,$path)===0)) {
        include($full_page);
    } else {
        echo "FAILED";
    }
}
?>
1 голос
/ 28 марта 2009

Ну, на самом деле это realpath в этом случае не обеспечивает никакой безопасности. На самом деле в этом случае это вообще не имеет смысла, поскольку include внутренне расширит путь. Ваша безопасность здесь на самом деле зависит от preg_match. Однако обратите внимание, что регулярное выражение, которое вы используете, не позволит вам использовать любую страницу с заглавной буквой, подчеркиванием или тире.

Во всяком случае, я не думаю, что включение файлов на основе параметров, переданных в запросе, является хорошей идеей. Что-то не так с вашим дизайном, если вам это нужно.

0 голосов
/ 28 февраля 2013

Я не могу комментировать реальный путь PHP, но если это просто оболочка для функции реального пути системы, то следует помнить одну вещь: в некоторых системах (например, Solaris), если процесс получает сигнал во время его выполнения realpath вернет пустую строку ... в этом случае вам нужно убедиться, что ваш код настроен для обработки ситуаций такого типа (если реализация PHP не разрешит эту конкретную дилемму за вас)

0 голосов
/ 03 апреля 2009

Лучше запустить basename () на $ _GET ['p']. Никаких атак через каталоги наверняка.

0 голосов
/ 29 марта 2009

realpath() действительно будет иметь некоторый эффект в этом случае, так как он вернет FALSE, если целевой файл не завершится. Но, как уже говорили другие авторы, это не повысит безопасность кода.

Это скорее способ обработки ошибок в случае, если указанные файлы не существуют.

0 голосов
/ 28 марта 2009

Кажется, это безопасно ....

Но не эффективно. В MVC у вас есть контроллер и предустановленные каталоги и предварительно известные. Нет смысла делать статистику, чтобы проверить, существует ли представление / контроллер.

0 голосов
/ 28 марта 2009

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

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

...