[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Курсы PHP. Статичecкие страницы
oleg_n
Приветствую.
Пытался найти нужную тему, но ничего подобного не нашел, поэтому создал новую.
Теперь собственно вопрос.
В 4 шаге для вывода содержимого статических страниц, используется переменная $page_content, которая потом выводится в show.tpl
 $page_content = file_get_contents('./setup/'. $GET['id'] .'.txt');

Но беда в том, что при выводе содержимого файла, созданного через редактор статических страниц , не соблюдается разметка HTML, т.е. все тэги выводятся как как обычный текст. :(

Вот так это выглядит в самом файле:
<p>Привет всем :)</p><p><strong>Автор</strong></p& ;gt;
А так на странице:
<p>Привет всем :)</p><p><strong>Автор</strong></p>


А если в файле поменять &lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt; &lt;/strong&gt;&lt;/p&gt; на соответствующие им теги HTML
<p> </p><p><strong> </strong></p>
, то все становится на свои места, то есть разметка учитывается при формировании страницы!
Подскажите пожалуйста, где нужно искать ошибку? Теоретически, я понимаю, что нужно копать в редакторе, но где конкретно, я не знаю :(
Заранее благодарен.



Спустя 6 минут, 23 секунды (3.08.2012 - 10:54) Игорь_Vasinsky написал(а):
как данные обрабатываются перед записью в файл?
убери htmlspecialchars()


Спустя 14 минут, 15 секунд (3.08.2012 - 11:08) oleg_n написал(а):
Игорь_Vasinsky В том то и дело, что из текстового поля, данные $POST['value2'], просто записываются в файл. Процедуре htmlspecialchars(), подвергается только ссылка на файл $POST['value1']
if($ok && $POST['value1']) 
{

$links[$GET['num']][1] = htmlspecialchars($POST['value1']);

file_put_contents(IRB_ROOT .'setup/menu.txt', serialize($links));
file_put_contents(IRB_ROOT .'setup/'. $GET['id'] .'.txt', $POST['value2']);

reDirect();

}

Спустя 3 минуты, 22 секунды (3.08.2012 - 11:11) oleg_n написал(а):
Кстати, было бы неплохо и содержимое файла прогонять через htmlspecialchars(), на всякий случай, вдруг кто-то добрый захочет чего-то подпихнуть вместо текста biggrin.gif Я так думаю! rolleyes.gif

Спустя 23 минуты, 18 секунд (3.08.2012 - 11:35) killer8080 написал(а):
$page_content = file_get_contents('./setup/'. $GET['id'] .'.txt');

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

Спустя 7 минут, 12 секунд (3.08.2012 - 11:42) Hello написал(а):
Цитата (killer8080 @ 3.08.2012 - 13:35)
$page_content = file_get_contents('./setup/'. $GET['id'] .'.txt');

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

null байт поможет тырить любые файлы

Спустя 3 минуты, 53 секунды (3.08.2012 - 11:46) killer8080 написал(а):
Цитата (Hello @ 3.08.2012 - 12:42)
null байт поможет тырить любые файлы


покажи пример smile.gif

Спустя 26 секунд (3.08.2012 - 11:46) oleg_n написал(а):
killer8080, Hello А по сути вопроса, есть что сказать? rolleyes.gif

Спустя 2 минуты, 25 секунд (3.08.2012 - 11:49) killer8080 написал(а):
Цитата (oleg_n @ 3.08.2012 - 12:46)
killer8080, Hello А по сути вопроса, есть что сказать?

По сути вопроса, пользователь не должен иметь возможности вводить теги. Если нужна возможность форматирования, используй bb коды.

Спустя 50 секунд (3.08.2012 - 11:50) killer8080 написал(а):
oleg_n
а что уязвимость в скрипте для тебя пустяк?! smile.gif

Спустя 7 минут, 3 секунды (3.08.2012 - 11:57) killer8080 написал(а):
Цитата (Hello @ 3.08.2012 - 12:42)
null байт поможет тырить любые файлы


Да ты прав, так и есть. Уязвимость критичекая. Надо Николаю багрепорт послать smile.gif

Спустя 5 минут, 23 секунды (3.08.2012 - 12:02) oleg_n написал(а):
Цитата (killer8080 @ 3.08.2012 - 12:49)


По сути вопроса, пользователь не должен иметь возможности вводить теги. Если нужна возможность форматирования, используй bb коды.

Для редактирования страниц, используется WYSIWYG-редактор, который и занимается подставлением тегов. Беда как раз где-то в настройках этого редактора.

Цитата

а что уязвимость в скрипте для тебя пустяк?!

Это конечно же дыра, и её нужно латать! Но это две разные проблемы, решение которых может идти параллельно biggrin.gif

Спустя 7 минут, 17 секунд (3.08.2012 - 12:09) killer8080 написал(а):
Цитата (oleg_n @ 3.08.2012 - 13:02)
Для редактирования страниц, используется WYSIWYG-редактор, который и занимается подставлением тегов. Беда как раз где-то в настройках этого редактора.

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

Спустя 41 минута, 29 секунд (3.08.2012 - 12:51) oleg_n написал(а):
Цитата (killer8080 @ 3.08.2012 - 13:09)
Цитата (oleg_n @ 3.08.2012 - 13:02)
Для редактирования страниц, используется WYSIWYG-редактор, который и занимается подставлением тегов. Беда как раз где-то в настройках этого редактора.

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

Мы с Вами говорим про "теплое" или "мягкое" rolleyes.gif
1. Этот редактор недоступен обычному юзеру из сети, а только лишь админу сайта и лицам к нему приближенным. Соответственно им не нужно ломать сайт, а только лишь добавлять страницы. Если страница отображается не так, как это было создано - это беда, которую нужно решить sad.gif
2. Если какому хацкеру удалось добраться до такого редактора через админ-панель, то соответственно он уже имеет контроль над всем сайтом ph34r.gif
3. Для обычных юзеров есть окошко с ББ-кодами cool.gif

Спустя 8 минут, 24 секунды (3.08.2012 - 12:59) killer8080 написал(а):
Цитата (oleg_n @ 3.08.2012 - 13:51)
1. Этот редактор недоступен обычному юзеру из сети, а только лишь админу сайта и лицам к нему приближенным. Соответственно им не нужно ломать сайт, а только лишь добавлять страницы. Если страница отображается не так, как это было создано - это беда, которую нужно решить


Я не увидел в твоем коде защиты от CSRF, значит потенциально запрос может выполнить кто угодно.
Второе
file_put_contents(IRB_ROOT .'setup/'. $GET['id'] .'.txt', $POST['value2']); 

эта дыра еще похлеще предыдущей. Использую её и CSRF можно запросто залить шел на твой хост.

Спустя 27 минут, 21 секунда (3.08.2012 - 13:26) oleg_n написал(а):
killer8080 Что касается защиты от CSRF - достаточно ли будет поменять метод передачи с GET на POST и при этом id привести к обязательному числовому значению в пределах используемого диапазона чисел?

Спустя 6 минут, 35 секунд (3.08.2012 - 13:33) Игорь_Vasinsky написал(а):
Цитата
при этом id привести к обязательному числовому значению в пределах используемого диапазона чисел?

достаточно (int)$_GET['id']

а так - запретить прямой доступ к папке и файлам.

Спустя 37 минут, 27 секунд (3.08.2012 - 14:11) killer8080 написал(а):
Цитата (oleg_n @ 3.08.2012 - 14:26)
и при этом id привести к обязательному числовому значению в пределах используемого диапазона чисел?

если id - это всегда целое число, то это сделать нужно в обязательном порядке, выше Игорь уже ответил.

Цитата (oleg_n @ 3.08.2012 - 14:26)
killer8080 Что касается защиты от CSRF - достаточно ли будет поменять метод передачи с GET на POST ..

нет, недостаточно , он там и так пост
file_put_contents(IRB_ROOT .'setup/'. $GET['id'] .'.txt', $POST['value2']);

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

PS кстати уязвимость с нул байтами работает к счастью не везде. На денвере с php 5.2 работает, а на дебиане с php5.3.3 нет. Но тем не менее это нужно иметь ввиду.

Спустя 5 минут, 38 секунд (3.08.2012 - 14:16) oleg_n написал(а):
Цитата (killer8080 @ 3.08.2012 - 15:11)

PS кстати уязвимость с нул байтами работает к счастью не везде. На денвере с php 5.2 работает, а на дебиане с php5.3.3 нет. Но тем не менее это нужно иметь ввиду.

Раскажите плз поподробней о null-уязвимости rolleyes.gif Можно и в ПМ smile.gif

П.С. Про защиту от CSRF прочитал в сети, там тоже настоятельно рекомендуют использовать уникальный идентификатор.

Спустя 9 минут, 52 секунды (3.08.2012 - 14:26) killer8080 написал(а):
Цитата (oleg_n @ 3.08.2012 - 15:16)
Раскажите плз поподробней о null-уязвимостиМожно и в ПМ

Зачем же в пм, об этом все должны знать, особенно новички. :)
В твоем примере
$page_content = file_get_contents('./setup/'. $GET['id'] .'.txt');

