Предотвращение спама функционала php-страницыPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Предотвращение спама функционала php-страницы

Сообщение Anonymous »

Предыстория:
Хорошо, я запускаю устаревшую 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»