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 например.

Vlesk 06.11.2014 09:50

Цитата:

Сообщение от Poznakomlus (Сообщение 339273)
Aetae,
это как по точкам окна кликать? Элементы html (их классы) исполняются в браузере и им сообщение не отправишь в окнах. Ты не получишь идентификатор HWND которому тебе нужно послать сообщение. А так можно и молотком по экрану.

Тыкнуть по заданным координатам можно элементарно в делфях/c++. К примеру, см. в гугле про SetCursorPos() и Mouse_Event(). Если не знакомы, то кругозору ради рекомендую. Хотя бы будете представлять возможность, а может и в работе пригодится.
Вопрос скорее в том, как найти нужные координаты.

Я лично делал в делфях такой алгоритм нажатия кнопки:
1. Определить координаты нужной кнопки
1.1 снимаем скриншот окна программы, в которой открыт нужный сайт
1.2 находим координаты изображения нужной кнопки (тупой поиск одного BitMap в другом)
1.3 рассчитываем абсолютные координаты центра искомой кнопки

2. Тыкнуть мышкой
2.1 спозиционировать курсор по координатам из 1.3
2.2 послать клик мыши

Лично у меня на реализацию такого метода ушёл один час.

На несколько часов больше у меня ушло на другое решение (но это больше академический интерес, в реальных проектах используется обычно метод, описанный выше):
1. Определить координаты нужной кнопки
1.1 в TСhromium (для тех, кто не в курсе - это компонент хромиума для delphi) на js определяем координаты нужного контрола внутри окна браузера (хромиум в нашей программе на делфях)
1.2 по get-запросу шлём php-скрипту (сервер поднят локально) координаты контрола, php-скрипт их сохраняет в файл (не придумал я как лучше из js передать значения во внешний мир)
1.3 считать в нашей программе координаты элемента из 1.2, рассчитать абсолютные координаты центра искомой кнопки
...

Вот я в двух словах описал целых два рабочих метода нахождения координат нужного элемента на веб-странице.
Так что кто несёт херню ещё вопрос :)
Не всегда нужны HWND нужных контролов, шире мыслить надо ;)

Да, не изящно, но цель оправдывала средства.

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

Aetae 06.11.2014 12:50

Poznakomlus, тебя foo укусил?(или ты перелогиниться забыл?)
Вроде ты адекватный был...

Aetae 06.11.2014 13:04

Вложений: 1
Poznakomlus, на своём компе человек может делать что хочет, что за глупости ты несёшь? WinApi не работает тоько потому что у веб страниц совершенно иная архитектура и разработчикам браузера нет никакого резона поддерживать костыли для совместимости.(кстати в ie6 ещё вроде пытались) Ничто не мешает эмулировать сам клик о чём и говорит оп.
Прикрепляю скомпилированный скрипт, который кликает по точке 200, 200 независимо от того какое приложение запущено:

Aetae 06.11.2014 13:25

Poznakomlus, ты вообще читал что он пишет? Да с помощью winapi найти тот же div нельзя. Но, блядь, можно найти его тупо сравнивая картинку. Также можно найти его используя api самого, ебать его в интерфейс, браузера. Чего тебе не понятно?

Aetae 06.11.2014 13:58

Poznakomlus, иди ка проспись.

Vlasenko Fedor 06.11.2014 14:14

Зароботался, был не прав :)

kostyanet 06.11.2014 22:23

Сделал свой браузер и нажимай там что хочешь. При чем тут делфи-мелфи - да в любом VB, WS все это имеется. Причем в VB есть готовый браузер с почти полным контролем за внутренностями и наружностями. Яндекс-браузеры так все и сделаны.

Так что нет смысла и думать как не дать кому-то нажать куда-то. Никому там нахер и не надо у вас нажимать. По определению.

И главное, откуда он вообще узнает кто нажал? Скрипт ему что ли расскажет? Ахуеть - так он уже выброшен и на его место вброшен другой. КОторый все и расскажет по-правде.

kostyanet 06.11.2014 22:33

Кстати, я когда на JS еще не умел писать (на веб-JS в смысле) то применил кнопкожиматель на VB. То есть это был экзешник который открывал в браузере исходный код и парсил его. А поскольку дизайн не меняется годами то обучить прогу нажимать куда надо на том сайте согласно отпарсенным данным не составляло труда. Это был пиндец, в смысле по сравнению с тем, когда я все-таки заставил себя освоить веб-скрипты. Нахер там вообще куда-то нажимать - посмотрел какие заголовки уходят - отправляй такие же, со своими данными и смотри как ее колбасит.


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