За последние 24 часа нас посетили 8434 программиста и 464 робота. Сейчас ищут 211 программистов ...

Передача и получения параметра через url.

Тема в разделе "PHP для новичков", создана пользователем kretsman, 16 сен 2019.

Метки:
  1. kretsman

    kretsman Новичок

    С нами с:
    7 сен 2018
    Сообщения:
    80
    Симпатии:
    0
    В index.php:
    include('menu.php');

    Имеем в menu.php:
    HTML:
    1. <li><a href="<?=$SCRIPT_NAME?>?page=search">Поиск оборудования</a>
    А в index.php:
    PHP:
    1. if (empty($page)) {include('info.txt');} else {include($page.".php");
    При этом НЕ подтягивает нужную страничку. Перестало работать после перехода с win XP на win 7.

    Объясните мне тюленю что не так??? Где искать, весь инет излазил уже(((

    upload_2019-9-16_15-11-17.png
     
  2. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    661
    Симпатии:
    104
    Адрес:
    Краснодар
    что-то ты недоброе затеял!

    Что такое $page и откуда он берется?

    Ты берешь из GET запроса значение, в данном случае "search" и хочешь подставить его в $page и проверить условие?

    Но условие у тебя по какой-то причине не выполняется?

    Т.е. на данный момент у тебя срабатывает условие с подстановкой info.txt?

    !!! PS: когда ты что-то получаешь от пользователя, а в данном случае это как минимум GET запрос, ты должен не просто кинуть это в условие, а проверить, что там пришло и пришло ли вообще!
     
    #2 AlexandrS, 16 сен 2019
    Последнее редактирование: 16 сен 2019
  3. kretsman

    kretsman Новичок

    С нами с:
    7 сен 2018
    Сообщения:
    80
    Симпатии:
    0

    Верно поняли, но еще я не понимаю почему на ЭксПи это работало а на семерке не хочет...
    Как будет верно реализовать это?
     
  4. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    661
    Симпатии:
    104
    Адрес:
    Краснодар
    Ну вообще, винда хоть какая, это не та ОС, хотя и сам на ней.
    А то что работало раньше а не работает сейчас это я не знаю, вероятно что-то не так. И первый вопрос который я уже озвучил:
    каким образом в переменную $pаge попадает какое-либо значение?
    Из представленного кода, я вижу, что она само по себе, поэтомe при проверке условия получается TRUE ибо в $pаge ничего нет.
    Этот код и на XP не должен был работать, либо я что-то не знаю о XP и поведении PHP в этой среде :)
    --- Добавлено ---
    По сути нужно получить содержимое GET запроса, с помощью $_GET
     
  5. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    2.700
    Симпатии:
    428
    Была когда-то такая хрень: register_globals. Начиная с 5.4 (как мин.) полностью выпилена.
     
  6. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    661
    Симпатии:
    104
    Адрес:
    Краснодар
    вот что-то подобное должно быть, но это не панацея, как пример, не более:

    PHP:
    1. <?php
    2.  
    3.  
    4. $page = (isset($_GET['page'])) ? $_GET['page'] : false;
    5.  
    6. $page = $page.".php";
    7.  
    8. $validPages = ['search'];
    9.  
    10. if (empty($page) || !file_exists($page) && !in_array($page, $validPages)) {
    11.  
    12.     include('info.txt');
    13.  
    14. }else{
    15.  
    16.     include($page);
    17.  
    18. }
    19.  
    20.  
    21.  
    22. ?>
     
    #6 AlexandrS, 16 сен 2019
    Последнее редактирование: 16 сен 2019
  7. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    2.700
    Симпатии:
    428
    Как мин. вам нужно проверять существование $_GET['page'], а также значение этого параметра, например проверить существование соотв. ключа в предопределенном ассоциативном массиве.

    И лучше сразу переходите на более современную реализацию единой точки входа: Как сделать единую точку входа с ЧПУ?
    --- Добавлено ---
    Ну дыра же в безопасности! Подредактируй пост, пока не поздно ;)
     
  8. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    661
    Симпатии:
    104
    Адрес:
    Краснодар
    Честно сказать чет я туплю и не вижу, где косяк. Но то что я напортачил с условием, это я вижу, но уже не изменить.

    PS: так что пример выше использовать нельзя он хоть и рабочий, но неверный!
     
  9. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    2.700
    Симпатии:
    428
    --- Добавлено ---
    Или ты специально хотел подсунуть ТСу шел для запуска произвольного php-скрипта, в том числе и из др. каталога? :)
    --- Добавлено ---
    Хотя ТСу не привыкать :D Ты типа сконцентрировался на ответе на осн. вопрос.
     
  10. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    661
    Симпатии:
    104
    Адрес:
    Краснодар
    Я вообще хотел показать, что вероятно он упустил что в $page что-то должно быть, затем решил, что будет неправильно если не укажу список допустимых страниц, дабы указать, что можно обращаться исключительно к этим страницам (те которые в массиве $validPages), но то потом накосяил с условием, а время вышло. Должно было получиться вот так:


    PHP:
    1. <?php
    2.  
    3.  
    4. $requestedPage = (isset($_GET['page'])) ? $_GET['page'] : false;
    5.  
    6. $page = $requestedPage.".php";
    7.  
    8. $validPages = ['search', 'main'];
    9.  
    10.  
    11. if (!empty($page) && file_exists($page) && in_array($requestedPage, $validPages)) {
    12.  
    13.     include($page);
    14.  
    15. }else{
    16.  
    17.     include('info.txt');
    18.  
    19. }
    20.  
    21.  
    22.  
    23. ?>
    --- Добавлено ---
    А касаемо :
    Можно рассказать, как бы там это вышло? Просто практики не так много, а это было бы полезно. Думаю тут такое обсуждать нельзя, но если не сложно в личку. Очень интересно, какой должен быть запрос, чтоб подсунуть шелл?
     
  11. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    2.700
    Симпатии:
    428
    @AlexandrS, шелл ты подсунул в своем посте ;) Использовать («эксплуатировать уязвимость») можно так: /?page=../cron и т.п.

    И лучше все-таки использовать не значения, а ключи массива для идентификации страниц. Значения при этом можно использовать для хранения имен/заголовков страниц (как было в одной из недавних тем, в кот. мы принимали обсуждение), имен файлов-обработчиков (чтобы реализовать соответствие много страниц-один обработчик) и т.п.
    --- Добавлено ---
    P.S. Для быстрого поиска можно использовать array_key_exists или просто isset.
     
    AlexandrS нравится это.
  12. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    661
    Симпатии:
    104
    Адрес:
    Краснодар
    сейчас посмотрел, относительно того что я написал сразу, т.е. по сути в /?page= можно передать путь, а этот путь будет инклудится и исполняться, я верно понял?
     
  13. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    2.700
    Симпатии:
    428
    Да, относительный путь, включая осн. имя файла (т.е. краткое без расширения).
    --- Добавлено ---
    P.S. У ТСа эта дыра изначально присутствует. Но мы же как бы не должны воспроизводить дыры, помогая ему :)
     
    AlexandrS нравится это.
  14. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    7.696
    Симпатии:
    1.492
    basename, и никаких проблем.
    @kretsman, наверняка вместе с виндой поменялась версия php. register_globals опасный флаг был, его правильно выпилили
     
  15. kretsman

    kretsman Новичок

    С нами с:
    7 сен 2018
    Сообщения:
    80
    Симпатии:
    0
    Всё это прекрасно, но делать то что щас с этим кодом?
     
  16. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    7.696
    Симпатии:
    1.492
    @kretsman, если действительно поменялась версия php, то лучше всего просто переписать код, чтоб он не рассчитывал на register_globals, почитайте доку, как работать с get и post
     
  17. kretsman

    kretsman Новичок

    С нами с:
    7 сен 2018
    Сообщения:
    80
    Симпатии:
    0
    спасибо!