Как я могу предотвратить отправку формы более одного раза в течение 5 минут?
недавно я обнаружил огромную проблему безопасности с моей системой PM, которая позволяет пользователям отправлять сообщения столько, сколько они хотят с for
цикл в адресной строке. Кто-то положил это в адресную строку:
javascript:for(x=0;x<10000;x++){ $('#compose form').submit(); }
и сообщение было отправлено мне 1000 раз, и мой почтовый ящик был полон того же сообщения, и моя база данных была настолько полна, что phpMyAdmin был очень ЛАГ.
мой вопрос, как я могу предотвратить это? Это основные вопрос.
кроме того, форма отправляется с помощью AJAX.
Edit:
Я использую PHP, так как я могу это предотвратить? Например, как я могу сделать это, где сообщение может быть отправлено только каждые 5 минут или около того, и если они отправят более одного в течение 5 минут, он отобразит ошибку (или не покажет никаких отзывов пользователей вообще и просто остановит его от отправки)?
4 ответов
есть один очевидный способ исправить это, и проблема лежит не на стороне клиента -Он расположен на стороне сервера.
код сценарий сервера не должен позволять отправлять сообщения слишком часто - ЭГ. чаще, чем, скажем, раз в 10 минут. Для этого вы можете использовать сессии на стороне сервера и сохранить информацию, когда пользователь отправил сообщение. Если пользователь не отправил по электронной почте, вы также должны сохранить эту информацию в сессии различайте людей с включенным сеансом от людей с отключенным сеансом (и вы должны заблокировать последнего от отправки электронных писем вообще).
способ реализации сеанса (конкретный код) зависит от языка, который вы используете для сценариев на стороне сервера (PHP, Python, JSP и т. д.).
Если у кого-то есть знания, чтобы сделать это с вами, вы, вероятно, ничего не можете сделать на стороне клиента, поэтому единственный вариант, я бы сказал, что вы регистрируете или ведете счет и т. д. количества запросов (возможно, к определенному ресурсу) и отказываете в запросе (или отправляете "занятой" http-код и т. д.) для конкретного пользователя.
Я думаю, что самым простым способом было бы подсчитать запросы от определенного IP-адреса (это, очевидно, имеет недостатки, такие как несколько пользователей за прокси или NAT п.)
фактическое решение будет зависеть от вашего языка на стороне сервера и веб-сервера, но вы можете создать правило и посмотреть, как оно работает. Что-то вроде 5 запросов в минуту (или все, что подходит для вашего использования) на IP-адрес.
Как говорили другие, вы должны реализовать защиту на сервере. Никакое количество клиентского кодирования не обеспечит защиту.
общий способ защиты сервера от такого рода злоупотреблений называется rate limiting
. Вы сами решаете, как часто вы хотите, чтобы данный клиент мог отправить сообщение и код сервера, чтобы игнорировать любые сообщения, выходящие за этот предел.
например, вы можете решить, что вам позволят не более одного сообщения в минуту и не более двух сообщений каждые 10 минут и не более четырех сообщений в час. Вы выбираете то, что считаете разумным, и кодируете этот алгоритм.
на вашем сервере вы должны были бы определить, от какого пользователя пришло сообщение (скорее всего, через файл cookie аутентификации), и в вашей базе данных вы должны были бы узнать, когда последнее сообщение было отправлено этим пользователем. Вы даже можете кэшировать эту информацию в ОЗУ на своем сервере (в зависимости от как работает ваш сервер), чтобы избежать поиска базы данных по каждому запросу, так как вам нужно только сохранить последнюю информацию, и вам нужно только оптимизировать производительность на повторных нарушителях (те, которые пытаются злоупотреблять вашим сервером и, таким образом, только недавно отправили запрос).
Я согласен с тем, что все сообщения об ограничении скорости.
, Это может быть очень сложно реализовать на стороне сервера. Особенно когда начинаешь масштабироваться. И, честно говоря, если 1000 сообщений причинили вам такую боль - мое предложение может относиться к вам еще больше.вместо того, чтобы реализовать это самостоятельно, вы можете посмотреть на стороннюю службу, чтобы сделать это за вас, например, этот супер крутой прокси-сервер веб-служб Apigee
одной из их особенностей является, в частности, регулирование скорости API. (см. ссылку)