У меня есть игра, в которой мой JavaScript вызывает PHP-скрипты через POST для изменения значений в базе данных. Как я могу помешать кому-то неоднократно дублировать запрос и давать себе миллиард очков?
Сейчас я передаю пароль через sha1()
и проверяю, есть ли он на стороне PHP, но это не помешает кому-то повторить запрос.
Я не могу использовать временные метки, потому что время будет пропущено между вызовом (запрос JS POST) и запуском скрипта PHP.
Похоже, что большая часть этой логики теперь остается на стороне клиента, поэтому вы не можете помешать кому-то отправить «score.php? Score = 1000» несколько раз.
Добавьте логику на серверную сторону, которая проверяет, как часто может выполняться заданный запрос или, что еще лучше, выполнять логику игры полностью на сервере (так что пользователю не нужно будет отправлять свой собственный счет, а просто запрашивает определенное действие игры выполненный, в конечном итоге приводящий к оценке, который затем может быть добавлен пользователю).
Если у вас есть какой-либо идентификатор сеанса, вы можете увеличить количество запросов, которые были запрошены. Однако это не доказательство пули, однако очистка сеансовых файлов cookie позволит повторить этот запрос.
Вам понадобится некоторая форма входа, чтобы кто-то не очистил файлы cookie или даже цикл cURL-скрипта.
Редактировать:
В качестве меры стоп-пробела вы можете добавить форму защиты CSRF, для каждого запроса необходимо применять хеш одноразового использования, чтобы сделать его действительным.
Вы также можете передать флаг из сообщения, которое вы можете установить на любое значение, когда вы действительно хотите обновить значение в базе данных, иначе установите его на 0. И при обновлении проверьте значение флага и соответствующее его обновление.
что GET или POST могут быть легко выполнены клиентом. если вы просто отправляете необработанный счет на сервер, это никогда не будет хорошим. Я никогда не писал игру, где на клиенте возникает такая логика. клиентская сторона должна просто отправлять команды на сервер, и сервер решает, действительно ли это действительная транзакция / состояние. более или менее сервер знает состояние клиента, и клиент просто отражает это. это, пожалуй, единственный верный способ гарантировать, что то, что делает клиент, является законным.
Использовать captcha
Wiki CAPTCHA , reCAPTCHA
Кроме того, используйте Session
для записи number of repeated requests
сделанных моим пользователем на сервер, и increment
их на каждом успешном запросе,
Затем заблокируйте пользователя от доступа к вашему скрипту PHP с помощью данных session storage data
. PHP СЕССИИ