Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как противостоять XSS атаке?
 
 автор: Loki   (14.08.2006 в 23:52)   письмо автору
 
 

Тема с данным вопросом успешно потонула, а мыслей хоца.
Итак. Условие: форум позволяющей вставлять изображения с тругих сайтов и автоматически опознающий зарегистрированных посететелей.
Как вариант: пишем в куку логин и хеш (пароль+юзерагент). Таким образом, если даже злоумышленник попер куки, то он должен иметь в точности такой же юзерагент.
В случае открытых исходников - сводится на нет. Еще идеи есть?

   
 
 автор: Киналь   (15.08.2006 в 00:06)   письмо автору
 
   для: Loki   (14.08.2006 в 23:52)
 

Если бы безопасность была превыше всего, я бы все изображения закачивал на сервер (попутно, естественно, проверив всячески - на mime-тип, например), и выводил бы уже свои, а не посторонние. Чревато жуткими тормозами.

   
 
 автор: Loki   (15.08.2006 в 00:14)   письмо автору
 
   для: Киналь   (15.08.2006 в 00:06)
 

Ну это хорошо рассуждать сидя на форуме по программированию, а форум, например, по фотографии попросту ляжет:) Или его положат, заставив тянуть к себе и проверять свопы от винды:) Хочется понять что я упустил, если вообще у этой задачки есть решение.

   
 
 автор: Киналь   (15.08.2006 в 00:22)   письмо автору
 
   для: Loki   (15.08.2006 в 00:14)
 

>Хочется понять что я упустил, если вообще у этой задачки
>есть решение.
Абсолютно верного - точно нет:) Просто в силу того, что "Написанное одним человеком может быть понято другим". Перефразируя: как ни защищай, захотят - сломают. И весь вопрос в соотношении усилий и результата.

   
 
 автор: Loki   (15.08.2006 в 10:05)   письмо автору
 
   для: Киналь   (15.08.2006 в 00:22)
 

Все-таки хочется найти хоть какое-то решение: может использовать я его и не стану, но в голове держать буду:)

   
 
 автор: Trianon   (15.08.2006 в 09:25)   письмо автору
 
   для: Loki   (14.08.2006 в 23:52)
 

тогда уж login и хеш(сессионный ключ)
где сессионный ключ=remote_addr+forwarded_for+user_agent+random, считается в момент авторизации.

   
 
 автор: Loki   (15.08.2006 в 10:01)   письмо автору
 
   для: Trianon   (15.08.2006 в 09:25)
 

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

   
 
 автор: Trianon   (15.08.2006 в 10:03)   письмо автору
 
   для: Loki   (15.08.2006 в 10:01)
 

На самом деле онлайн-сеанс может и превышать время сессии.
Но допустим для простоты, что у нас сеанс=сессии.
Вы же хотите защититься от XSS-перехвата в течение сессии?

   
 
 автор: Loki   (15.08.2006 в 10:07)   письмо автору
 
   для: Trianon   (15.08.2006 в 10:03)
 

Нет. По условиям задачки на форуме - автологин. То есть все необходимые данные для авторизации храняться у куках. Вопрос в том, легко ли эти куки спереть, и как сделать чтобы злоумышленнику их было труднее использовать?

   
 
 автор: Trianon   (15.08.2006 в 10:21)   письмо автору
 
   для: Loki   (15.08.2006 в 10:07)
 

Прошу прощения... проглядел.
Если на формуме автологин, то о какой безопасности вообще может идти речь?
Аутентифицируют-то не человека, а машину.

   
 
 автор: Loki   (15.08.2006 в 10:29)   письмо автору
 
   для: Trianon   (15.08.2006 в 10:21)
 

Вот и встает вопрос: как опознать конкретную машину?
Ничего точнее юзерагента я пока не придумал...

   
 
 автор: Trianon   (15.08.2006 в 10:37)   письмо автору
 
   для: Loki   (15.08.2006 в 10:29)
 

