Пытался найти нужную тему, но ничего подобного не нашел, поэтому создал новую.
Теперь собственно вопрос.
В 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>
А если в файле поменять <p> </p><p><strong> </strong></p> на соответствующие им теги HTML
<p> </p><p><strong> </strong></p>
, то все становится на свои места, то есть разметка учитывается при формировании страницы! Подскажите пожалуйста, где нужно искать ошибку? Теоретически, я понимаю, что нужно копать в редакторе, но где конкретно, я не знаю :(
Заранее благодарен.
Спустя 6 минут, 23 секунды (3.08.2012 - 10:54) Игорь_Vasinsky написал(а):
как данные обрабатываются перед записью в файл?
убери htmlspecialchars()
убери 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(), на всякий случай, вдруг кто-то добрый захочет чего-то подпихнуть вместо текста Я так думаю!
Спустя 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 байт поможет тырить любые файлы |
покажи пример
Спустя 26 секунд (3.08.2012 - 11:46) oleg_n написал(а):
killer8080, Hello А по сути вопроса, есть что сказать?
Спустя 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
а что уязвимость в скрипте для тебя пустяк?!
а что уязвимость в скрипте для тебя пустяк?!
Спустя 7 минут, 3 секунды (3.08.2012 - 11:57) killer8080 написал(а):
Цитата (Hello @ 3.08.2012 - 12:42) |
null байт поможет тырить любые файлы |
Да ты прав, так и есть. Уязвимость критичекая. Надо Николаю багрепорт послать
Спустя 5 минут, 23 секунды (3.08.2012 - 12:02) oleg_n написал(а):
Цитата (killer8080 @ 3.08.2012 - 12:49) |
По сути вопроса, пользователь не должен иметь возможности вводить теги. Если нужна возможность форматирования, используй bb коды. |
Для редактирования страниц, используется WYSIWYG-редактор, который и занимается подставлением тегов. Беда как раз где-то в настройках этого редактора.
Цитата |
а что уязвимость в скрипте для тебя пустяк?! |
Это конечно же дыра, и её нужно латать! Но это две разные проблемы, решение которых может идти параллельно
Спустя 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) | ||
wysiwyg редактор редакитрует контент на уровне DOM модели, он никак не связан с хранением данных сервере, и с безопасностью. Еще раз повторю, если юзер может вводить любые теги, это уже уязвимость. Именно для этого текст и обрабатывается htmlspecialchars, чтоб теги перестали быть тегами, и отображались браузером как текст. Потому в таких случаях используют бб коды. |
Мы с Вами говорим про "теплое" или "мягкое"
1. Этот редактор недоступен обычному юзеру из сети, а только лишь админу сайта и лицам к нему приближенным. Соответственно им не нужно ломать сайт, а только лишь добавлять страницы. Если страница отображается не так, как это было создано - это беда, которую нужно решить
2. Если какому хацкеру удалось добраться до такого редактора через админ-панель, то соответственно он уже имеет контроль над всем сайтом
3. Для обычных юзеров есть окошко с ББ-кодами
Спустя 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-уязвимости Можно и в ПМ
П.С. Про защиту от 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) |
Зачем же в пм, об этом все должны знать, особенно новички. |
Спасибо То есть (int)$_GET['id'] решает эту проблему целиком
===============
Эх, ещё бы кто подсказал, как заставить стат. странички корректно отображаться
Спустя 50 секунд (3.08.2012 - 14:37) killer8080 написал(а):
Спустя 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) | ||
если нужно чтоб html в чистом виде вводился через админку, просто выкинь htmlspecialchars, в чем собственно проблема? |
Так в том то и дело, что htmlspecialchars не применяется Либо я туплю и не вижу где это происходит
Спустя 18 минут, 11 секунд (3.08.2012 - 15:29) killer8080 написал(а):
oleg_n
может у тебя где то суперглобальные массивы фильтруются через htmlspecialchars?
может у тебя где то суперглобальные массивы фильтруются через 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); был не там где надо
Спустя 18 минут, 10 секунд (7.08.2012 - 14:32) oleg_n написал(а):
А вот с $_GET['id'] просто так бороться не получается, id может быть как числовым, так и буквенным То есть (int)$_GET['id'] не решает эту проблему.
Попробовал побороть это с помощью функции ereg_replace(), но браузер ругается Function ereg_replace() is deprecated Подскажите плиз, как её корректно можно заменить.
П.С. Хотел заменить функцию ereg_replace(), функцией рreg_replace() с такими же параметрами, но она не работает
Попробовал побороть это с помощью функции ereg_replace(), но браузер ругается Function ereg_replace() is deprecated Подскажите плиз, как её корректно можно заменить.
П.С. Хотел заменить функцию ereg_replace(), функцией рreg_replace() с такими же параметрами, но она не работает
Спустя 1 час, 25 минут, 58 секунд (7.08.2012 - 15:58) killer8080 написал(а):
oleg_n
используй preg_match() для контроля на допустимые символы.
используй 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 |
Спасибо конечно, но я там не нашел ничего нужного мне Либо не так смотрел.
Нужно из строки убрать все лишнее, кроме букв и цифр, а preg-match выполняет проверку на соответствие регулярному выражению и подсчитывает количество совпадений
Спустя 6 минут, 19 секунд (7.08.2012 - 16:13) killer8080 написал(а):
Цитата |
Нужно из строки убрать все лишнее, кроме букв и цифр, а preg-match выполняет проверку на соответствие регулярному выражению и подсчитывает количество совпадений |
Зачем тебе из строки что то убирать? Если юзер зашел по ссылке, ничего некорректного там не будет. Если там появились левые символы, значит кто то пытается ломать сайт, собственно для этого и делается проверка. В этом случае можно выкинуть страницу с предупреждением, чтоб больше так не делал
Спустя 5 минут, 48 секунд (7.08.2012 - 16:19) oleg_n написал(а):
Цитата (killer8080 @ 7.08.2012 - 17:13) |
Зачем тебе из строки что то убирать? Если юзер зашел по ссылке, ничего некорректного там не будет. Если там появились левые символы, значит кто то пытается ломать сайт, собственно для этого и делается проверка. В этом случае можно выкинуть страницу с предупреждением, чтоб больше так не делал |
Согласен.
А можно с примером использования? А то я пока не могу самостоятельно вкурить все это, только на примерах
Спустя 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'])){ |
А если ещё нужно исключить и цифры, тогда запись будет вида:
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 |
Век живи, век учись
Спустя 21 час, 3 минуты, 58 секунд (8.08.2012 - 13:45) oleg_n написал(а):
Поскольку всякие гадости могут писать не только в $_GET['id'], то я создал функцию:
И теперь вызываю её везде, где есть обращение к $GET[] :)
/** * Защита от 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; |
и всётаки заглобалил СУПЕР глобальный массив
вообще работает хоть?
Спустя 33 минуты, 19 секунд (8.08.2012 - 14:23) oleg_n написал(а):
Цитата (Игорь_Vasinsky @ 8.08.2012 - 14:50) | ||
и всётаки заглобалил СУПЕР глобальный массив вообще работает хоть? |
Игорь, найдите отличие $GET от $_GET
Работает
Спустя 56 секунд (8.08.2012 - 14:24) Игорь_Vasinsky написал(а):
а..этож ирбис.. опять на д.Колину ловушку попался 2:0
Спустя 6 часов, 46 минут, 26 секунд (8.08.2012 - 21:10) killer8080 написал(а):
Цитата (oleg_n @ 8.08.2012 - 14:45) |
Поскольку всякие гадости могут писать не только в $_GET['id'], то я создал функцию: /** * Защита от CSRF атаки */ function antiCSRF () |
А причем здесь CSRF?
Спустя 11 часов, 58 минут, 46 секунд (9.08.2012 - 09:09) oleg_n написал(а):
Цитата (killer8080 @ 8.08.2012 - 22:10) |
А причем здесь CSRF? |
Это я немного протупил Конечно же ни при чем, нужно было назвать как то типа - antiNull