Подтвердите, что пользователь Android является человеком (без CAPTCHA)

У меня есть приложение, в котором пользователи могут добавлять оценки, и я не хочу, чтобы они регистрировались для этого, но я также не хочу, чтобы боты могли легко играть с оценками.

Есть ли способ, которым я могу быть разумно (не обязательно на 100%, но я не хочу использовать реактивные эвристические методы) уверен, что мои пользователи — люди? Без необходимости ввода CAPTCHA/входа/других действий. Обычно я бы сказал, что это невозможно, но поскольку мое приложение работает на Android, я думаю, что мы можем сделать лучше, чем ничего.

адрес Gmail.

Моя первая мысль состояла в том, чтобы получить их адрес gmail от AccountManager, но я не вижу способа проверить, что им принадлежит этот адрес электронной почты, т.е. бот мог бы просто отправлять выдуманные электронные письма на мой сервер, так что я не думаю, что это может работать (и я не хочу, чтобы они аутентифицировали мое приложение, используя свою учетную запись Google; они вряд ли будут это делать).

ГКМ

Моей следующей мыслью было использовать Google Cloud Messaging. Я могу получить идентификатор облачного обмена сообщениями с устройства, отправить его на свой сервер, отправить случайное облачное сообщение с сервера обратно на устройство и отправить это сообщение обратно на сервер. Я думаю, это, по крайней мере, подтверждает, что у них есть устройство Android с учетной записью Gmail, что достаточно хорошо.

смс

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

Сервер лицензирования Android

Возможно, можно использовать библиотеку проверки лицензий, чтобы получить подписал заверение Google в том, что пользователь загрузил его из магазина, но из-за характера моего приложения я не могу разместить его на рынке.

Идентификатор устройства, EMEI, номер телефона и т. д.

Конечно, я не могу использовать их. Боты могли их просто выдумать!

Так что GCM выглядит лучшим (и единственным) вариантом. Кто-нибудь может придумать что-нибудь еще?


person Timmmm    schedule 18.10.2012    source источник
comment
поместите закрытый ключ в свой apk, загрузите с вашего сервера случайный текст, отправьте его обратно в зашифрованном виде, вы узнаете, что он исходит из вашего apk. хотя ваш GCM, вероятно, тоже работает   -  person njzk2    schedule 18.10.2012
comment
Если бот может получить закрытый ключ из декомпилированного APK, это то же самое.   -  person Ragunath Jawahar    schedule 18.10.2012
comment
Ах, мне нравится идея с закрытым ключом. Очевидно, что его можно взломать, приложив достаточно усилий, но я мог бы усложнить его.   -  person Timmmm    schedule 18.10.2012
comment
Я думаю, что это может содержать ответ! Однако он только что был выпущен: android-developers.blogspot.co.uk/2013/01/   -  person Timmmm    schedule 09.01.2013


Ответы (2)


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

OR

Используя API перетаскивания, попросите пользователя перетащить кнопку в какую-либо область экрана, а затем отправить оценку. Вы можете рандомизировать размещение кнопки.

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

person AZ_    schedule 18.10.2012
comment
Звучит как хромая версия традиционной CAPTCHA. Я пытаюсь избежать пользовательского ввода. - person Timmmm; 18.10.2012
comment
Я не думаю, что ОП беспокоится о том, что бот автоматизирует его приложение для Android для отправки фиктивных отзывов. Думаю, его беспокоит работающий на ПК бот, который по протоколу HTTP отправляет отзывы на его сервер, делая вид, что они были отправлены из его приложения. - person mbeckish; 18.10.2012

Поскольку вы контролируете обе стороны коммуникации, вы можете сделать что-то вроде этого:

Поток

  1. Приложение: Запрос одноразового секретного токена с сервера.
  2. Сервер: создайте одноразовый секретный токен и идентификатор отслеживания и отправьте их в приложение, отслеживая при этом секретный токен с помощью идентификатора отслеживания.
  3. Приложение: зашифровать голосование с помощью одноразового секретного токена (о шифровании см. ниже)
  4. Приложение: отправить зашифрованное сообщение и идентификатор отслеживания на сервер.
  5. Сервер: найдите секретный токен с помощью идентификатора отслеживания, убедитесь, что он еще не использовался, и расшифруйте голосование с помощью секретного токена.

Шифрование

Вы можете использовать любую технологию симметричного шифрования. Очень простым примером может быть XOR вашего сообщения (т.е. голосования) с секретным токеном на стороне приложения. На стороне сервера XOR снова с тем же секретным токеном снова дает простое сообщение.

Этот метод безопасен до тех пор, пока ваш метод шифрования не известен злоумышленнику. Если известно, конечно, что он может просто имитировать запросы, которые делает приложение, но это будет справедливо для каждого метода, поэтому вам, вероятно, следует использовать что-то лучше, чем простое XOR.

person Ridcully    schedule 19.10.2012
comment
На самом деле это не требует человека, но требует вашего приложения. Как объяснено, это не может быть подделано ботом/скриптом, отправляющим запросы непосредственно на ваш сервер. - person Ridcully; 19.10.2012
comment
Ах, то же самое, что и предложение njzk2. Практически просто подпишите запросы с помощью секретного ключа, содержащегося в приложении. Я не думаю, что что-либо еще повышает безопасность. - person Timmmm; 19.10.2012
comment
Это повышает безопасность, поскольку секретный ключ не включен в приложение, поэтому декомпиляция APK не обнаружит его. А используя одноразовые токены, вы можете избежать многократного голосования одним и тем же человеком — если это вас беспокоит. - person Ridcully; 19.10.2012
comment
Нет, по сути ваша схема заключается в том, что приложение содержит секрет. Ваш секрет — это алгоритм, а njzk2 — это ключ, но с точки зрения безопасности между ними нет никакой разницы. - person Timmmm; 20.10.2012