эксплоит может выглядеть так
http://site.ru/index.php?id=./../index.php%00
Если версия пыхи дырявая, то открыв исходный код в браузере, в том месте где должен был быть контент, увидишь исходник файла index.php. Таким образом можно получить содержимое любого файла, в том числе ./htpasswd (если используется базовая http аутентификация на уровне апача), или получить логин/пароль к базе из файла конфига (у некоторых хостеров этого достаточно чтоб получить доступ к PMA). В общем можно много чего нехорошего сделать с сайтом :)

Спустя 10 минут, 1 секунда (3.08.2012 - 14:36) oleg_n написал(а):
Цитата (killer8080 @ 3.08.2012 - 15:26)

Зачем же в пм, об этом все должны знать, особенно новички. smile.gif

Спасибо smile.gif То есть (int)$_GET['id'] решает эту проблему целиком smile.gif

===============

Эх, ещё бы кто подсказал, как заставить стат. странички корректно отображаться rolleyes.gif

Спустя 50 секунд (3.08.2012 - 14:37) killer8080 написал(а):
oleg_n
вот еще статейка на эту тему
http://php5.kiev.ua/manual/ru/security.fil....nullbytes.html

Спустя 1 минута, 37 секунд (3.08.2012 - 14:38) killer8080 написал(а):
Цитата (oleg_n @ 3.08.2012 - 15:36)
Эх, ещё бы кто подсказал, как заставить стат. странички корректно отображаться

если нужно чтоб html в чистом виде вводился через админку, просто выкинь htmlspecialchars, в чем собственно проблема?

Спустя 31 минута, 58 секунд (3.08.2012 - 15:10) oleg_n написал(а):
Цитата (killer8080 @ 3.08.2012 - 15:38)
Цитата (oleg_n @ 3.08.2012 - 15:36)
Эх, ещё бы кто подсказал, как заставить стат. странички корректно отображаться

если нужно чтоб html в чистом виде вводился через админку, просто выкинь htmlspecialchars, в чем собственно проблема?

Так в том то и дело, что htmlspecialchars не применяется sad.gif Либо я туплю и не вижу где это происходит blink.gif

Спустя 18 минут, 11 секунд (3.08.2012 - 15:29) killer8080 написал(а):
oleg_n
может у тебя где то суперглобальные массивы фильтруются через htmlspecialchars?

Спустя 38 минут, 5 секунд (3.08.2012 - 16:07) oleg_n написал(а):
Цитата (killer8080 @ 3.08.2012 - 16:29)
oleg_n
может у тебя где то суперглобальные массивы фильтруются через htmlspecialchars?

Таки ДА, есть такое дело:
$POST = htmlChars($POST); 

Где htmlChars функция, объявленная ранее.
function htmlChars($data)    
{
if(is_array($data))
$data = array_map("htmlChars", $data);
else
$data = htmlspecialchars($data);

return $data;
}


