Сформировать одноразовые номера на балансировщиках нагрузки? - PullRequest
0 голосов
/ 08 октября 2018

Мы пытаемся свести к минимуму попадания ботов в наш поисковый URL (то есть он не загружает форму, а просто отправляет параметры), и я думаю, что использование одноразового номера в скрытом вводе решит эту проблему, но наш администратор говорит, чтоСерверы с балансировкой нагрузки могут отправлять одноразовые формы с одного сервера, но отправка формы может быть обработана другим сервером ... поэтому я не уверен, как мы могли бы заставить это работать, и я получаю, казалось бы, нерелевантные / несвязанные результаты, когда веб-поиск всей этой проблемы.

Я работал над несколькими реализациями nonce форм несколько лет назад, но все они проходили через один и тот же сервер (один был автоматически сгенерирован CakePHP, другой я не помню, как мы это делалиЭто).Мы используем httpd с PHP 5.x на серверах CentOS 6.x, и на серверах Live есть 1 промежуточный сервер, который обслуживает запросы, а затем 10 балансировщиков нагрузки (не уверен, что это действительно важно, но у них есть копия файловой системы).и код при обращении к той же базе данных).

Администратор знаком с балансировкой нагрузки (я никогда не делал этого) и говорит, что он может быть в состоянии реализовать какое-то постоянство или использовать memcache -d или что-то вродеэто (я никогда не пробовал это), но я не совсем уверен в этом.

1 Ответ

0 голосов
/ 08 октября 2018

Да, одноразовый номер - хороший выбор.Рабочий процесс может быть

  1. GET-запрос для формы
  2. Создать случайное значение одноразового номера, например, bin2hex(openssl_pseudo_random_bytes(16))
  3. Сохранить одноразовый номер в постоянном общем хранилище.Если вы не используете сеансы, подойдет простое хранилище значений ключей, такое как Redis или memcache.
  4. Добавьте одноразовый номер в ответ в виде файла cookie или скрытой формы.
  5. ФормаОТПРАВЛЕНО обратно на балансировщик нагрузки.Если вы использовали cookie для одноразового номера, балансировщик нагрузки может немедленно отклонить любой запрос, пропускающий cookie.В противном случае запрос отправляется на один из веб-серверов.
  6. PHP считывает nonce из формы POST или cookie.Если он отсутствует, отклоните запрос (например, 404).
  7. Проверено общее хранилище или сеанс для одноразового номера.Если он не найден, отклоните ответ.Если он найден, удалите его из хранилища (чтобы его нельзя было использовать снова) и обработайте отправку формы.
...