Как стать автором
Обновить

Комментарии 37

упс… так и ajax-отправку тех-же сообщений можно через токены проверять…
пошел крутить токены на ajax_privatemsg

«низко кланяемся барину в ножки» (с) не помню.
Аякс в общем-то тут вообще для примера :) главное — обработчики.
я обработчики и имел ввиду. ajax_ это так… выпендреж ;)
Отличный разбор полётов, пошёл исправлять ошибки. Спасибо
Большое спасибо за статью.
НЛО прилетело и опубликовало эту надпись здесь
дядя, атата, это плохо. труЪ хацкеры сообщают о найденных уязвимостях. они само благородство. а вот всякие скрипт-киддисы наичинают бесноваться, и крушить все подряд(а о проксях и логах они знают??).
кстати были недавно XSS уязвимости на яндексе и рамблере кажись… или мэйле. не помню точно. не могу найти=(
НЛО прилетело и опубликовало эту надпись здесь
давайте ссылку — вместе поглядим=) одна голова хорошо. ну а две = хорошо^2
НЛО прилетело и опубликовало эту надпись здесь
я поражен наплевательским отношением к дырам на сайтах контор.
сайт алькогольной компании довольно крупной(импортер в Россию). я сообщал об уязвимости(SQL Inj + еще одна с раскрытием путей). закрыли спустя год где-то=) на некоторых до сих пор актуальны(Genser например).
про доверие это точно. много каках нынче развелось.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Это же одно из основных правил: любые действия, вносящие изменения на сайт, нужно делать через POST-запросы. Просто большинство про него забывает почему-то. :)
И не только AJAX, а вообще все запросы, изменяющие данные, надо пересылать POST'ом. Это ж элементарные вещи, основы HTTP можно сказать.
гыгы, а в посте даже фильтровать ничего не надо! его же не видно!
POST без ключика не безопаснее GET
по-моему, заставить человека отослать POST на сервер сложнее чем GET. Расскажите про простой способ отсылки POST запрос от жертвы?
форма в которой submit нажимается javascript'ом
Это не решение. Я могу создать зло-сайт и все приходящие на него будут (к примеру) спамить ваш сайт, если они на нем зарегистрированы, а ваш сайт подверен XSRF.

Дешевое решение — проверять реферер (работает только если у вас нет XSS на сайтек, но думаю в 2009 оставлять XSS уже несерьезно), это защизает от атак со сторонних сайтов.
Вообще XSRF — следствие просчета при проектировании браузеров и HTML.

p.s То что написано — откровенный боян, полгода назад (а может и раньше) вроде как эта уязвимость была вконтактике.
Дешевое решение — проверять реферер

чем же оно дешевое такое?
Очень просто реализуется, хотя и низкоэффективно.
> работает только если у вас нет XSS на сайтек, но думаю в 2009 оставлять XSS уже несерьезно

Ой, фигню пишу. стработает, если злоумышленник не может размещать на вашем сайте картинки и яваскрипт, вот что я имел в виду.
эта дырка активно года 2 назад обсуждалось… и страдали ей тогда много крупных приложений…
НЛО прилетело и опубликовало эту надпись здесь
на моей памяти только вбуллетин с первых версий проверяет эти данные. даже в админке есть поля для разрешенных сайтах, жаль что с него не брали пример тогда… может просто не знали, зачем эта фишка.
Не «подделка межсайтовых запросов», а «кузница», если дословно перевести. А если не дословно, то все равно «подделка» и «межсайтовых» вместе не должны быть. Подделываются то обычные запросы, с помощью межсайтовых запросов.
По-моему, это не решение проблемы, а «костыль».
Проблема в архитектуре, это неправильно, что действие выполняется при заходе на определённый url, правильнее, как выше написали, все действия выполнять POST-запросом.

А при выполнени серьёзных действии, особенно при удалении, не лишним будет выводить предупреждение «Вы уверены, что хотите сделать то-то?».
POST подделать не сложнее. С вашей точкой зрения не согласен, она не аргументирована. Token обеспечивает максимальную защиту, вы не подделаете его без доступа к сессии.
Как POST подделать?
Если с GET всё понятно, вставить ссылку или картинку с нужным путём, то форму вам вставить никто не даст…
Естественно, используя XSS — засабмитив форму джаваскриптом. У нас в условиях не было что сайт не пробиваем для XSS, тем более, мы не застрахованы от полной доступности HTML формата для всех. Думаю, здесь вы со мной согласитесь. И вот в этих условиях Token все-равно остается непробиваем. Т.к. даже получив сессию кого-то из пользователей, вы не сможете сгенерить верный токен без секретного ключа сайта. Конечно, это все уже немного не в ту степь, ибо если вы получили сессии, то все намного проще и по-другому — можно просто залогиниться под пользователем. Но мы ведь рассматриваем только аспект текущей проблемы с CSRF.
И вот в этих условиях Token все-равно остается непробиваем.
Если мы можем вставить Javascript, который отправляет форму, то мы можем вставить и скрипт, который найдёт нужную сылку у пользователя, соответственно в которой уже будет token, и запросить её.
Ну и как Вы сами сказли, имея возможность вставлять лобой html и javascript, мы можем сделать куда более интересные вещи, чем просто запросить определённыйй url.

Поэтому я предлагаю не обсуждать «сферического коня в вакууме», а вернуться к реальному положению дел, где разработчик предусмотрел фильтрацию содержимого, и ничего кроме текста и нескольких стандартных тэгов вставить нельзя, никаких форм, никакого яваскрипта.
В таких условиях как подделать POST-запрос?
Да никак, собственно также никак, как и поломать токен.
Куда-то мы не в ту степь ушли. Я же не говорю, что отправлять POSTом хуже. Я только говорю, что ключ все-равно следует включать, дабы хотя бы попытаться избежать тех маловероятных сферических конев в вакууме. Во всех друпаловских формах ключ включается автоматом. Все действия удаления — требуют подтверждения. Мы сейчас обсуждали мой пример, который на то и пример, чтобы быть очевидным для понимания.
Я написал лишь, что если бы изначально не было проблем с архитектурой, то можно было бы вообще обойтись без token'а.

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

Публикации