Как я могу предотвратить отправку формы более одного раза в течение 5 минут?

StackOverflow https://stackoverflow.com/questions/8351470

Вопрос

Недавно я обнаружил огромную проблему безопасности в своей системе PM, которая позволяет пользователям отправлять сообщения столько, сколько они хотят, с for зацикливайтесь в адресной строке.Кто-то ввел это в адресную строку:

javascript:for(x=0;x<10000;x++){ $('#compose form').submit(); }

И сообщение было отправлено мне 1000 раз, и мой почтовый ящик был полон одного и того же сообщения, а моя база данных была настолько переполнена, что phpMyAdmin сильно отставал.

Мой вопрос в том, как я могу предотвратить это?Это такой майор проблема.

Кроме того, форма отправляется с помощью AJAX.

Редактировать:

Я использую PHP, так как же я могу предотвратить это?Например, как я мог бы сделать так, чтобы сообщение можно было отправлять только каждые 5 минут или около того, и если они отправят более одного в течение 5 минут, это выдаст ошибку (или вообще не покажет никаких отзывов пользователей и просто остановит их отправку)?

Это было полезно?

Решение

Есть один очевидный способ исправить это, и проблема заключается не на стороне клиента - он находится на стороне сервера.

Ваш серверный скрипт не должен разрешать отправку сообщений слишком часто - например.чаще, чем, скажем, раз в 10 минут.Чтобы сделать это, вы можете использовать механизм сеанса на стороне сервера и сохраните информацию, когда пользователь отправил электронное письмо.Если пользователь не отправил электронное письмо, вы также должны сохранить эту информацию в сеансе - чтобы отличать людей с включенным сеансом от людей с отключенным сеансом (и вы должны вообще запретить последним отправлять электронные письма).

Способ реализации сеанса (конкретный код) зависит от языка, который вы используете для написания сценариев на стороне сервера (PHP, Python, JSP и т.д.).

Другие советы

Если у кого-то есть знания, чтобы сделать это с вами, вы, вероятно, ничего не сможете сделать на стороне клиента, поэтому единственный вариант, который я бы сказал, это то, что вы регистрируете или ведете подсчет и т.д. Количества запросов (возможно, к определенному ресурсу) и отклоняете запрос (или отправляете HTTP-код "занято" и т.д.) Для конкретного пользователя.

Я думаю, что самым простым способом было бы подсчитать запросы с определенного IP-адреса (это, очевидно, имеет недостатки, такие как несколько пользователей за прокси или NAT и т.д.).

Фактическое решение будет зависеть от вашего серверного языка и веб-сервера, но, возможно, вы могли бы создать правило и посмотреть, как оно работает.Что-то вроде 5 запросов в минуту (или все, что подходит для вашего использования) на IP-адрес.

Как уже говорили другие, вы должны внедрить защиту на сервере.Никакое количество клиентского кодирования не обеспечит защиту.

Распространенный способ защиты сервера от такого типа злоупотреблений называется rate limiting.Вы решаете, как часто вы хотите, чтобы данный клиент мог отправлять сообщение, и вы кодируете сервер так, чтобы он игнорировал любые сообщения, выходящие за пределы этого ограничения.

Например, вы могли бы решить, что будете разрешать не более одного сообщения в минуту, не более двух сообщений каждые 10 минут и не более четырех сообщений в час.Вы выбираете все, что, по вашему мнению, кажется разумным, и программируете в соответствии с этим алгоритмом.

На вашем сервере вы должны были бы иметь возможность определить, от какого пользователя пришло сообщение (скорее всего, с помощью файла cookie аутентификации), а в вашей базе данных вы должны были бы иметь возможность узнать, когда этим пользователем было отправлено последнее сообщение.Возможно, вы даже сможете кэшировать эту информацию в оперативной памяти вашего сервера (в зависимости от того, как работает ваш сервер), чтобы избежать поиска в базе данных при каждом запросе, поскольку вам нужно сохранять только свежую информацию и оптимизировать производительность только для рецидивистов (тех, кто пытается злоупотребить вашим сервером и, следовательно, совсем недавно отправил запрос).

Я согласен с тем, что все пишут об ограничении скорости.

Однако это может быть очень сложно реализовать на стороне сервера.Особенно когда вы начинаете масштабироваться.И, честно говоря, если 1000 сообщений так сильно ранят вас - мое предложение может быть применимо к вам еще сильнее.

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

Одной из их особенностей является, в частности, регулирование скорости API.(смотрите ссылку)

enter image description here

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top