Теперь вопрос в другом, как это более корректно обойти. Но этот вопрос скорее к Николаю ака Twin :D

Спустя 2 минуты, 27 секунд (3.08.2012 - 16:09) inpost написал(а):
oleg_n
Не надо обработку ПОСТ данных - убери эту обработку в нужном тебе месте.

Спустя 3 дня, 22 часа, 4 минуты, 59 секунд (7.08.2012 - 14:14) oleg_n написал(а):
С обработкой ПОСТ данных разобрался, у меня вызов функции $POST = htmlChars($POST); был не там где надо rolleyes.gif

Спустя 18 минут, 10 секунд (7.08.2012 - 14:32) oleg_n написал(а):
А вот с $_GET['id'] просто так бороться не получается, id может быть как числовым, так и буквенным unsure.gif То есть (int)$_GET['id'] не решает эту проблему.
Попробовал побороть это с помощью функции ereg_replace(), но браузер ругается Function ereg_replace() is deprecated mad.gif Подскажите плиз, как её корректно можно заменить. rolleyes.gif
П.С. Хотел заменить функцию ereg_replace(), функцией рreg_replace() с такими же параметрами, но она не работает sad.gif

Спустя 1 час, 25 минут, 58 секунд (7.08.2012 - 15:58) killer8080 написал(а):
oleg_n
используй preg_match() для контроля на допустимые символы.

Спустя 1 минута, 25 секунд (7.08.2012 - 16:00) oleg_n написал(а):
Цитата (oleg_n @ 7.08.2012 - 15:32)

