За последние 24 часа нас посетили 14937 программистов и 1730 роботов. Сейчас ищут 562 программиста ...

CSRF-токен: один на сессию или новый на каждый запрос

Тема в разделе "Решения, алгоритмы", создана пользователем Deonis, 29 ноя 2017.

  1. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Приветствую! В очередной раз пробежался по инету в поисках правды по этому вопросу. В одних обсуждениях перевешивает точка зрения, что достаточно одного токена на сессию, в других - что токен нужно генерировать новый после каждого запроса. Уже сам запутался...
    Если сайт будет работать по SSL и обязательно нужна поддержка multi-tabs, то стоит ли заморачиваться с генерированием каждый раз нового токена или действительно одного на сеанс будет достаточно?
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.793
    Симпатии:
    1.330
    Адрес:
    Лень
    +
    https://php.ru/forum/threads/66872/
    --- Добавлено ---
    SSL разве относится к CSRF ?
    --- Добавлено ---
    Насколько понимаю защита доп не помешает, вдруг ЧУ
     
    Deonis нравится это.
  3. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Только косвенно - защита от перехвата трафика.
    С этим никто не спорит, но не всегда же нужно идти на поводу программистской паранойи :)
    Ваш код я видел, но меня не столько реализация интересует, сколько определиться в направлении. Если, например, один токен - это очень слабая защита, то почему и как она может провалиться? (не берем в расчет шелы и прочие опасности).

    Если взять мой конкретный случай, то страница может быть открыта и час, и два и десть часов, поэтому ставить время "жизни" токена - не катит. Кроме того, страницы могут и будут открываться в разных вкладках и хранить кучу токенов, проверяя какой совпадает с токеном пришедшим в текущий момент - тоже какой-то бред. Поэтому лень диктует идти по пути наименьшего сопротивления и использовать один токен, но всё та же паранойя этому препятствует.
     
    #3 Deonis, 29 ноя 2017
    Последнее редактирование: 29 ноя 2017
  4. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    P.S. И да, речь идет не о форме авторизации. Там ясное дело, что нужен каждый раз новый токен.
     
  5. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @Deonis, читал статью на хабре, где проверяли уяизвимость тех или иных сервисов. Так, у некоторых проверямых на каждый запрос новый токен, у некоторых один на одну сессию.
    Не ставь время жизни токена, просто генерируй его для каждого запроса)).
     
  6. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Если не про эту говорите, то не попадалась, но глянул бы.
    Я так надеялся, что скажут, мол послушай свою лень, одного токена с головой хватит... )))
     
  7. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Да, эта.

    Наверно еще скажут))

    Я сам тоже послушал бы мнения за и против).
     
  8. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Токены всегда одноразовые - иначе в них нет смысла.

    Но с Вашим мнением согласны многие
     
  9. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.557
    Симпатии:
    631
    При каждом рефреше, надо генерить новые токену на каждую ссылку и форму с токеном
     
  10. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    SPA
    1. Клиент делает запрос, сопровождает его токеном, ждет выполнения и получения нового токена.
    2. Клиент делает ещё один запрос. Текущий токен уже протух на п.1, но новый пока ещё не получен.

    Как разруливать будем? )
     
    Fell-x27 нравится это.
  11. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.557
    Симпатии:
    631
    Клиенту можно дать сразу кучку одноразовых токенов
     
  12. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    "Кучка" в десятичной системе счисления - это сколько? )) Менеджер приходит в девять утра и сразу открывает сайт, а закрывает его часов в семь вечера. Кроме того, что он активно его использует, периодически (раз в 10 сек.) отправляются Ajax-запросы. Хотя, последний момент под вопросом, т.к. я пытаюсь убедить перебросить Ajax на WebSocket, но пока безуспешно.
    Но главная проблема - это то, что они, как я мог наблюдать, могут штук двадцать закладок открыть и тут уже "кучкой" не обойдешься.
     
  13. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.557
    Симпатии:
    631
    @Deonis в процессе обмена данными, подкидывать новые токены. Вопрос же состоит в том, что в SPA приложении запрос может быть отправлен еще один до получения ответа на первый.
    Я делаю так - в каждом месте, где нужно использовать токен для защиты от CSRF, я дергаю функцию, которая генерирует случайный токен и пихает его в ссылку (форму) и в мемкеш. Когда приходит запрос, требующий защиты, я проверяю, передан ли с ним валидный токен. Если да - ОК, удаляю токен из мемкеша как использованный. Если нет - эррор.
    Недостатков в этой системе не нашел.
     
    Deonis нравится это.
  14. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.107
    Симпатии:
    1.243
    Адрес:
    там-сям
    На практике под общим названием "CSRF token" используются настолько разные подходы, что можно было бы разные термины придумать. Как минимум, он должен быть уникален для данной пользовательской сессии. У WordPress, насколько знаю, токен по умолчанию действителен в течении получаса и может использоваться многократно, хотя в названии функций присутствует слово "nonce" — то есть "одноразовый" :) . Это сильно упрощает работу AJAX. А где-то токен применим только к конкретному запросу. Что выбрать, решать тебе. Почитай первоисточники чтобы знать матчасть лучше.

    https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet
    https://en.wikipedia.org/wiki/Cryptographic_nonce
    https://laravel.com/docs/5.5/csrf
     
    Deonis нравится это.
  15. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Это асинхронные запросы? Если пользователю нужно отправлять несколько запросов с одной страницы - тогда запрос будет все равно один (одного типа) и токен просто не должен протухать до перезагрузки страницы.
    Но у меня возникает встречный вопрос - от чего защитит многоразовый токен?
     
    [vs] нравится это.
  16. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.793
    Симпатии:
    1.330
    Адрес:
    Лень
    используемый гандон будут еще использовать, да промоем пофиг, еще пойдет
    а мож еще друзей позвать, одним шариком для всех ?
     
  17. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    На практике достаточно одного токена на сессию. Другое дело, что сессия должна быть сессией, а не запоминалкой входа на 5 лет вперед.
    Пилить новый токен на каждую форму нецелесообразно.
    1) Даже если вопрос не о SPA, проблема, описанная @romach имеет место быть. Ну вот тупо пользователь открыл на сайте 5 страниц сразу. Ну вот я на форуме открыл 10 вкладок. В каждой есть кнопки. Они должны быть закрыты CSRF_защитой. Если на каждую новую страницу генерить новый токен, то на 9 из 10 у меня не будут работать кнопки и AJAX. Норм.
    2) Окей, создаем новые токены и кладем в стопочку. Поздравляю, мы только что всему миру дали инструмент для DDOS-а нашего сервера ботом, которого можно на коленке поднять. Который будет молотить наш сайт и в одно рыло уложит сервер, но не перегрузкой очереди обработки запросов, а задрачиванием винта. Либо, если винт не SSD, он отожрет все его время, либо, если SSD, за N времени вычерпает дисковое пространство. А если мы храним токены в оперативке, то задача укладки сервера упрощается в разы. Достаточно загнать его в своп.

    Паранойя это ок, но надо руководствоваться здравым смыслом. CSRF-атаки стихийны. Никто не украдет ваш драгоценный CSRF-токен с тем, чтобы провести целенаправленную атаку на конкретного человека. Слишком замороченно. Если человек может украсть CSRF-токен, то, вероятно, имеет достаточный доступ к компьютеру жертвы, чтобы и без CSRF проводить атаку на него.

    Всякие вконтакты вообще практиковали (давно не проверял, мб поменялось уже) один токен на пользователя. Не на сессию На пользователя. И норм.

    Крч, я к чему - односессионного токена хватит всем. Однозапросный не имеет смысла и практической ценности.
     
    Deonis нравится это.
  18. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    @Fell-x27, у Вас на форуме на каждую форму свой токен, который содержит штамп времени и еще чего-то.
     
  19. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.107
    Симпатии:
    1.243
    Адрес:
    там-сям
    по определению, токен должен защищать от поддельного запроса извне. он выдан в твоей сесии. кто-то другой, однажды совершавший те же действия, не сможет использовать свой токен чтобы выполнить действие от твоего лица.
     
  20. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    @artoodetoo, с этим справляются сессии и без токенов. Токены для того, чтобы идентифицировать формы - то, что они были сгенерированы сервером. А коли везде один и тот же токен - он подойдет к любой форме.
     
    AlexProg нравится это.
  21. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Прям на каждой странице свой, или для каждой формы специфичный? Если первое, то весело :) Хотя Ксенфоро во многом странный движок. CSS, вот, в БД хранит...
    --- Добавлено ---
    Вы об одном и том же говорите, не? :)
     
  22. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Ну если штамп времени - то на одной странице должен быть один. Кстати второй параметр - это id пользователя. Я прав?
    Тут да. Об одном. Но далее расходимся.
     
  23. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.107
    Симпатии:
    1.243
    Адрес:
    там-сям
    @Maputo у нас форум написан ребятами из XenForo, что бы там ребята из ODware ни писали в подвале )))
    это вопрос или утверждение? подозреваю, что там user_id, session_start_timestamp и собственно токен.
    --- Добавлено ---
    можно найти пиратские сорцы XenForo и покопаться в порохах. но лень
    --- Добавлено ---
    да, Фел. мы обсуждаем одну тему, как ни странно
     
  24. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    @artoodetoo, если токен один - злоумышленник копирует его в свою форму и отправляет запрос на сервер - разве его что-то остановит?

    P.S.: ИМХО токены - это борьба с симптомами. Нужно избавляться от самой болезни - возможностью запуска сторонних скриптов.
     
    AlexProg нравится это.
  25. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.107
    Симпатии:
    1.243
    Адрес:
    там-сям
    а вообще местный токен похож на HMAC. присутствует открытый кусок данных, временная метка и подпись, сделанная с помощью закрытого ключа. вполне может служить в роли токена.
    --- Добавлено ---
    1. скопирует откуда?
    2. она протухает