Вопрос

Я запускаю игровой веб-сайт, поэтому у меня много пользователей вошли в систему, и они могут сделать определенные вещи раз в две минуты.

У меня есть система CAPTCHA в местах, и для некоторых вещей всегда будет просить код, а для прочего, он спросит один раз в 10 минут.

У меня были некоторые игроки используют функцию AUTO APLICE на Opera, и моя система CAPTCHA останавливает их.

Мой вопрос в том, как я могу минимизировать количество раз, когда я прошу код, но все равно останавливаю людей, используя этот авто -

Это было полезно?

Решение

Если я правильно понимаю, эта задача не требует капчи. Я предполагаю, что вы хотите посмотреть, нажал ли пользователь сам, сидя перед его ПК.

Новая идея

Поместите несколько изображений на ваш вид:

<input type="image" name="send1" src="buttons.php?i=1" />
...
<input type="image" name="send8" src="buttons.php?i=8" />

При генерации формы получите случайное число от 1 до 8 и сохранить его в $_SESSION['submitnumber']Отказ Создайте два одинакового размера изображения - один пустой заполнен вашим фоном по умолчанию в форме, другой выглядит как кнопка отправки. Создать кнопки .php, который выводят изображения с этим кодом:

header("Content-Type: image/jpeg");
flush();
readfile($filename);

и вернуть пустое изображение, если $_GET[i]!=$_SESSION['submitnumber'] еще вернуть представление изображения.

Примите форму, если нажал правильные iconbmit (браузер отправит вам координы, такие как send1x, когда пользователь нажимает кнопку)

Это тип капчи, но люди не будут знать;)

старая идея

Вам нужно две вещи:

1 Генерировать токены для форм, которые являются довольно уникальными.

помещать <input type="hidden" name="timertoken" value="someweirdstring" />и генерировать «quewewirdString», чтобы быть хеш-хедом MD5 (имя пользователя и время) -менданта. Я могу уточнить это, но это базовый токен формы для блокировки атак CSRF. Токен подтвержден после публикации.

пример:

Это нет Типичная реализация механизма токена, но этого будет достаточно.

$token=generatesomerandomtext();
$_SESSION['token']=$token; 

//... somewhere later when outputing forms:    
echo '<input type="hidden" name="token" value="'.$token.'" />';

//and when it comes back:
if($_POST['token']==$_SESSION['token']) {
   //it's ok
   }

И это все, что вам нужно. Этот простой пример создает уникальный токен для каждой страницы и ставит в формы. Это не зависимое от времени и не использует MD5, но хранит токен в сеансе. Чтобы автоматически отправить форму, которую будет принято, человек должен использовать форму, которую вы создали, либо скопируйте токен.

Пример токена реальной формы будет более похожим на это: $ Token = MD5 ($ username.some Secret Text Text '. $ Date. $ TimeRoundoedto10minutes);

//... somewhere later when outputing forms:    
echo '<input type="hidden" name="token" value="'.$token.'" />';

//and when it comes back:
if(
 ($_POST['token']==md5($username.'some secret text'.$date.$timeRoundedTo10Minutes)) ||
 ($_POST['token']==md5($username.'some secret text'.$date.$timeRoundedTo10Minutes-10minutes)) ) {
   //it's ok
   }

Почему имена пользователей? Поскольку он удаляет возможность использовать токены одного пользователя, чтобы взломать другого пользователя, почему секретный текст (называемый «солью»)? Потому что кто-то может придерживаться имени другого пользователя со временем и сделать MD5, но не догадая соль, которую он не может. Почему два сравнения? Потому что, если сейчас 22:44:59 - токен генерируется с 22:40, и если пользователь отправит его в 22:45:30, поэтому он закруглен до 22:50, и он соответствует токену только в том случае, если вы возьмете его назад 10 минут Отказ

Это все для основного примера. Для справки см это вопрос.

2 Измените кнопку «Отправить» в <input type="image" ... Поскольку он публикует координаты X и Y, где нажата кнопка. Я понятия не имею, кто придумал это в спецификации, но это первый раз, когда он может быть использован! :)

Теперь, чтобы посмотреть, нажмет ли пользователь, вам просто нужно посмотреть, присутствуют ли координаты (классическая отправка не отправит их) и заблокировать простой взлом этого, вы также можете вспомнить последний X и Y в сеансе проигрывателя и сравнить. Гораздо сложнее взломать его, чтобы отправить разные координаты каждый раз.

Токены формы здесь, чтобы предотвратить пользователей приготовить копию вашей формы со случайными полями, которые могли бы имитировать координаты кликов. Если токен меняется каждый раз, трудно переопределить поля формы.

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

Другие советы

В зависимости от данных, которые вы получаете, вы можете собрать квиденты, что вызывающий абонент является пользователем. Только попросите CAPTCHA, если звонящий, кажется, ботом.

Двидитены могут быть:

  • пользовательский агент (не надежен, потому что Opera может подделать это)
  • Интервал срабатывает отправку (тем точнее вызов попадает в то, что то есть каждые 2 минуты, чем более вероятно, что это бот)
  • Если ваши данные позволяют проверить возврат шаблонов, это может быть очевидным тоже
  • ...
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top