Хорошо, я запускаю устаревшую BBG на ninjawars.net. Существует «атака», которую игроки могут совершать на других игроков, которая инициализируется через сообщение формы. По сути, мы можем упростить ситуацию, представив, что есть страница, назовем ее Attack.php, с гигантским сообщением формы «АТАКА», которое отправляется на другую php-страницу, назовем ее Accept_attack.php, и вторая страница выполняет атаку. функциональность, скажем, убийство другого игрока 1, 2 или 3.
На сервере работают PHP5, Postgresql, Apache
Проблемы:
- Если я нажму большую кнопку «АТАКА», и это приведет меня к файлу Accept_attack.php, я могу затем нажать «Обновить» три раза, каждый раз повторно отправляя, чтобы снова атаковать три раза в последовательность.
- Если я открою три вкладки на первой странице и нажму «Атака» на каждой странице, я получу три мгновенные атаки, которые убьют игроков 1, 2 и 3 одновременно. , и я могу просто постоянно обновлять повтор.
- Несмотря на мои попытки сохранить таймер «последней атаки» в базе данных, игроки, похоже, могут обойти это, возможно, просто обновив три скопированные вкладки в достаточно синхронизированным способом, чтобы все они могли получить один и тот же таймер (например. 10:00:00:0000 am) и таким образом продолжить результирующую обработку.
Так как мне предотвратить одновременную обработку определенного сценария в трех экземплярах?
Php, Социальная инженерия, и/или предпочтительные решения javascript/jQuery (вероятно, примерно в этом порядок).
Редактировать:
Основываясь на ответах, вот что я сделал, чтобы (возможно, перед стресс-тестированием) решить эту проблему:
Сеанс Ответ показался мне самым простым и понятным для реализации, поэтому я использовал это хранилище данных. Я проверил это, и кажется, что это работает, но могут быть способы обойти это, о которых я не знаю.
Код: Выделить всё
$recent_attack = null;
$start_of_attack = microtime(true);
$attack_spacing = 0.2; // fraction of a second
if(SESSION::is_set('recent_attack')){
$recent_attack = SESSION::get('recent_attack');
}
if($recent_attack && $recent_attack>($start_of_attack-$attack_spacing)){
echo "
Even the best of ninjas cannot attack that quickly.
";
echo "[url=attack_player.php]Return to combat[/url]";
SESSION::set('recent_attack', $start_of_attack);
die();
} else {
SESSION::set('recent_attack', $start_of_attack);
}
Подробнее здесь: https://stackoverflow.com/questions/147 ... a-php-page
Мобильная версия