История изменений
Исправление den73, (текущая версия) :
Ну да, хранить на сервере я думал, и про завалить тоже сразу подумал. Можно попробовать частично защититься так:
- ограничить число сессий N, которые может одновременно иметь каждый пользователь.
- хранить N последних сессий каждого пользователя на сервере, уже после того, как они закрылись. Получается O(число пользователей, имеющих аккаунт).
- при приёме протухшего запроса проверять, что его сессия - одна из этих N. Правда, если он напишет коммент, не отправит его, затем перейдёт на другое устройство, на нём N раз выйдет и зайдёт , а через два часа вернётся на первое устройство и попробует отправить коммент, то всё равно ему будет отказано и текст будет потерян.
Ну и другой вариант для AJAX - это просто сначала отправить запрос «обнови сессию». Если сессия протухла, то отправка сообщения с клиента не происходит, а вместо этого открывается форма логина (поверх существующей, это ж вроде можно). Если же сессия не протухла, то она продлевается на час и тогда мы смело отправляем уже основной запрос.
Можно и повторять, но это как-то менее красиво на вид.
Для чистого html такой способ не сработает, но ведь аскеты должны быть готовы к такой мелкой неприятности :)
Исправление den73, :
Ну да, хранить на сервере я думал, и про завалить тоже сразу подумал. Можно попробовать частично защититься так:
- ограничить число сессий N, которые может одновременно иметь каждый пользователь.
- хранить N последних сессий каждого пользователя на сервере, уже после того, как они закрылись. Получается O(число пользователей, имеющих аккаунт).
- при приёме протухшего запроса проверять, что его сессия - одна из этих N. Правда, если он N раз выйдет и зайдёт с другого устройства, а потом вернётся на старое и попробует отправить коммент, который написан неделю назад и уснул вместе с ОС, то всё равно ему будет отказано.
Ну и другой вариант для AJAX - это просто сначала отправить запрос «обнови сессию». Если сессия протухла, то отправка сообщения с клиента не происходит, а вместо этого открывается форма логина (поверх существующей, это ж вроде можно). Если же сессия не протухла, то она продлевается на час и тогда мы смело отправляем уже основной запрос.
Можно и повторять, но это как-то менее красиво на вид.
Для чистого html такой способ не сработает, но ведь аскеты должны быть готовы к такой мелкой неприятности :)
Исходная версия den73, :
Ну да, хранить на сервере я думал, и про завалить тоже сразу подумал. Можно попробовать частично защититься так:
- ограничить число сессий N, которые может одновременно иметь каждый пользователь.
- хранить N последних сессий каждого пользователя на сервере, уже после того, как они закрылись. Получается O(число пользователей, имеющих аккаунт).
- при приёме протухшего запроса проверять, что его сессия - одна из этих N. Правда, если он N раз выйдет и зайдёт с другого устройства, а потом вернётся на старое, то всё равно ему будет отказано.
Ну и другой вариант для AJAX - это просто сначала отправить запрос «обнови сессию». Если сессия протухла, то отправка сообщения с клиента не происходит, а вместо этого открывается форма логина (поверх существующей, это ж вроде можно). Если же сессия не протухла, то она продлевается на час и тогда мы смело отправляем уже основной запрос.
Можно и повторять, но это как-то менее красиво на вид.
Для чистого html такой способ не сработает, но ведь аскеты должны быть готовы к такой мелкой неприятности :)