Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
Страницы: (2) [1] 2  ( Перейти к первому непрочитанному сообщению )  
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Если не существует такого GET параметра, то перенаправь на 404 страницу
Dno  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 65
Пользователь №: 40467
На форуме: 2 года, 2 месяца, 14 дней
Карма: 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
Warning: include(): Failed opening 'sdasdasd.php' for inclusion (include_path='......../index.php on line 100500....


Пока что подавил ошибку собакой. Как грамотно решить данную проблему? Добавить фильтр разрешенных значений для GET? Если да то как реализовать это?

Спасибо.

Это сообщение отредактировал Dno - 4.11.2014 - 05:52
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
AllesKlar  
[x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3406
Пользователь №: 38635
На форуме: 3 года, 20 дней
Карма: 174




В твоем случае использовать функцию empty можно только для ситуаций, когда имя файла не состоит из одного нуля 0.php
http://de2.php.net/manual/ru/function.empty.php
// $_GET['id'] == '0';
empty($_GET['id']) === true


передача в URL одних пробелов также вызовет ошибку логики
// $_GET['id'] == '    ';
empty($_GET['id']) === false


Для проверки строки лучше использовать isset()
if( isset($_GET['id']) && trim($_GET['id']) != '' )
{
$filename = trim($_GE['id']) . 'php';
}
else
{
$filename = '404.php';
}


Далее проверяем на существование файла и подключаем
if( file_exists ( $filename ) )
{
include $filename;
}
else
{
include '404.php';
}


Помимо этого, неплохо было бы иметь список разрешенных к подключению файлов или путей, ведь include может подключить любой файл, даже за пределами DOCUMENT_ROOT
Ведь GET['id'] может быть и равен '../../../config'

Или же твои подключаемые файлы должны иметь некую часть в именах, которой нет у других файлов.
main.inc.php
contact.inc.php
и тогда
  $filename = trim($_GE['id']) . '.inc.php';


--------------------
[продано копирайтерам]
PMПисьмо на e-mail пользователю
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Dno  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 65
Пользователь №: 40467
На форуме: 2 года, 2 месяца, 14 дней
Карма: 2




AllesKlar, Огромнейшее Спасибо (+ в карму). Проблема решена. user posted image

Это сообщение отредактировал Dno - 4.11.2014 - 09:21
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Dno  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 65
Пользователь №: 40467
На форуме: 2 года, 2 месяца, 14 дней
Карма: 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
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
johniek_comp  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



женат на Node.JS
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2478
Пользователь №: 28490
На форуме: 5 лет, 6 месяцев, 23 дня
Карма: -19

Трезвый :
22 года, 1 день


if( file_exists ( $filename ) )
{
include $filename;
}
else
{
header("Location: 404.php",TRUE,404);
}


надеюсь понял суть. почитай на php.net про функцию header


--------------------
user posted image
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
killer8080  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 8832
Пользователь №: 26630
На форуме: 5 лет, 10 месяцев, 14 дней
Карма: 598




Цитата (Dno @ 4.11.2014 - 04:50)
Динамически получаю контент
$id = empty($_GET['id']) ? 'main' : $_GET['id'];
т.е. если глобальная переменная GET->id пуста, присвой переменной $id значение main, иначе, если не пусто, то переменной $id присвой то, что пришло в глобальную переменную GET->id

Ну и собственно код вывода в index.php
include $id.'.php';

и получаем уязвимость LFI (LOcal File INclude) wink.gif
Нельзя пользовательские данные так подставлять в файловые пути, должен быть жесткий контроль содержимого переменной. Мало ли что там юзер ввел.
Либо делай массив со списком всех допустимых имен файлов, либо регуляркой проверяй соответствие шаблону, плюс наличие файла.

Цитата (johniek_comp @ 4.11.2014 - 11:41)
    header("Location: 404.php",TRUE,404);

так делать нельзя!
404-й статус код нельзя совмещать с редиректом (заголовком Location)
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
johniek_comp  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



женат на Node.JS
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2478
Пользователь №: 28490
На форуме: 5 лет, 6 месяцев, 23 дня
Карма: -19

Трезвый :
22 года, 1 день


killer8080
я хз, тогда 2 заголовка отдельно нужно пустить http 404 и location


--------------------
user posted image
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
killer8080  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 8832
Пользователь №: 26630
На форуме: 5 лет, 10 месяцев, 14 дней
Карма: 598




Цитата (johniek_comp @ 4.11.2014 - 15:49)
killer8080
я хз, тогда 2 заголовка отдельно нужно пустить http 404 и location

так это ничего не меняет smile.gif
Заголовок location применяется совместно со статус кодом редиректа (301, 302, 303, 305, 307)
С кодом 404 браузер его просто проигнорит.
Всё просто, не нужно никаких редиректов, а просто отдавать 404 ошибку smile.gif
PMПисьмо на e-mail пользователю
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Dno  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 65
Пользователь №: 40467
На форуме: 2 года, 2 месяца, 14 дней
Карма: 2




killer8080,
Цитата
Либо делай массив со списком всех допустимых имен файлов, либо регуляркой проверяй соответствие шаблону, плюс наличие файла.


Можно подробней пожалуйста, с кодом ? Как правильно написать массив всех допустимых имен, а потом при передаче Гет проверять по массиву? Как правильно реализовать это?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
johniek_comp  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



женат на Node.JS
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2478
Пользователь №: 28490
На форуме: 5 лет, 6 месяцев, 23 дня
Карма: -19

Трезвый :
22 года, 1 день


killer8080
ты не правильно понял. я имел в виду на странице сделать redirect, а в 404.php отдать код 404


--------------------
user posted image
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Dno  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 65
Пользователь №: 40467
На форуме: 2 года, 2 месяца, 14 дней
Карма: 2




Спасибо пользователю killer8080 за информацию о уязвимости под названием Local File Inclusion.

Почитал в интернете об этом. Вот измененный код:

$file = array('view', 'registration', 'main', 'add');
if (in_array($id, $file) && file_exists("view/$id.php"))
include "view/$id.php";
else
include
"404.php";


Хотелось-бы услышать мнение о коде. Логика правильная?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
killer8080  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 8832
Пользователь №: 26630
На форуме: 5 лет, 10 месяцев, 14 дней
Карма: 598




Цитата (Dno @ 4.11.2014 - 20:36)
Логика правильная?

правильная, но у этого подхода есть свои минусы, если сайт маленький то нет проблем, но если число контроллеров измеряется не одним десятком, то возникают неудобства. При добавлении новых контроллеров нужно ручками добавлять их названия в массив, что не очень удобно. Потому удобней второй вариант.

if (preg_match('#^[a-z\d_]+$#', $id)  && file_exists("view/$id.php"))
include "view/$id.php";
else
include
"404.php";




Спустя 2 минуты, 9 секунд killer8080 написал(а):
Цитата (johniek_comp @ 4.11.2014 - 18:37)
я имел в виду на странице сделать redirect, а в 404.php отдать код 404

только смысл то какой от такого редиректа? Чем плохо сразу отдать 404 ошибку?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
killer8080  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 8832
Пользователь №: 26630
На форуме: 5 лет, 10 месяцев, 14 дней
Карма: 598




Dno
насчет веб безопасности советую заглянуть в этот топик
http://phpforum.su/index.php?showtopic=21213
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Dno  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 65
Пользователь №: 40467
На форуме: 2 года, 2 месяца, 14 дней
Карма: 2




killer8080, Спасибо.

По возможности пытаюсь не использовать "регулярные выражения".

А как написать код, что-бы при else не инклюдила 404.php, а чтоб сервер присылал 404 ответ.

$file = array('view', 'registration', 'main', 'add');
if (in_array($id, $file) && file_exists("view/$id.php"))
include "view/$id.php";
else
header("HTTP/1.1 404 Not Found");


Понятно что сверху код не рабочий, ведь он уже послал заголовки в начале файла. А как правильно написать код? Или проверку надо делать в самом начале файла? Ну т.е. если в массиве нету такого значения пошли 404 ответ.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
killer8080  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 8832
Пользователь №: 26630
На форуме: 5 лет, 10 месяцев, 14 дней
Карма: 598




Цитата (Dno @ 4.11.2014 - 21:03)
Понятно что сверху код не рабочий, ведь он уже послал заголовки в начале файла

Где? В этих пяти строчках я не узрел других заголовков smile.gif
Цитата (Dno @ 4.11.2014 - 21:03)
А как написать код, что-бы при else не инклюдила 404.php, а чтоб сервер присылал 404 ответ.

ну помимо заголовка нужна ещё и сама страница, которую увидит пользователь. Удобней её вынести в отдельный файл, и там же заголовок формировать.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темыСтраницы: (2) [1] 2  Ответ в темуСоздание новой темыСоздание опроса