Ответ: Внутри сессии - по аспектам человека, открывшего сессию. Вне сессии - никак. :( . Уж если IP неуникален, что говорить об UA, который повторяется куда чаще IP

   
 
 автор: Loki   (15.08.2006 в 10:50)   письмо автору
 
   для: Trianon   (15.08.2006 в 10:37)
 

Эх:(
Ладно... пошел ломать форумы:)

   
 
 автор: cheops   (15.08.2006 в 12:23)   письмо автору
 
   для: Loki   (14.08.2006 в 23:52)
 

Хм... вообще если не лениться, то от любой XSS можно защититься, просто многие разработчики плюют на это дело. Можно так всё обставить, что мышь не проскочит.

   
 
 автор: Loki   (15.08.2006 в 13:34)   письмо автору
 
   для: cheops   (15.08.2006 в 12:23)
 

хорошо, а как отловить скрипт? Тут подсмотрел варианты обхода фильтров:

<img src=javascript:alert()>
<img src=vbscript:AleRt()>
<img src=JaVasCriPt:alert()>
<img src="   javascript:alert()"> (пробелы до слова javascript) 
<img src=&#106&#97&#118&#97&#115&#99&#114&#105&#112&#116:alert()>
<img src=javascript&#9:alert()>
<img src=javascript&#10:alert()>
<img src=javascript&#13:alert()>
<img src="javascript    :alert()">  (перед двоеточием - символ табуляции) 
<img src="java    scri
pt:ale    rt()"> (внутри слова javascript - символ табуляции и возврат каретки)

Пока внятного решения как все это проверить у меня нет...

   
 
 автор: Trianon   (15.08.2006 в 14:35)   письмо автору
 
   для: Loki   (15.08.2006 в 13:34)
 

Пардон.... я так понял, предполагается, что html-код всё ж таки под контролем.

   
 
 автор: Trianon   (15.08.2006 в 14:35)   письмо автору
 
   для: cheops   (15.08.2006 в 12:23)
 

А если конкретней?
Исходная постановка, как я понял, такая.
На сайте стоит автологон - аутентифицирующая информация передается браузером из кукисов - как в этом форуме.
На страницах сайта также нужно формировать <img src=..> ссылки на чужие изображения.
Возможно ли реализовать это без необходимости транслировать траффик изображений через сервер сайта, не подвергая опасности перехвата кукисов серверами источников чужих изображений?

   
 
 автор: Loki   (15.08.2006 в 15:07)   письмо автору
 
   для: Trianon   (15.08.2006 в 14:35)
 

совершенно верно.
проверил на нескольких форумах - конструкция [img]javascript:alert('Превед!')[/img] приводит к желаемому результату.
Судя по всему, придется проверять ссылку на наличие вызова яваскрипта, символов &, % и задавать кодировку документа (к вопросу о следовании стандартам:)

   
 
 автор: cheops   (16.08.2006 в 12:24)   письмо автору
 
   для: Trianon   (15.08.2006 в 14:35)
 

Я вот чего не понимаю, ссылки у нас начинаются с http://, всё что не начинается с http:// от лукавого и работать не будет по нормальному в любом случае, ставим опержающую проверку, равено ли начало ссылки http и с java начинаться у нас уже ссылка уже не может.

   
 
 автор: Loki   (16.08.2006 в 13:00)   письмо автору
 
   для: cheops   (16.08.2006 в 12:24)
 

ссылка может быть на ftp, maito, nntp а может быть и вообще относительной.

   
 
 автор: cheops   (16.08.2006 в 13:08)   письмо автору
 
   для: Loki   (16.08.2006 в 13:00)
 

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

   
 
 автор: Loki   (16.08.2006 в 13:13)   письмо автору
 
   для: cheops   (16.08.2006 в 13:08)
 

>ну для изображений это редкость
Опять судите со своей колокольни - для программистского форума - редкость, для дизайнеров/фотографов/художников - обычное дело.
пока что остановился на проверке наличия строк "javacsript:" и "vbscript:", а так же замене амперсандов... вроде как этого достаточно.

   
 
 автор: cheops   (16.08.2006 в 22:37)   письмо автору
 
   для: Loki   (16.08.2006 в 13:13)
 

Хм... ну протоколов высокого уровня не так много - можно пребрать начинается ли ссылка с http, ftp, mailto, nntp...

   
 
 автор: Loki   (16.08.2006 в 23:14)   письмо автору
 
   для: cheops   (16.08.2006 в 22:37)
 

а относительные на что проверять?:)

   
 
 автор: Unkind™   (17.08.2006 в 00:56)   письмо автору
 
   для: Loki   (16.08.2006 в 23:14)
 

