Можно ли отличить click() от реального нажатия?
Всем добрый день!
Допустим, имеется некий сайт, где есть некая кнопка. Мне хочется, чтобы её нажимали только люди, а некие умельцы нажимают эту кнопку не ручками, а делают на js что-то вроде: var btn = document.getElementById('Btn') btn.click(); Вопрос - есть ли какие-то способы отличить нажатие реального человека от выполнения подобного скрипта? Для начала интересует именно простейший случай: есть только кнопка, нет никакой капчи и подобного. Заранее извиняюсь, если вопрос задал не в соответствующем разделе или он где-то обсуждался. |
Отличить можно. Но зависит от цели. В простейшем случае достаточно определить отлично ли от нуля положение курсора при событии:
<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); Есть ли тут шансы как-то такое определить? |
Vlesk, простой ответ: конечно нет. Пользователь на своём компьютере может делать что угодно и слать какие угодно данные вам. Даже вообще без браузера бинарным образом.
Сложный ответ: можно провести исследования паттернов человеческого поведения, задержек нажатия, движения курсора, типичных реакций и т.д. ит.п. На основе этих данных производить отсеивание "роботов". Но это работа не на один день, требующая хорошей команды и серьёзной теоретической подготовки. |
Цитата:
|
Паранойя. Все можно стырить, все можно нажать так что х отличишь. И "паттерны" воспроизвести и мышь и кота и все что угодно - было бы ради чего.
Насчет паттернов. Есть такая технология, ну проект короче, которой вводишь пароль методом игры в какую-то хрень непонятную. Типа у всех людей есть своя ... идиомоторика и если даже не написать авторучкой, а выссать на снегу матерное слово - то и в этом случае по почерку можно найти хулигана (Стругацкие). Как-то незаметно проявления той системы авторизации. |
Цитата:
|
Кстати да, ещё можно смотреть откуда идёт вызов:
<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>само собой тоже совершенно не надёжно.) |
Poznakomlus, эмулировать рандомный маусклик не проблема же.
|
Poznakomlus, эмулировать мышь же, напрямую. "Обычным" программированием особо не занимался, но куча софта так может. Сам периодически юзаю AutoHotkey например.
|
Цитата:
Вопрос скорее в том, как найти нужные координаты. Я лично делал в делфях такой алгоритм нажатия кнопки: 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 нужных контролов, шире мыслить надо ;) Да, не изящно, но цель оправдывала средства. Т.к. оба этих варианта делаются элементарно и любой школьник с мозгами, отличными от макаки, сможет до этого додуматься, и самое главное, сделать на коленке, то вот я и задумался об обратной ситуации - защите от таких решений. |
Poznakomlus, тебя foo укусил?(или ты перелогиниться забыл?)
Вроде ты адекватный был... |
Вложений: 1
Poznakomlus, на своём компе человек может делать что хочет, что за глупости ты несёшь? WinApi не работает тоько потому что у веб страниц совершенно иная архитектура и разработчикам браузера нет никакого резона поддерживать костыли для совместимости.(кстати в ie6 ещё вроде пытались) Ничто не мешает эмулировать сам клик о чём и говорит оп.
Прикрепляю скомпилированный скрипт, который кликает по точке 200, 200 независимо от того какое приложение запущено: |
Poznakomlus, ты вообще читал что он пишет? Да с помощью winapi найти тот же div нельзя. Но, блядь, можно найти его тупо сравнивая картинку. Также можно найти его используя api самого, ебать его в интерфейс, браузера. Чего тебе не понятно?
|
Poznakomlus, иди ка проспись.
|
Зароботался, был не прав :)
|
Сделал свой браузер и нажимай там что хочешь. При чем тут делфи-мелфи - да в любом VB, WS все это имеется. Причем в VB есть готовый браузер с почти полным контролем за внутренностями и наружностями. Яндекс-браузеры так все и сделаны.
Так что нет смысла и думать как не дать кому-то нажать куда-то. Никому там нахер и не надо у вас нажимать. По определению. И главное, откуда он вообще узнает кто нажал? Скрипт ему что ли расскажет? Ахуеть - так он уже выброшен и на его место вброшен другой. КОторый все и расскажет по-правде. |
Кстати, я когда на JS еще не умел писать (на веб-JS в смысле) то применил кнопкожиматель на VB. То есть это был экзешник который открывал в браузере исходный код и парсил его. А поскольку дизайн не меняется годами то обучить прогу нажимать куда надо на том сайте согласно отпарсенным данным не составляло труда. Это был пиндец, в смысле по сравнению с тем, когда я все-таки заставил себя освоить веб-скрипты. Нахер там вообще куда-то нажимать - посмотрел какие заголовки уходят - отправляй такие же, со своими данными и смотри как ее колбасит.
|
Часовой пояс GMT +3, время: 07:49. |