05.11.2014, 11:48
|
Новичок на форуме
|
|
Регистрация: 05.11.2014
Сообщений: 4
|
|
Можно ли отличить click() от реального нажатия?
Всем добрый день!
Допустим, имеется некий сайт, где есть некая кнопка. Мне хочется, чтобы её нажимали только люди, а некие умельцы нажимают эту кнопку не ручками, а делают на js что-то вроде:
var btn = document.getElementById('Btn')
btn.click();
Вопрос - есть ли какие-то способы отличить нажатие реального человека от выполнения подобного скрипта?
Для начала интересует именно простейший случай: есть только кнопка, нет никакой капчи и подобного.
Заранее извиняюсь, если вопрос задал не в соответствующем разделе или он где-то обсуждался.
|
|
05.11.2014, 13:23
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,589
|
|
Отличить можно. Но зависит от цели. В простейшем случае достаточно определить отлично ли от нуля положение курсора при событии:
<input type="button" value="button" id="Btn">
<input type="button" value="button.click()" onclick="document.getElementById('Btn').click()">
<script>
var btn = document.getElementById('Btn');
btn.addEventListener('click', function(event){
alert( event.clientX|event.clientY ? 'Вручную' : 'Скриптом' )
}, false)
</script>
Однако эти значения можно подставить и при искусственном вызове. Далее уже идут ухищрения для каждого браузера отдельно. Например в firefox есть свойство события isTrusted - который честно говорит вызвано событие скриптом или вручную.(в IE тоже есть такое свойство, только там оно не работает )
Если цель борьба с накруткой или подобное - лучше использовать готовые решения.
__________________
29375, 35
Последний раз редактировалось Aetae, 05.11.2014 в 13:27.
|
|
05.11.2014, 15:26
|
Новичок на форуме
|
|
Регистрация: 05.11.2014
Сообщений: 4
|
|
Сообщение от Aetae
|
Отличить можно. Но зависит от цели. В простейшем случае достаточно определить отлично ли от нуля положение курсора при событии:
<input type="button" value="button" id="Btn">
<input type="button" value="button.click()" onclick="document.getElementById('Btn').click()">
<script>
var btn = document.getElementById('Btn');
btn.addEventListener('click', function(event){
alert( event.clientX|event.clientY ? 'Вручную' : 'Скриптом' )
}, false)
</script>
Однако эти значения можно подставить и при искусственном вызове. Далее уже идут ухищрения для каждого браузера отдельно. Например в firefox есть свойство события isTrusted - который честно говорит вызвано событие скриптом или вручную.(в IE тоже есть такое свойство, только там оно не работает)
Если цель борьба с накруткой или подобное - лучше использовать готовые решения.
|
Огромное спасибо!
А если умельцы делают клик мыши, скажем, на делфях? Эмулируя клик в духе такого:
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, x, y, 0, 0);
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, x, y, 0, 0);
Есть ли тут шансы как-то такое определить?
|
|
05.11.2014, 15:45
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,589
|
|
Vlesk, простой ответ: конечно нет. Пользователь на своём компьютере может делать что угодно и слать какие угодно данные вам. Даже вообще без браузера бинарным образом.
Сложный ответ: можно провести исследования паттернов человеческого поведения, задержек нажатия, движения курсора, типичных реакций и т.д. ит.п. На основе этих данных производить отсеивание "роботов". Но это работа не на один день, требующая хорошей команды и серьёзной теоретической подготовки.
__________________
29375, 35
|
|
05.11.2014, 15:48
|
Новичок на форуме
|
|
Регистрация: 05.11.2014
Сообщений: 4
|
|
Сообщение от Aetae
|
Vlesk, простой ответ: конечно нет. Пользователь на своём компьютере может делать что угодно и слать какие угодно данные вам. Даже вообще без браузера бинарным образом.
Сложный ответ: можно провести исследования паттернов человеческого поведения, задержек нажатия, движения курсора, типичных реакций и т.д. ит.п. На основе этих данных производить отсеивание "роботов". Но это работа не на один день, требующая хорошей команды и серьёзной теоретической подготовки.
|
Понял, большое Вам спасибо за ответы!
|
|
05.11.2014, 19:40
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
Паранойя. Все можно стырить, все можно нажать так что х отличишь. И "паттерны" воспроизвести и мышь и кота и все что угодно - было бы ради чего.
Насчет паттернов. Есть такая технология, ну проект короче, которой вводишь пароль методом игры в какую-то хрень непонятную. Типа у всех людей есть своя ... идиомоторика и если даже не написать авторучкой, а выссать на снегу матерное слово - то и в этом случае по почерку можно найти хулигана (Стругацкие).
Как-то незаметно проявления той системы авторизации.
|
|
05.11.2014, 19:42
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
Сообщение от Vlesk
|
а делают на js что-то вроде:
|
Грамотные смотрят что там вызывается и вызывают сразу то, что вызывается. Незачем нажимать даже.
|
|
05.11.2014, 21:38
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,589
|
|
Кстати да, ещё можно смотреть откуда идёт вызов:
<input type="button" value="button" id="Btn">
<input type="button" value="button.click()" onclick="document.getElementById('Btn').click()">
<script>
var btn = document.getElementById('Btn');
btn.addEventListener('click', function ev(event){
alert( ev.caller )
}, false)
</script>
само собой тоже совершенно не надёжно.)
__________________
29375, 35
Последний раз редактировалось Aetae, 05.11.2014 в 21:42.
|
|
05.11.2014, 23:30
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,589
|
|
Poznakomlus, эмулировать рандомный маусклик не проблема же.
__________________
29375, 35
|
|
05.11.2014, 23:44
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,589
|
|
Poznakomlus, эмулировать мышь же, напрямую. "Обычным" программированием особо не занимался, но куча софта так может. Сам периодически юзаю AutoHotkey например.
__________________
29375, 35
|
|
|
|