А че, пользователям нужно ссылаться на ваши ресурсы через относительные пути? =))

   
 
 автор: Lelik   (17.08.2006 в 02:03)   письмо автору
 
   для: Loki   (16.08.2006 в 13:13)
 

для тега [img][/img] можно сделать проверку та тип файла, то есть все кроме jpg, gif ну и чего там для дизайнеров/фотографов/художников - обычное дело.

   
 
 автор: Loki   (17.08.2006 в 09:17)   письмо автору
 
   для: Lelik   (17.08.2006 в 02:03)
 

Для этого файл придется загрузить. Так что этот вариант отпадает.

   
 
 автор: cheops   (17.08.2006 в 12:22)   письмо автору
 
   для: Loki   (17.08.2006 в 09:17)
 

Хм... можно улучшить анализатор URL, если использовать parse_url(), она значительно облегчает построение защиты...

   
 
 автор: Lelik   (17.08.2006 в 15:00)   письмо автору
 
   для: Loki   (17.08.2006 в 09:17)
 

Зачем загружать, просто когда преобразововать теги img, делать проверку на 3 последних символа, substr($img, "jpg", -3). в таком роде...

   
 
 автор: Loki   (17.08.2006 в 15:26)   письмо автору
 
   для: Lelik   (17.08.2006 в 15:00)
 

lavascript:alert('превед!'); //.jpg

   
 
 автор: Lelik   (17.08.2006 в 15:41)   письмо автору
 
   для: Loki   (17.08.2006 в 15:26)
 

да, не подумал...

   
 
 автор: Lelik   (17.08.2006 в 19:25)   письмо автору
 
   для: Lelik   (17.08.2006 в 15:00)
 

я вот чего додумал, в проверку включить кроме substr($img, "jpg", -3), substr($img, "javascript" !== false), и т.д.

   
 
 автор: cheops   (17.08.2006 в 22:25)   письмо автору
 
   для: Lelik   (17.08.2006 в 19:25)
 

Тогда отсекаются URL вида http://www.site.ru/dec/javascript/index.php.

   
 
 автор: Lelik   (18.08.2006 в 01:48)   письмо автору
 
   для: cheops   (17.08.2006 в 22:25)
 

a javascript для запуска сценария должно в начале писаться

   
 
 автор: Lelik   (18.08.2006 в 02:00)   письмо автору
 
   для: cheops   (17.08.2006 в 22:25)
 

>Тогда отсекаются URL вида http://www.site.ru/dec/javascript/index.php.
тогда проверяйте - наличие
1. http://
2. www.
если нет то на первые символы
javascript и тому подобная хрень...

   
 
 автор: Join   (17.08.2006 в 04:32)
 
   для: cheops   (15.08.2006 в 12:23)
 

Не согласен.
Идиальной защиты нет, всё что создал человек можно взломать!

   
 
 автор: cheops   (17.08.2006 в 12:20)   письмо автору
 
   для: Join   (17.08.2006 в 04:32)
 

С этим никто не спорит, только ломать возможно придётся не через XSS, а через что-то другое.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования