LINUX.ORG.RU

CSRF-токен костыль?

 , , ,


0

1

Не буду углубляться что есть CSRF. Кто в теме, тот знает.

Сабж вот в чем. Обычно везде в формах или ссылках пихают токен защиты. Мол, токена нет, или он не валидный — не буду ничо делать.

Ага. Но есть ли смысл в этом токене? Ведь достаточно проверить реферер (домен и внутренний путь предыдущей страницы). Например:

http://domain.tld/admin/users/remove?id=22
Достаточно проверить что реферер был таким (псевдо-регулярка в конце):
http://domain.tld/admin/users(\?page=\d+)?
Т.е. удаление (в данном примере — пользака) возможно только со страницы просмотра списка пользаков.

А что касается угона кук и подделки реферера — это, извините, уже не CSRF, а ССЗБ, раз твои данные уже угнали.

Дискас!

Ведь достаточно проверить реферер

Но тогда достаточно просто подделать реферер?

Debasher ★★★★★ ()
Ответ на: комментарий от Debasher

Но тогда достаточно просто подделать реферер?

Ты в курсе как работает CSRF? Ой, не. Покажи на примере как на жаваскрипте подделать реферер для кликающей на CSRF-ссылку жертвы.

deep-purple ★★★★★ ()
Последнее исправление: deep-purple (всего исправлений: 2)
Ответ на: комментарий от deep-purple

М, разве не

request.setRequestHeader("Referer", "http://www.google.com");

?

// я ваще мимо-не-жсер

Debasher ★★★★★ ()
Ответ на: комментарий от Debasher

Не. Предположим ты админ сайта domain.tld. И ты щас там залогинен в админке. Вот я тебе прямо на лоре даю ссылку: http://domain.tld/admin/users/remove?id=22

Я не могу сюда воткнуть никаких подмен реферера. Даже если бы тут и была возможность просунуть XSS.

deep-purple ★★★★★ ()
Последнее исправление: deep-purple (всего исправлений: 1)
Ответ на: комментарий от DonkeyHot

И? Я ожидаю конкретный реферер, домен + внутренняя часть пути на сайте. Если хоть что-то не так — отпну.

Максимум, при наличии XSS на сайте с которого я размещаю CSRF-ссылку, я могу:

  • Сформировать аякс-запрос, но: http://stackoverflow.com/a/27218658/3558278 мне не дадут поменять реферер — политика безопасности.
  • Инсертнуть <script> с нужной ссылкой, но, там я тоже не смогу поменять реферер.

Короче — не убедил ))

deep-purple ★★★★★ ()
Ответ на: комментарий от deep-purple

Почему именно на жаваскрипте? Реферер это всего-лишь поле в хедере запроса. Его подделать - раз плюнуть. Токен же ты подделать не сможешь.

NightmareZombie ()

А если Referer пустой?

Например, этим балуются антивирусы и файрволы (Windows, но все же), а также некоторые прокси.

Заставить браузер не слать Referer (причем штатными методами) не так уж и сложно.

PS: а за remove через GET надо руки отрывать, да...

Oxana ()

Всегда ставлю network.http.sendRefererHeader в ноль. Почему? Потому что узаконенный на уровне стандарта зонд. Где твой бог теперь?

entefeed ☆☆☆ ()
Ответ на: комментарий от Oxana

entefeed Сразу обоим отвечу.

Да, удаление через гет — какашка, но это просто синтетический пример.

Да, если реф пустой, тогда хрена вамс, а не действия.

Таки на пока — для отпинывания CSRF, проверки рефа достаточно, о чем там выше ссылку даже кидали.

Что там? Типа пользак не виноват что ему рефер порезали фаерволы? Нюю, я тоже могу возразить за токен (при условии что он был в гете) — пользак не виноват что ему строку гет-запроса откоцали, если она слишком длинной была.

deep-purple ★★★★★ ()
Ответ на: комментарий от deep-purple

Да, если реф пустой, тогда хрена вамс, а не действия.

Нет, не нам хрена, а тебе и твоему недосайтику.

Иди нормально делай.

entefeed ☆☆☆ ()
Ответ на: комментарий от entefeed

Нет, не нам хрена, а тебе и твоему недосайтику.

Иди нормально делай.

this

anonymous ()

С CSRF удобнее, т.к. системе не нужно знать на каком домене она работает -> более универсальный и надежный способ.

pi11 ★★★★★ ()
Ответ на: комментарий от entefeed

Нет, не нам хрена, а тебе и твоему недосайтику

Ситуацию с обрезкой гет-строки ты проигнорил, да ))

Иди нормально делай

