Аналгичные исследования проводились на нескольких конференциях phpbb 3.1.x. Для поиска бага была установлена ловушка в posting с записью в лог. Было выявлено несколько ситуаций:
- нормальное срабатывание антибота, когда в браузере отключен js;
- ошибки отправки формы, когда антибот отключен для зарегистрированного пользователя, при этом время жизни формы явно истекло;
- ошибки отправки формы, когда антибот отключен для зарегистрированного пользователя, при этом
form_token
не совпадает с вычисляемым key
, что идентично результатам, полученным Shredder'ом.
В случае 2 разница времён между
creation_time
и
time_now
иногда составляла до нескольких суток, при этом
session_time
и
time_now
изменялись в сторону увеличения при повторных попытках пользователя отправить собщение, а
creation_time
оставался неизменным. Наиболее вероятно, это фича быстрого ответа, поскольку при стандартном ответе
creation_time
изменяется и повторная отправка формы проходит. Наиболее часто такие ошибки проявлялись на айфонах, девайсах под андроидом версии 4.3 и ниже, на разных мобильных устройствах, а также на маках.
В случае 3 определено однозначно, что в
check_form_key
session_time
больше
creation_time
. Следовательно, по факту приёма формы
session_time
обновляется. Что странно, такое может происходить только для бота, что следует из кода
session_create
. Как будто начинается новая сессия, ни с того, ни с сего... Поскольку параметры, из которых создаётся токен формы, и в случае создания токена для формы, и в случае проверки, на первый взгляд одинаковы, складывается впечатление, что дурит механизм сессий... У меня всё-таки остаются подозрения насчет
user_form_salt
, полномасштабную проверку пока не добавлял, ибо ясности пока нет - набираю статистику. Приведенный
Shredder'ом код
Код: Выделить всё
if ((int) $row['sessions'] <= 1 || empty($this->data['user_form_salt']))
{
$this->data['user_form_salt'] = unique_id();
несомненно может приводить к изменению
user_form_salt
.
Поскольку наиболее часто ошибки отправки формы проявлялись на серверах nginx c его же включенным кэшированием, была проверена версия, что настройки кэширования не давали гарантий того, что разные пользователи не получат одну и ту же сессионную Cookie. Кэширование отключали, ошибка отправки формы всё равно появлялась, но вопрос не был полностью изучен из-за недостатка времени, так что вероятность проявления ошибки из-за неправильных настроек кэширования остаётся.