В index.php: include('menu.php'); Имеем в menu.php: HTML: <li><a href="<?=$SCRIPT_NAME?>?page=search">Поиск оборудования</a> А в index.php: PHP: if (empty($page)) {include('info.txt');} else {include($page.".php"); При этом НЕ подтягивает нужную страничку. Перестало работать после перехода с win XP на win 7. Объясните мне тюленю что не так??? Где искать, весь инет излазил уже(((
что-то ты недоброе затеял! Что такое $page и откуда он берется? Ты берешь из GET запроса значение, в данном случае "search" и хочешь подставить его в $page и проверить условие? Но условие у тебя по какой-то причине не выполняется? Т.е. на данный момент у тебя срабатывает условие с подстановкой info.txt? !!! PS: когда ты что-то получаешь от пользователя, а в данном случае это как минимум GET запрос, ты должен не просто кинуть это в условие, а проверить, что там пришло и пришло ли вообще!
Верно поняли, но еще я не понимаю почему на ЭксПи это работало а на семерке не хочет... Как будет верно реализовать это?
Ну вообще, винда хоть какая, это не та ОС, хотя и сам на ней. А то что работало раньше а не работает сейчас это я не знаю, вероятно что-то не так. И первый вопрос который я уже озвучил: каким образом в переменную $pаge попадает какое-либо значение? Из представленного кода, я вижу, что она само по себе, поэтомe при проверке условия получается TRUE ибо в $pаge ничего нет. Этот код и на XP не должен был работать, либо я что-то не знаю о XP и поведении PHP в этой среде --- Добавлено --- По сути нужно получить содержимое GET запроса, с помощью $_GET
вот что-то подобное должно быть, но это не панацея, как пример, не более: PHP: <?php $page = (isset($_GET['page'])) ? $_GET['page'] : false; $page = $page.".php"; $validPages = ['search']; if (empty($page) || !file_exists($page) && !in_array($page, $validPages)) { include('info.txt'); }else{ include($page); } ?>
Как мин. вам нужно проверять существование $_GET['page'], а также значение этого параметра, например проверить существование соотв. ключа в предопределенном ассоциативном массиве. И лучше сразу переходите на более современную реализацию единой точки входа: Как сделать единую точку входа с ЧПУ? --- Добавлено --- Ну дыра же в безопасности! Подредактируй пост, пока не поздно
Честно сказать чет я туплю и не вижу, где косяк. Но то что я напортачил с условием, это я вижу, но уже не изменить. PS: так что пример выше использовать нельзя он хоть и рабочий, но неверный!
--- Добавлено --- Или ты специально хотел подсунуть ТСу шел для запуска произвольного php-скрипта, в том числе и из др. каталога? --- Добавлено --- Хотя ТСу не привыкать Ты типа сконцентрировался на ответе на осн. вопрос.
Я вообще хотел показать, что вероятно он упустил что в $page что-то должно быть, затем решил, что будет неправильно если не укажу список допустимых страниц, дабы указать, что можно обращаться исключительно к этим страницам (те которые в массиве $validPages), но то потом накосяил с условием, а время вышло. Должно было получиться вот так: PHP: <?php $requestedPage = (isset($_GET['page'])) ? $_GET['page'] : false; $page = $requestedPage.".php"; $validPages = ['search', 'main']; if (!empty($page) && file_exists($page) && in_array($requestedPage, $validPages)) { include($page); }else{ include('info.txt'); } ?> --- Добавлено --- А касаемо : Можно рассказать, как бы там это вышло? Просто практики не так много, а это было бы полезно. Думаю тут такое обсуждать нельзя, но если не сложно в личку. Очень интересно, какой должен быть запрос, чтоб подсунуть шелл?
@AlexandrS, шелл ты подсунул в своем посте Использовать («эксплуатировать уязвимость») можно так: /?page=../cron и т.п. И лучше все-таки использовать не значения, а ключи массива для идентификации страниц. Значения при этом можно использовать для хранения имен/заголовков страниц (как было в одной из недавних тем, в кот. мы принимали обсуждение), имен файлов-обработчиков (чтобы реализовать соответствие много страниц-один обработчик) и т.п. --- Добавлено --- P.S. Для быстрого поиска можно использовать array_key_exists или просто isset.
сейчас посмотрел, относительно того что я написал сразу, т.е. по сути в /?page= можно передать путь, а этот путь будет инклудится и исполняться, я верно понял?
Да, относительный путь, включая осн. имя файла (т.е. краткое без расширения). --- Добавлено --- P.S. У ТСа эта дыра изначально присутствует. Но мы же как бы не должны воспроизводить дыры, помогая ему
basename, и никаких проблем. @kretsman, наверняка вместе с виндой поменялась версия php. register_globals опасный флаг был, его правильно выпилили
@kretsman, если действительно поменялась версия php, то лучше всего просто переписать код, чтоб он не рассчитывал на register_globals, почитайте доку, как работать с get и post