Так я ничего не запиливаю, только рассуждаю.

deep-purple ★★★★★ ()
Ответ на: комментарий от pi11

удобнее, т.к. системе не нужно знать на каком домене она работает

Сомнительное удобство, еще токен нужно хранить где-то, а если на одной странице несколько форм? Тогда несколько токенов.

deep-purple ★★★★★ ()
Ответ на: комментарий от deep-purple

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

Ящитаю на рефер опираться категорически нельзя, и как замена токену он не катит. Так, чисто дополнительную инфу получить.

entefeed ☆☆☆ ()
Ответ на: комментарий от deep-purple

Тебе сказали, в браузерах, проксях и серверах баги и костыли. Пользователя с говнобраузером ты не защитишь

vertexua ★★★★☆ ()
Ответ на: комментарий от deep-purple

Нормальные фреймворки (django, например) сами ведут учет csrf-токенов.

unfo ★★★★★ ()
Последнее исправление: unfo (всего исправлений: 1)
Ответ на: комментарий от deep-purple

Сомнительное удобство

домен тоже нужно хранить, он может меняться, приложение может работать с разных доменов и т.д. Меня ты не убедил, буду юзать csrf токен =)

pi11 ★★★★★ ()

Ага. Но есть ли смысл в этом токене? Ведь достаточно проверить реферер (домен и внутренний путь предыдущей страницы).

Смысл в том, что ты его не можешь предсказать, в отличии от. Поэтому, когда в твоей дырявой цмске найдут новый баг и злобные хакцоры таки смогут отправить от тебя запрос с правильным реферером, то у них нихрена не выйдет. Обращайся ещё, твой капитан.

anonymous ()
Ответ на: комментарий от anonymous

Не надо переворачивать с ног на голову. Давай не будем фамильярничать «твоя/моя» цыымэс.

Есть сайт «А» (площадка) и есть сайт «Б» (атакуемый). Предположим сайт «А» держишь ты, а сайт «Б» держу я. У тебя полный доступ к исходникам своего сайта. Сформируй html/js страницу, которая сделает то, о чем ты вещаешь. Целевую ссылку возьми ту что я выше в пример приводил.

deep-purple ★★★★★ ()
Ответ на: комментарий от deep-purple

Не надо его хранить. Достаточно проверить.

bj ()
Ответ на: комментарий от deep-purple

Не надо переворачивать с ног на голову. Давай не будем фамильярничать «твоя/моя» цыымэс.

Давай ты не будешь давайкать и предпологать, а внимательно перечитаешь про csrf и мой комментарий. Там ничего нет о двух разных сайтах.

anonymous ()
Ответ на: комментарий от anonymous

Оу, да? Ну пусть будет только сайт «А», на котором я залогинен админом, а у тебя есть доступ к html/js (например дырявый визивиг или бб-теги). Скомпрометируй.

deep-purple ★★★★★ ()
Ответ на: комментарий от bj

Не надо его хранить. Достаточно проверить

А чтоб проверить надо сохранить? ))

deep-purple ★★★★★ ()
Ответ на: комментарий от deep-purple

Ну пусть будет только сайт «А», на котором я залогинен админом, а у тебя есть доступ к html/js (например дырявый визивиг или бб-теги). Скомпрометируй.

Ну пусть будет, что я его скомпрометировал.

anonymous ()
Ответ на: комментарий от deep-purple

А чтоб проверить надо сохранить? ))

Nope. man hmac

bj ()

Достаточно проверить что реферер был таким (псевдо-регулярка в конце)

Недостаточно. Пример, у нас есть форум. У администратора форума есть возможность удалять сообщения в темах(заходит в просмотр темы и у сообщения есть ссылка на удаление). А теперь представим, что человек в теме накидал картинок, у которых сорцы указывают на урлы удаления сообщений и админ зашел в эту тему. Рефереры будут совпадать - следовательно сообщения будут удалены. Был бы csrf токен - сообщения остались.

Ага. Но есть ли смысл в этом токене?

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

aiive ()
Ответ на: комментарий от aiive

у которых сорцы указывают на урлы удаления сообщений и админ зашел в эту тему

Что (т.е., удаление по GET), впрочем, само по себе - жуткое ССЗБ.

heilkitty ★★ ()
Последнее исправление: heilkitty (всего исправлений: 1)
Ответ на: комментарий от heilkitty

Что (т.е., удаление по GET), впрочем, само по себе - жуткое ССЗБ.

Я в курсе. Это было просто для упрощения примера. Можно было представить что там есть еще xss уязвимость и мы встроили код, который через XmlHttpRequest делает пост запрос на урл удаления.

aiive ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.