Как я могу предотвратить отправку формы более одного раза в течение 5 минут? - PullRequest
8 голосов
/ 02 декабря 2011

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

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

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

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

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

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

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

Ответы [ 4 ]

3 голосов
/ 02 декабря 2011

Существует один очевидный способ исправить это, и проблема не в клиентской части - это в серверной части .

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

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

2 голосов
/ 02 декабря 2011

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

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

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

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

2 голосов
/ 02 декабря 2011

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

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

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

1 голос
/ 02 декабря 2011

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

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

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

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

enter image description here

...