Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Можно ли отличить click() от реального нажатия? (https://javascript.ru/forum/events/51380-mozhno-li-otlichit-click-ot-realnogo-nazhatiya.html)

Vlesk 05.11.2014 11:48

Можно ли отличить click() от реального нажатия?
 
Всем добрый день!
Допустим, имеется некий сайт, где есть некая кнопка. Мне хочется, чтобы её нажимали только люди, а некие умельцы нажимают эту кнопку не ручками, а делают на js что-то вроде:

var btn = document.getElementById('Btn')
btn.click();


Вопрос - есть ли какие-то способы отличить нажатие реального человека от выполнения подобного скрипта?

Для начала интересует именно простейший случай: есть только кнопка, нет никакой капчи и подобного.

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

Aetae 05.11.2014 13:23

Отличить можно. Но зависит от цели. В простейшем случае достаточно определить отлично ли от нуля положение курсора при событии:
<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 тоже есть такое свойство, только там оно не работает:))
Если цель борьба с накруткой или подобное - лучше использовать готовые решения.

Vlesk 05.11.2014 15:26

Цитата:

Сообщение от Aetae (Сообщение 339115)
Отличить можно. Но зависит от цели. В простейшем случае достаточно определить отлично ли от нуля положение курсора при событии:
<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);

Есть ли тут шансы как-то такое определить?

Aetae 05.11.2014 15:45

Vlesk, простой ответ: конечно нет. Пользователь на своём компьютере может делать что угодно и слать какие угодно данные вам. Даже вообще без браузера бинарным образом.

Сложный ответ: можно провести исследования паттернов человеческого поведения, задержек нажатия, движения курсора, типичных реакций и т.д. ит.п. На основе этих данных производить отсеивание "роботов". Но это работа не на один день, требующая хорошей команды и серьёзной теоретической подготовки.

Vlesk 05.11.2014 15:48

Цитата:

Сообщение от Aetae (Сообщение 339145)
Vlesk, простой ответ: конечно нет. Пользователь на своём компьютере может делать что угодно и слать какие угодно данные вам. Даже вообще без браузера бинарным образом.

Сложный ответ: можно провести исследования паттернов человеческого поведения, задержек нажатия, движения курсора, типичных реакций и т.д. ит.п. На основе этих данных производить отсеивание "роботов". Но это работа не на один день, требующая хорошей команды и серьёзной теоретической подготовки.

Понял, большое Вам спасибо за ответы!

kostyanet 05.11.2014 19:40

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

Насчет паттернов. Есть такая технология, ну проект короче, которой вводишь пароль методом игры в какую-то хрень непонятную. Типа у всех людей есть своя ... идиомоторика и если даже не написать авторучкой, а выссать на снегу матерное слово - то и в этом случае по почерку можно найти хулигана (Стругацкие).

Как-то незаметно проявления той системы авторизации.

kostyanet 05.11.2014 19:42

Цитата:

Сообщение от Vlesk
а делают на js что-то вроде:

Грамотные смотрят что там вызывается и вызывают сразу то, что вызывается. Незачем нажимать даже.

Aetae 05.11.2014 21:38

Кстати да, ещё можно смотреть откуда идёт вызов:
<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>
само собой тоже совершенно не надёжно.)

Aetae 05.11.2014 23:30

Poznakomlus, эмулировать рандомный маусклик не проблема же.

Aetae 05.11.2014 23:44

Poznakomlus, эмулировать мышь же, напрямую. "Обычным" программированием особо не занимался, но куча софта так может. Сам периодически юзаю AutoHotkey например.


Часовой пояс GMT +3, время: 06:51.