КАПЧА кодов подтверждения PHP

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

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

У меня было некоторое использование плееров, автоматические отправляют функцию на Opera, и моя система КАПЧИ действительно останавливает их.

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

8
задан naugtur 19 April 2010 в 17:50
поделиться

2 ответа

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

новая идея

Поместите несколько отправленных изображений в вашу форму:

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

при создании формы получите случайное число от 1 до 8 и сохраните его в $ _ SESSION ['submitnumber'] . { {1}} создает два изображения одинакового размера - одно пустое, заполненное Фоном по умолчанию в форме, другое, похожее на кнопку отправки. create buttons.php, который выводит изображения с этим кодом:

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

и возвращает пустое изображение, если $ _ GET [i]! = $ _ SESSION ['submitnumber'] иначе вернет отправленное изображение.

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

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

старая идея

Вам понадобятся две вещи:

1 Сгенерировать токены для совершенно уникальных форм.

поместите и создайте "someweirdstring" как хеш 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 '. $ Date. $ TimeRoundedTo10Minutes);

//... 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 Измените свою кнопку отправки на , поскольку она публикует координаты x и y того места, где была нажата кнопка. Я понятия не имею, кто придумал это в спецификации, но это впервые! :)

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

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

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

6
ответ дан 5 December 2019 в 18:57
поделиться

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

Доказательствами могут быть:

  • пользовательский агент (ненадежный, потому что Opera может это подделать)
  • интервал срабатывания отправки (чем точнее вызов попадает, т.е. каждые 2 минуты, тем больше вероятность, что это bot)
  • если ваши данные позволяют проверять возвращаемые шаблоны, это тоже может быть очевидным
  • ...
3
ответ дан 5 December 2019 в 18:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: