@Fell-x27, ничего подобного, я всё правильно сделал, и несколько раз на этом сакцентировал внимание в постах: basename() всё лишнее отрежет. Или хочешь сказать, что можно его обмануть?
А, ок, проморгал. Но вообще, если не выставлена setlocale(), там можно через кодировку, потенциально, намутить всякого. Но это будет больше похоже на нейрохирургию с закрытыми глазами со стороны злоумышленника. Если, конечно, он не знает архитектуру твоего проекта.
@Fell-x27 Честно парни вы меня запутали, мне бы правильное решение сделать) Буду благодарен) Если ваш приведенный пример, очень хорош, то можно и его использовать.
А вот ты разберись, что в нем происходит, и сделай для себя вывод, хорош или нет. Никогда не используй копипасту из интернета, не разобравшись.
Передавай различные значения в switch а через case обрабатывай их. Че сложного то? Или я чет не правильно понял? --- Добавлено --- Передавай различные значения в switch а через case обрабатывай их. Че сложного то? Или я чет не правильно понял?
@ArsNet Нет ты не понял, в switch я указываю путь к файлу, и значения записываю в case например: case 'loader': /*путь*/ break;
Люди, ну роутер на switch - это очень плохо. @_ne_scaju_, вот тебе ещё один способ убрать switch, на этот раз даже у @Fell-x27 не возникнет вопросов по безопасности (хотя и в прошлый раз, если бы @Fell-x27 сразу заметил basename, у него бы вопросов не возникло), и никакая слепая игра с кодировками не поможет взломать. И даже в чём-то более гибкий: 1. Делаешь файлик типо config.routes.php, в нём: Код (PHP): $routes = [ "login" => "/system/modules/login.php", "logout" => "/system/modules/logout.php" // и т.д., сколько тебе нужно ]; И сам роутер: PHP: require_once(__DIR__ . "/config.routes.php"); $go = isset($_GET["go"]) ? $_GET["go"]: false; if (!empty($go) && isset($routes[$go])) { include __DIR__ . $routes[$go]; } else { // дефолтное поведение } Мне так меньше нравится, поскольку, избавившись от проблем безопасности, мы получили необходимость добавлять руками элементы в массив $routes, но, с другой стороны, гибкость в том, что бы теперь можем целевые файлы держать где угодно, а не только в system/modules, ну и всё равно - при добавлении новой фитчи мы модифицируем конфиг, и не трогаем сам роутер. switch-ей и if-ов в программе должно быть как можно меньше, поскольку они затрудняют чтение кода. Совсем без них не обойтись, но если возможно - лучше писать что-то другое. Опять же, строчек в этом решении меньше, масштабируемость лучше.
@mkramer Ой спасибочки, благодарочка, за такой хороший ответ. Вот теперь я понял, например чтобы добиться перехода на определенный скрипт нужно в роутере указать все скрипты куда, можно переключатся. PHP: "login" => "/system/modules/login.php", "logout" => "/system/modules/logout.php" /*И т. д.*/ Подставлять именно "login" "logout" вот эту часть, в ссылки и т. д. Правильно ли я понял? Ну ссылка будет выглядеть как то так: ?go=login без .php??? И вопрос номер 2: Этот роутер и подключения скриптов это 2 файла???
Ну да, этот роутинг железобетонный. А еще застраховались от атаки, которая может, таки пробить и твой предыдущий пример. Допустим, через уязвимость в аплоаде кто-то умудрился пропихнуть тебе шелл в каталог, откуда идут инклуды. Basename тут не спасет. А роутер с вайтлистом спасет. --- Добавлено --- Вложенные тернрарные операторы!11 Шучу. Хотя, порой, и такое решение в кассу заходит.
Без php, да. В go ключик от массива надо передавать, ясно же Ну только перед ?go=login надо указать имя файла с роутером, если это не index.php Я же написал, список скриптов и их ключей я вынес в отдельный файл, config.routes.php, чтоб менять его, но не менять файл с роутером для добавления новых маршрутов. Можно было и в одном файле, но мне так больше нравится, конфиги - отдельно, работа - отдельно. --- Добавлено --- Чтобы что-то туда пропихнуть, поскольку аплоады никто по умолчанию в этот каталог не будет делать, надо не просто шелл закачать мне, а ещё его и исполнить. А если у меня папка аплоадов не защищена от исполнения скриптов, то нафига злоумышленнику что-то куда-то переписывать? Он его выполнит прямо из каталога для аплоадов, и возьмёт всё, что ему нужно. Или запишет вредоносный код мне прямо в index.php
Совершенно верно, но тем не менее, папка апплоада может быть и закрыта, а системная нет. Чисто вот в сферическом вакууме - вероятность проблемы есть. Ну и мб просто я параноик, что уж там.
@Fell-x27 @mkramer Спасибо, я сейчас буду проводить эксперимент со скриптом) а куда делась функция basename из скрипта? Подскажите куда лучше эти файлы поместить в папку system или уже в system/modules???
А во втором варианте он не нужен, если туда какую-нибудь хрень типа ../../../etc передать, он просто её не найдёт в массиве, и сделает дефолтное поведение. basename нужен только в первом варианте скрипта, как подстраховка от таких случаев. А вообще, чувак, серьёзно, ни в первом, ни во втором случае не написано ничего сверхсложного, в чём нельзя разобраться самому (при условии, что знаешь основы синтаксиса php).....
@mkramer Понятно, а как же по поводу, куда правильно скрипты положить, если я правильно понял то рядом с папкой modules? А если я ту функцию оставлю? то что будет мешать чему либо? Не получается указать ссылку для перехода по скриптам, что ж не так. Может подскажешь как теперь с этого скрипта указывать, правильный путь? HTML: <li><a href="/system/modules/login.php?go=login" title="Войти">Войти </a></li> Вот так указываю он переходит, но хотелось бы без полного пути)
@_ne_scaju_, ёлки, ну ты такие глупые вопросы задаёшь, будто вообще ни слова ни из кода ни из сообщений не понял. Зачем тебе ссылку ставить на login.php ? Ты можешь роутер разместить прямо в index.php в корне --- Добавлено --- Мы зачем всё это дело городили - чтоб тебе не приходилось писать полный путь к login. Он уже есть в массиве $routes. Включай голову Или поспи, и перечитай весь тред на свежую голову.
@mkramer Хорошая мысль глаза уже болят, от нарезки лука))) Смотри я в индекс пишу путь ко шаблону всему и к самому роутеру. PHP: <?php include($_SERVER['DOCUMENT_ROOT'].'/templates/default/header.php'); include($_SERVER['DOCUMENT_ROOT'].'/templates/default/menu.php'); include($_SERVER['DOCUMENT_ROOT'].'/templates/default/content.php'); /*Подключаем роутер*/ include($_SERVER['DOCUMENT_ROOT'].'/system/config.routes.php'); include($_SERVER['DOCUMENT_ROOT'].'/templates/default/footer.php'); ?> Но когда я хочу создать ссылку ну нефига не переходит как хочется( Уже пробовал по разному подставить данные для перехода( Что вы имели в веду? только перед ?go=login надо указать имя файла с роутером
Ну так я не знаю, где у тебя роутер, он не обязательно в файле index.php может быть. И если ты подключаешь именно, как сейчас нарисовал, то конечно не переходит - ты же конфиг подключаешь после роутера. У тебя вообще по ходу каша жуткая. Если в index.php роутер, то всё остальное из него нафиг убираешь, для шаблона главной делаешь какой-нибудь home.php. Ну и думай головой, как можно сначала подключить код, использующий массив, а потом - код, его инициализирующий? Я тебе разве так написал? Программа выполняется сверху вниз, если что Потому что не просто копипастить надо чужой код, а разобрать, что каждая строчка делает, посмотреть в доках незнакомые функции и т.п. А ты пробуешь подставлять туда-сюда, вместо того, чтобы подумать --- Добавлено --- Логику своей программы сначала словами надо написать Куда хочешь
@mkramer Из всех слов я понял, что в файле index.php нельзя указывать роутер, а надо еще создать файл home.php не знаю для чего. А на счет каши в голове, это правда. Короче создал 2 файла как вы написали, в файле router.php указал все пути которые использоваться будут. Файл index.php это как бы главная страница сайта, я там просто указываю шаблон который разделен по файлам. И думал если я укажу путь к роутеру в индексе я смогу ссылку просто указать go=login или так router[go]=login короче как то так.
@mkramer Вы мне намекните не много прямо, я лучше понимаю. Я же не професионал сейчас в php. Мне еще учится и учится. Не сдавайся пожалуйста не все ж так плохо.( Ты мне прямей напиши пожалуйста.
Я уже указал. конфиг надо включать раньше кода роутера. Чувак, ну разбери ты мой код сначала. Вот возьми ниже, напиши по-русски, как мой код работает, по шагам. Потом как твой код. Причём здесь профессионал-непрофессионал в php. 4 строчки разобрать - не нужен большой уровень.