Или этот механизм блокировки просто глуп и раздражает пользователей без какой-либо существенной защиты?
Вы потенциально попали туда по гвоздю: безопасность через неизвестность - это не безопасность.
Вместо того, чтобы пытаться «препятствовать угадыванию», используйте URL-адреса, которые на самом деле трудно угадать: очевидный пример - использование криптографически безопасного ГСЧ для генерации «случайной строки из 20 символов». Если вы используете base64url (или аналогичный base64-безопасный base64), вы получите 64 ^ 20 = 2 ^ 6 ^ 20 = 2 ^ 120 бит. Не совсем 128 (или 160 или 256) бит, так что вы можете сделать его длиннее, если хотите, но также учтите, что ожидаемая стоимость полосы пропускания для правильного предположения будет огромной, так что вам не нужно беспокоиться, пока вы счет за пропускную способность становится огромным.
Существует несколько дополнительных способов защиты ссылок:
- Использование HTTPS для снижения вероятности перехвата (они все равно будут незашифрованы между SMTP-серверами, если вы отправите ссылки по электронной почте)
- Не ссылайтесь ни на что, или, если вы делаете, ссылку через перенаправление HTTPS (в последний раз я проверял, многие веб-браузеры по-прежнему будут отправлять
Referer:
, пропуская "безопасный" URL, который вы просматривали ранее). В качестве альтернативы можно указать, чтобы при начальной загрузке был установлен неузнаваемый файл cookie сеанса secure
и перенаправлен на новый URL-адрес, действительный только для этого файла cookie сеанса.
Кроме того, вы можете изменить «блокировку», чтобы она по-прежнему работала без ущерба для удобства использования:
- Служить только после задержки. Каждый раз, когда вы отправляете документ или HTTP 404, увеличивайте задержку для этого IP. Вероятно, существует простой алгоритм асимптотического приближения к пределу скорости, но он должен быть более «прощающим» для первых нескольких запросов.
- Для каждого IP-адреса разрешается только один запрос за раз. Получив запрос, верните HTTP 5xx для любых существующих запросов (я забыл, какой из них «слишком высокая нагрузка на сервер»).
Даже если начальные задержки экспоненциально увеличиваются (то есть 1 с, 2 с, 4 с), «текущая» задержка не будет намного больше, чем время, необходимое для ввода всего URL. Если для ввода случайного URL-адреса вам потребуется 10 секунд, то еще 16 секунд для его загрузки не так уж и плохи.
Имейте в виду, что тот, кто хочет обойти ограничения на основе IP-адреса, может просто арендовать (часть полосы пропускания) ботнет.
Между прочим, я (немного) удивлен мнением Безымянной австралийской компании по разработке программного обеспечения о том, что случайно-сгенерированные пароли с низкой энтропией не являются проблемой, поскольку в вашей системе входа в систему должна быть CAPTCHA. Забавно, поскольку некоторые из этих паролей являются межсерверными.