П.С. Хотел заменить функцию ereg_replace(), функцией рreg_replace() с такими же параметрами, но она не работает  :(

В записи вида:
$GET[$key]=еreg_replace ("[^a-zA-Z0-9]","",$GET[$key]);

Все работает четко, но ругается браузер.
А вот запись вида:
$GET[$key]=preg_replace ("[^a-zA-Z0-9]","",$GET[$key]);

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

2 killer8080 А формат записи у preg_match(), такой же как и у ereg_replace()?

Спустя 2 минуты, 59 секунд (7.08.2012 - 16:03) killer8080 написал(а):

Спустя 3 минуты, 55 секунд (7.08.2012 - 16:07) oleg_n написал(а):
Цитата (killer8080 @ 7.08.2012 - 17:03)
http://www.php.net/manual/ru/function.preg-match.php

Спасибо конечно, но я там не нашел ничего нужного мне sad.gif Либо не так смотрел.
Нужно из строки убрать все лишнее, кроме букв и цифр, а preg-match выполняет проверку на соответствие регулярному выражению и подсчитывает количество совпадений sad.gif

Спустя 6 минут, 19 секунд (7.08.2012 - 16:13) killer8080 написал(а):
Цитата
Нужно из строки убрать все лишнее, кроме букв и цифр, а preg-match выполняет проверку на соответствие регулярному выражению и подсчитывает количество совпадений

Зачем тебе из строки что то убирать? Если юзер зашел по ссылке, ничего некорректного там не будет. Если там появились левые символы, значит кто то пытается ломать сайт, собственно для этого и делается проверка. В этом случае можно выкинуть страницу с предупреждением, чтоб больше так не делал smile.gif

Спустя 5 минут, 48 секунд (7.08.2012 - 16:19) oleg_n написал(а):
Цитата (killer8080 @ 7.08.2012 - 17:13)
Зачем тебе из строки что то убирать? Если юзер зашел по ссылке, ничего некорректного там не будет. Если там появились левые символы, значит кто то пытается ломать сайт, собственно для этого и делается проверка. В этом случае можно выкинуть страницу с предупреждением, чтоб больше так не делал smile.gif

Согласен.
А можно с примером использования? rolleyes.gif А то я пока не могу самостоятельно вкурить все это, только на примерах biggrin.gif

Спустя 3 минуты, 13 секунд (7.08.2012 - 16:22) killer8080 написал(а):
if(!preg_match('#^[a-z\d-]+$#i', $_GET['id'])){
die(file_get_contents('hackattempt.html'));
}

Спустя 6 минут, 22 секунды (7.08.2012 - 16:28) oleg_n написал(а):
Цитата (killer8080 @ 7.08.2012 - 17:22)
if(!preg_match('#^[a-z\d-]+$#i', $_GET['id'])){
die(file_get_contents('hackattempt.html'));
}

А если ещё нужно исключить и цифры, тогда запись будет вида:
if(!preg_match('#^[a-z0-9\d-]+$#i', $_GET['id'])){
die(file_get_contents('hackattempt.html'));
}

Правильно?

Спустя 1 минута, 20 секунд (7.08.2012 - 16:30) killer8080 написал(а):
\d эквивалент 0-9

Спустя 11 минут, 46 секунд (7.08.2012 - 16:41) oleg_n написал(а):
Цитата (killer8080 @ 7.08.2012 - 17:30)
\d эквивалент 0-9

Век живи, век учись biggrin.gif biggrin.gif biggrin.gif

Спустя 21 час, 3 минуты, 58 секунд (8.08.2012 - 13:45) oleg_n написал(а):
Поскольку всякие гадости могут писать не только в $_GET['id'], то я создал функцию:

/** * Защита от CSRF атаки */
function antiCSRF ()
{
global $GET;
foreach ($GET as $key => $value)
{
if(!preg_match('#^[a-z\d-]+$#i', $GET[$key])){
die(file_get_contents(IRB_HOST.'404.html'));
}
}

return $GET ;
}

И теперь вызываю её везде, где есть обращение к $GET[] :)

Спустя 4 минуты, 14 секунд (8.08.2012 - 13:50) Игорь_Vasinsky написал(а):
Цитата
global $GET;

и всётаки заглобалил СУПЕР глобальный массив biggrin.gif

вообще работает хоть?

Спустя 33 минуты, 19 секунд (8.08.2012 - 14:23) oleg_n написал(а):
Цитата (Игорь_Vasinsky @ 8.08.2012 - 14:50)
Цитата
global $GET;

и всётаки заглобалил СУПЕР глобальный массив biggrin.gif

вообще работает хоть?

Игорь, найдите отличие $GET от $_GET biggrin.gif biggrin.gif biggrin.gif
Работает cool.gif

Спустя 56 секунд (8.08.2012 - 14:24) Игорь_Vasinsky написал(а):
а..этож ирбис.. опять на д.Колину ловушку попался laugh.gif 2:0

Спустя 6 часов, 46 минут, 26 секунд (8.08.2012 - 21:10) killer8080 написал(а):
Цитата (oleg_n @ 8.08.2012 - 14:45)
Поскольку всякие гадости могут писать не только в $_GET['id'], то я создал функцию:

/** * Защита от CSRF атаки */
function antiCSRF ()


А причем здесь CSRF? blink.gif

Спустя 11 часов, 58 минут, 46 секунд (9.08.2012 - 09:09) oleg_n написал(а):
Цитата (killer8080 @ 8.08.2012 - 22:10)

А причем здесь CSRF? blink.gif

Это я немного протупил biggrin.gif Конечно же ни при чем, нужно было назвать как то типа - antiNull rolleyes.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.