
![]() |
Здравствуйте Гость ( Вход | Регистрация ) |
|
|
|
![]() ![]() ![]() |
![]() |
۩
Дата
|
![]() ![]() Пользователь ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 65 Пользователь №: 40467 На форуме: Карма: 2 ![]() |
Здравствуйте.
Динамически получаю контент $id = empty($_GET['id']) ? 'main' : $_GET['id']; т.е. если глобальная переменная GET->id пуста, присвой переменной $id значение main, иначе, если не пусто, то переменной $id присвой то, что пришло в глобальную переменную GET->id Ну и собственно код вывода в index.php include $id.'.php'; На сервере есть файлы php для вывода (main.php, contact.php и т.д). Но если передать глобальной переменной значение, несуществующего файла то выводиться ошибка: Warning: include(sdasdasd.php): in /home/httpd/vhosts/.........../index.php Пока что подавил ошибку собакой. Как грамотно решить данную проблему? Добавить фильтр разрешенных значений для GET? Если да то как реализовать это? Спасибо. Это сообщение отредактировал Dno - 4.11.2014 - 05:52 |
![]() |
[x]
Дата
|
![]() ![]() Здесь живет ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 4155 Пользователь №: 38635 На форуме: Карма: 223 ![]() |
В твоем случае использовать функцию empty можно только для ситуаций, когда имя файла не состоит из одного нуля 0.php
http://de2.php.net/manual/ru/function.empty.php // $_GET['id'] == '0'; передача в URL одних пробелов также вызовет ошибку логики // $_GET['id'] == ' '; Для проверки строки лучше использовать isset() if( isset($_GET['id']) && trim($_GET['id']) != '' ) Далее проверяем на существование файла и подключаем if( file_exists ( $filename ) ) Помимо этого, неплохо было бы иметь список разрешенных к подключению файлов или путей, ведь include может подключить любой файл, даже за пределами DOCUMENT_ROOT Ведь GET['id'] может быть и равен '../../../config' Или же твои подключаемые файлы должны иметь некую часть в именах, которой нет у других файлов. main.inc.php contact.inc.php и тогда $filename = trim($_GE['id']) . '.inc.php'; -------------------- [продано копирайтерам]
|
![]() |
۩
Дата
|
![]() ![]() Пользователь ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 65 Пользователь №: 40467 На форуме: Карма: 2 ![]() |
AllesKlar, Огромнейшее Спасибо (+ в карму). Проблема решена.
![]() Это сообщение отредактировал Dno - 4.11.2014 - 09:21 |
![]() |
۩
Дата
|
![]() ![]() Пользователь ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 65 Пользователь №: 40467 На форуме: Карма: 2 ![]() |
А вот еще вопрос Уважаемые знатоки.
Вот теперь у меня, если передан GET->id с названием несуществующего файла на сервере, то include-ится 404.php в index.php, в блок контента. А что делать в случае, если от сервера пришел ответ 404? На данный момент в .htaccess прописано ErrorDocument 404 /404.php То есть, если от сервера пришел ответ 404, клиенту выводиться 404.php, а он у меня без подключенных стилей и т.п. Кусочек кода, который надо в ставить в блок html, для вывода. Собственно вопрос состоит в том, как по средствам PHP написать: Если (Ответ сервера == 404) include 404.php Спасибо. Это сообщение отредактировал Dno - 4.11.2014 - 09:18 |
![]() |
|
![]() ![]() женат на Node.JS ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 2480 Пользователь №: 28490 На форуме: Карма: -19 Трезвый : 30 лет, 6 месяцев, 2 дня ![]() |
if( file_exists ( $filename ) ) надеюсь понял суть. почитай на php.net про функцию header -------------------- ![]() |
![]() |
|||||
![]() ![]() Здесь живет ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Эксперт ![]() Сообщений: 9631 Пользователь №: 26630 На форуме: Карма: 664 ![]() |
и получаем уязвимость LFI (LOcal File INclude) ![]() Нельзя пользовательские данные так подставлять в файловые пути, должен быть жесткий контроль содержимого переменной. Мало ли что там юзер ввел. Либо делай массив со списком всех допустимых имен файлов, либо регуляркой проверяй соответствие шаблону, плюс наличие файла.
так делать нельзя! 404-й статус код нельзя совмещать с редиректом (заголовком Location) |
||||
![]() |
|
![]() ![]() женат на Node.JS ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 2480 Пользователь №: 28490 На форуме: Карма: -19 Трезвый : 30 лет, 6 месяцев, 2 дня ![]() |
killer8080
я хз, тогда 2 заголовка отдельно нужно пустить http 404 и location -------------------- ![]() |
![]() |
|||
![]() ![]() Здесь живет ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Эксперт ![]() Сообщений: 9631 Пользователь №: 26630 На форуме: Карма: 664 ![]() |
так это ничего не меняет ![]() Заголовок location применяется совместно со статус кодом редиректа (301, 302, 303, 305, 307) С кодом 404 браузер его просто проигнорит. Всё просто, не нужно никаких редиректов, а просто отдавать 404 ошибку ![]() |
||
![]() |
۩
Дата
|
||
![]() ![]() Пользователь ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 65 Пользователь №: 40467 На форуме: Карма: 2 ![]() |
killer8080,
Можно подробней пожалуйста, с кодом ? Как правильно написать массив всех допустимых имен, а потом при передаче Гет проверять по массиву? Как правильно реализовать это? |
||
![]() |
|
![]() ![]() женат на Node.JS ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 2480 Пользователь №: 28490 На форуме: Карма: -19 Трезвый : 30 лет, 6 месяцев, 2 дня ![]() |
killer8080
ты не правильно понял. я имел в виду на странице сделать redirect, а в 404.php отдать код 404 -------------------- ![]() |
![]() |
۩
Дата
|
![]() ![]() Пользователь ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 65 Пользователь №: 40467 На форуме: Карма: 2 ![]() |
Спасибо пользователю killer8080 за информацию о уязвимости под названием Local File Inclusion.
Почитал в интернете об этом. Вот измененный код: $file = array('view', 'registration', 'main', 'add'); Хотелось-бы услышать мнение о коде. Логика правильная? |
![]() |
|||||
![]() ![]() Здесь живет ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Эксперт ![]() Сообщений: 9631 Пользователь №: 26630 На форуме: Карма: 664 ![]() |
правильная, но у этого подхода есть свои минусы, если сайт маленький то нет проблем, но если число контроллеров измеряется не одним десятком, то возникают неудобства. При добавлении новых контроллеров нужно ручками добавлять их названия в массив, что не очень удобно. Потому удобней второй вариант. if (preg_match('#^[a-z\d_]+$#', $id) && file_exists("view/$id.php")) Спустя 2 минуты, 9 секунд killer8080 написал(а):
только смысл то какой от такого редиректа? Чем плохо сразу отдать 404 ошибку? |
||||
![]() |
|
![]() ![]() Здесь живет ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Эксперт ![]() Сообщений: 9631 Пользователь №: 26630 На форуме: Карма: 664 ![]() |
Dno
насчет веб безопасности советую заглянуть в этот топик http://phpforum.su/index.php?showtopic=21213 |
![]() |
۩
Дата
|
![]() ![]() Пользователь ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 65 Пользователь №: 40467 На форуме: Карма: 2 ![]() |
killer8080, Спасибо.
По возможности пытаюсь не использовать "регулярные выражения". А как написать код, что-бы при else не инклюдила 404.php, а чтоб сервер присылал 404 ответ. $file = array('view', 'registration', 'main', 'add'); Понятно что сверху код не рабочий, ведь он уже послал заголовки в начале файла. А как правильно написать код? Или проверку надо делать в самом начале файла? Ну т.е. если в массиве нету такого значения пошли 404 ответ. |
![]() |
|||||
![]() ![]() Здесь живет ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Эксперт ![]() Сообщений: 9631 Пользователь №: 26630 На форуме: Карма: 664 ![]() |
Где? В этих пяти строчках я не узрел других заголовков ![]()
ну помимо заголовка нужна ещё и сама страница, которую увидит пользователь. Удобней её вынести в отдельный файл, и там же заголовок формировать. |
||||
![]() |
![]() ![]() ![]() |