Не позволяя сценаристам захлопнуть ваш сайт - PullRequest
486 голосов
/ 16 января 2009

Я принял ответ, но, к сожалению, я думаю, что мы застряли в нашем исходном сценарии наихудшего случая: CAPTCHA каждый на попытки покупки дерьма . Краткое объяснение: кэширование / веб-фермы делают невозможным отслеживание хитов, и любой обходной путь (отправка не кэшированного веб-маяка, запись в объединенную таблицу и т. Д.) Замедляет работу сайта хуже, чем это делают боты. Вероятно, есть какое-то дорогостоящее аппаратное обеспечение от Cisco или подобное, которое может помочь на высоком уровне, но трудно оправдать стоимость, если CAPTCHA для всех является альтернативой. Позже я попытаюсь дать более полное объяснение, а также очистить его для будущих поисковиков (хотя другие могут попробовать, поскольку это вики сообщества).

Положение

Речь идет о распродажах на сайте woot.com. Я президент Woot Workshop, дочерней компании Woot, которая занимается дизайном, пишет описания продуктов, подкасты, сообщения в блогах и модерирует форумы. Я работаю с CSS / HTML и едва знаком с другими технологиями. Я тесно сотрудничаю с разработчиками и обсудил все ответы здесь (и многие другие идеи, которые у нас были).

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

Боты отбрасывают нашу главную страницу десятки раз за секунду, просматривая экран (и / или сканируя наш RSS) для продажи Случайного Дерьма. В тот момент, когда они видят это, он запускает второй этап программы, которая входит в систему, нажимает кнопку «Мне нужен один», заполняет форму и покупает дерьмо.

Оценка

lc : На stackoverflow и других сайтах, использующих этот метод, они почти всегда имеют дело с аутентифицированными (вошедшими в систему) пользователями, поскольку для выполняемой задачи требуется это.

На Woot анонимные (не зарегистрированные) пользователи могут просматривать нашу домашнюю страницу. Другими словами, захлопывающие боты могут быть не аутентифицированы (и, по сути, не отслеживаются, кроме как по IP-адресу).

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

О, и если бы люди звонили нам, это был бы наихудший сценарий. Можем ли мы заставить их позвонить вам?

BradC : методы Неда Батчелдера выглядят довольно круто, но они достаточно твердо разработаны, чтобы победить ботов, созданных для сети сайтов. Наша проблема в том, что боты созданы специально для победы над нашим сайтом. Некоторые из этих методов могут работать недолго, пока сценаристы не разовьют своих ботов, чтобы игнорировать honeypot, просматривать экранные имена соседних меток вместо идентификаторов форм и использовать элемент управления браузером с поддержкой javascript.

lc again : «Если, конечно, реклама не является частью вашей маркетинговой схемы». Да, это определенно так. Удивление того, когда предмет появляется, а также волнение, если вам удастся его получить, вероятно, столь же или более важно, чем дерьмо, которое вы фактически получаете в итоге. Все, что исключает «первым пришел / первым обслужен», отрицательно сказывается на «выигрыше» дерьма.

novatrust : И я, например, приветствую наших новых повелителей ботов. На самом деле мы предлагаем RSS-каналы, позволяющие сторонним приложениям сканировать наш сайт на предмет информации о продукте, но не опережая основной сайт HTML. Если я правильно понимаю, ваше решение помогает цели 2 (проблемы с производительностью), полностью жертвуя целью 1 и просто отказываясь от того факта, что боты будут покупать большую часть дерьма. Я проголосовал за ваш ответ, потому что ваш последний пессимизм кажется мне точным. Кажется, здесь нет серебряной пули.

Остальные ответы, как правило, основаны на отслеживании IP-адресов, которые, опять-таки, кажутся бесполезными (с ботнетами / зомби / облачными сетями) и вредными (ловят многих невинных, которые прибывают из пунктов назначения с одинаковым IP).

Есть ли другие подходы / идеи? Мои разработчики продолжают говорить «давайте просто сделаем CAPTCHA», но я надеюсь, что есть все менее навязчивые методы для всех реальных людей, желающих получить немного нашего дерьма.

Оригинальный вопрос

Скажем, вы продаете что-то дешевое, что имеет очень высокую воспринимаемую стоимость, а у вас очень ограниченное количество. Никто точно не знает, когда вы продадите этот предмет. И более миллиона человек регулярно приходят посмотреть, что вы продаете.

В итоге вы получаете сценаристов и ботов, пытающихся программно [а] выяснить, когда вы продаете указанный товар, и [б] убедитесь, что они одними из первых купили его. Это отстой по двум причинам:

  1. Ваш сайт захвачен не людьми, замедляя все для всех.
  2. Сценаристы в итоге «выигрывают» продукт, заставляя завсегдатаев чувствовать себя обманутыми.

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

  • Пользовательский опыт - отстой для людей, поскольку они должны расшифровать CAPTCHA, выбрать кота или решить математическую задачу.
  • Если воспринимаемая выгода достаточно высока, а толпа достаточно велика, какая-то группа найдет способ обойти любую хитрость, ведущую к гонке вооружений. (Это особенно верно, чем проще твик: скрытая форма «комментарии», переупорядочивание элементов формы, неправильная маркировка, скрытый текст «поймал» - все будет работать один раз, а затем его нужно будет изменить для борьбы с этой конкретной формой .)
  • Даже если сценаристы не могут «решить» ваш твик, это не помешает им хлопнуть вашей первой страницей, а затем подать сигнал тревоги для сценария, чтобы он выполнил заказ вручную. Учитывая, что они получают преимущество от решения [a], они, вероятно, все равно выиграют [b], так как они будут первыми, кто достигнет страницы заказа. Кроме того, 1. все еще происходит, вызывая ошибки сервера и снижение производительности для всех.

Другое решение состоит в том, чтобы следить за слишком частым попаданием IP-адресов, блокировать их от брандмауэра или иным образом предотвращать их упорядочение. Это может решить 2. и предотвратить [b], но снижение производительности при сканировании IP-адресов является значительным и, вероятно, вызовет больше проблем, таких как 1., чем сами сценаристы. Кроме того, возможность облачных сетей и спамботных зомби делает проверку IP довольно бесполезной.

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

Цель

  1. Продайте предмет людям, не пишущим сценарий.
  2. Поддерживайте работу сайта на скорости, не замедляемой ботами.
  3. Не доставляйте «обычным» пользователям никаких заданий, чтобы доказать, что они люди.

Ответы [ 129 ]

0 голосов
/ 09 февраля 2009

Не полное исправление, но я еще не видел его здесь.

Отслеживайте «захлопнувшиеся» адреса и выставляйте заявление об отказе от ответственности, что BOC / items не будут отправлены на любой адрес, который не соответствует вашему TOS.

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

0 голосов
/ 09 февраля 2009

Я не уверен на 100%, что это сработает, по крайней мере, без попыток.

Но кажется, что возможно, хотя и технически сложно, написать скремблер HTML / CSS на стороне сервера, который принимает в качестве входных данных обычную HTML-страницу + связанные файлы и выводит более или менее пустую HTML-страницу, вместе с обфусцированным файлом javascript, который способен восстановить страницу. Разумеется, javascript не может просто распечатывать простые DOM-узлы ... но он может выдавать сложный набор перекрывающихся, абсолютно позиционированных элементов div и абзацев, каждый из которых содержит одну букву, поэтому он отлично читается.

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

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

Конечно, написать такой обфускатор будет сложно, и, вероятно, оно того не стоит. Но это мысль.

0 голосов
/ 07 февраля 2009

Я думаю, что стоит заняться песочницей определенных IP-адресов. Когда IP-адрес превышает пороговое значение, когда они попадают на ваш сайт, перенаправьте их на веб-сервер с мультисекундной задержкой перед выдачей файла. Я написал Linux-серверы, которые могут обрабатывать открытые 50К-соединения практически без процессора, поэтому было бы не сложно замедлить очень большое количество ботов. Все, что нужно сделать серверу, - это удерживать соединение открытым в течение N секунд, прежде чем действовать в качестве прокси для вашего обычного сайта. Это все еще позволило бы обычным пользователям использовать сайт, даже если они были действительно агрессивными, только на немного ухудшенном опыте.

Вы можете использовать memcached, как описано здесь , чтобы дешево отслеживать количество хитов на IP.

0 голосов
/ 09 февраля 2009

Как насчет страницы задержки, где пользователь должен ждать задержки, показанной на изображении?

Вы выполняете упорядочивание со страницы, на которую они попадают, только если они щелкают в течение достаточно короткого периода времени, указанного на изображении, возможно, изображение может выполнять обратный отсчет в анимированном GIF-файле или очень маленьком JavaScript или флеш-таймере.

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

0 голосов
/ 13 июля 2009

Что если вы случайным образом зашифровали или зашифровали имена и идентификаторы форм, случайным образом упорядочили поля форм и сделали метки формы случайным изображением капчи, что сделало бы атаку сценария намного более сложной: -D

0 голосов
/ 08 февраля 2009

Предполагаемые необоротные:

На первом экране должен быть простой HTML с минимальными накладными расходами, с одной легко идентифицируемой (для бота или для людей) кнопкой, чтобы щелкнуть или эквивалентно, чтобы однозначно указать «Я хочу свое дерьмо». Поскольку мы предполагаем наихудший случай - у вас есть эквивалент атаки DOS от комбинации ботов и не-ботов, все сначала кликают по сайту (насколько это возможно). Итак, давайте раздадим их как можно быстрее из кешей, доброкачественных эхоботов и т. Д.

(Примечание: что касается wooters, это то, что происходит в любом случае; это так же больно для пользователей, как и для Woot, поэтому все, что помогает поглощать или смягчать первое приобретение экрана, отвечает интересам всех трех сторон участие.)

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

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

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


Что, если Вут намеренно отделил процесс очереди после первого экрана и передавал каждый сеанс с этой точки в последовательность шагов с фиксированным минимальным временем? Второй экран даже не появится, пока не пройдет 30 секунд; после того, как это было представлено, то же самое для следующих экранов. Бьюсь об заклад, у wooters не было бы проблем, если бы им сказали, что после первого экрана они будут ждать в очереди (что уже верно), которая будет распределять нагрузку с течением времени таким образом, что это займет больше времени, чем прежде, крепкий, и помочь отсеять ботов. В этот момент вы можете добавить некоторые из перечисленных выше скоростных ударов бота (тонкие вариации в DOM-объектах и ​​т. Д.). Только выгода от ощущения, что Woot немного больше контролирует вещи, поможет.

Если бы гораздо более высокая доля первоначальных попаданий BOC могла перейти в не критичный ко времени процесс, не критичный ко времени, при первом попадании (или близко к нему), а не повторять попытку, то реальные люди, которые преодолеют эту точку, иметь больше уверенности Наверняка это будет менее враждебно, чем нынешняя ситуация. Это может снизить уровень фонового шума, окружающего бота, который происходит постоянно, даже при нормальных условиях Woot-Off. И боты откладывали бы главную страницу и сидели бы в очереди друг с другом (и всеми остальными), где у них нет никакого преимущества.


Хммм ... На ум приходит понятие "квартира с резьбой". Интересно, будет ли шаблон примерно полезным?
Здесь полезной концепцией ядра является возможность после первого экрана отслеживать общее время в очереди и настраиваться на стандартное. Как стратегия смягчения ботов, у вас будет немного гибкости, чтобы, возможно, выдумать самые ранние сеансы, возможно, на 5-10 секунд; это, вероятно, было бы невозможно обнаружить, но привело бы к более богатому сочетанию покупок, не связанных с ботами. Я уверен, что у вас есть статистика, которая поможет оценить подобные вещи после факта.
Просто ради интереса, вы можете (хотя бы для одного wootoff) собрать своего собственного бота, который сочетает в себе лучшие функции, которые вы видели, а затем раздать его всем накануне. Тогда по крайней мере все будут одинаково вооружены. (Тогда утка ... входящая ...)
0 голосов
/ 07 февраля 2009

Метод, который я опишу, имеет два требования. 1) Javascript применяется 2) веб-браузер с допустимым http://msdn.microsoft.com/en-us/library/bb894287.aspx сеансом браузера.

С любым из них вы «замышляете» неудачу. Интернет построен так, чтобы анонимные клиенты могли просматривать контент. Обойти это невозможно с помощью простого HTML. Да, и я просто хотел сказать, что простую CAPTCHA, основанную на изображениях, можно легко победить, даже авторы признают это.

Переходя к проблеме и решению. Проблема в двух частях. Во-первых, вы не можете блокировать человека за «плохие поступки». Чтобы это исправить, вы устанавливаете метод, который принимает в браузере допустимый сеанс, генерирует хэш md5sum + salt + (для вашего личного устройства) и отправляет его обратно в браузер. Затем браузер ОБЯЗАН вернуть этот хешированный ключ обратно во время каждой записи / получения. Если вы никогда не получите действительный сеанс браузера, вы ответите «Пожалуйста, используйте действующий веб-браузер бла-бла-бла». Все популярные браузеры имеют действительные идентификаторы сеанса браузера.

Теперь, когда у нас есть удостоверение, по крайней мере, для этого сеанса браузера (я знаю, что он не блокируется навсегда, но довольно сложно «обновить» сеанс браузера с помощью простых сценариев), мы можем эффективно заблокировать сеанс (т. Е. ; сделаю так, что сценаристам досадно будет трудно посещать ваш сайт без штрафов действительным пользователям).

Теперь эта следующая часть требует javascript. На клиенте вы создаете простой хеш для каждого символа, который приходит с клавиатуры, в зависимости от значения текста в текстовой области. Этот действительный ключ передается на сервер в виде простого хэша и должен быть проверен. Несмотря на то, что этот метод может быть легко реконструирован, он делает его одним дополнительным обручем, через который люди должны пройти, прежде чем они смогут представить данные. Имейте в виду, что это только предотвращает автоматическую публикацию данных, а не DOS с постоянными посещениями веб-сайта. Если у вас даже есть доступ к ajax, есть способ отправить солевой и хэш-ключ по сети и использовать вместе с ним javascript для создания символов действующего ключа «действительный токен», который отправляется по сети. Да, как я уже говорил, его можно легко изменить, но вы видите, куда я иду с этим, надеюсь.

Теперь, чтобы предотвратить постоянное злоупотребление трафиком. Существуют способы установки шаблонов, когда у них есть действительный идентификатор сеанса. Эти шаблоны (даже если используется Random для смещения времени запроса), имеют более низкий эпсилон, чем если бы, скажем, человек пытался воспроизвести тот же предел погрешности. Поскольку у вас есть идентификатор сеанса, и у вас есть шаблон, который «кажется ботом», вы можете заблокировать этот сеанс с помощью простого облегченного ответа, который составляет 20 байтов вместо 200000 байтов.

Вы видите здесь, цель состоит в том, чтобы: 1) сделать анонимного неанонимного (даже если это только за сеанс) и 2) разработать метод идентификации ботов и обычных людей путем установления шаблонов их использования в вашей системе. , Нельзя сказать, что последнее невозможно, потому что я делал это раньше. В то время как мои реализации были предназначены для отслеживания ботов видеоигр, я, кажется, думаю, что эти алгоритмы для идентификации бота и пользователя могут быть обобщены в форме посещений веб-сайта. Если вы уменьшите трафик, который потребляют боты, вы уменьшите нагрузку на вашу систему. Имейте в виду, что это по-прежнему не предотвращает DOS-атаки, но снижает нагрузку, которую бот создает в системе.

0 голосов
/ 13 февраля 2009

Вот некоторые допустимые предположения, которые вы можете сделать:

  • Любое автоматизированное решение может и будет сломано.
  • Создание сайта полностью требует участия человека (например, CAPTCHA) значительно увеличит сложность входа / выхода из системы и т. Д.
  • У вас есть ограниченное количество бандольеров капусты на продажу.
  • Вы можете отслеживать пользователей по сеансу через файл cookie на стороне клиента.
  • Вы не имеете дело с чрезвычайно жестокими преступниками здесь; это просто технические люди, которые нарушают, но не нарушают закон. Успешные заказы с помощью ботов будут отправлены домой к человеку, и, скорее всего, не будут отправлены почтой сторонних производителей.

Решение не является техническим. Это политика.

  • Зарегистрируйте все идентификаторы сеансов клиентов на вашем веб-сервере.
  • Принять политику "ограниченных ботов"; скажем, по одному экрану каждые X секунд, чтобы дать людям с обычными браузерами возможность обновления. Любой пользователь, уличенный в превышении этого лимита, не выигрывает.
  • Затем отправьте известным владельцам ботов кучу Leakfrogs.
0 голосов
/ 13 февраля 2009

Мое решение - это сочетание маркетинговых изменений и технологических изменений.

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

Есть несколько рыночных целей:

  • Заставьте клиентов посещать сайт один раз в день (имплицитные покупки). Возможность увидеть сумку с продажей дерьма - причина / награда.
  • Сетевой / вирусный / сплетничающий эффект, когда клиент видит, что в продаже есть мешок с дерьмом, и он / IMail / Телефонный звонок своим друзьям.
  • Есть также то, что я бы назвал общей "доброй волей". Woot - это действительно классное место, потому что оно иногда вознаграждает своих клиентов удивительными продажами (мешок с дерьмом, в который входит телевизор с плоским экраном) ... И все сделано честно, по принципу «первым пришел - первым обслужен».

Первые 2 кажутся наиболее важными. Огромное количество посетителей влияет на скорость продажи (или распродажи) обычных сделок. Новых клиентов традиционно привлекают из уст в уста, и клиенты, отправляющие своих друзей на woot.com, - это победа.

Итак ... мое решение состоит в том, чтобы превратить промо-акцию в лотерею.

Иногда пользователи могут сделать что-нибудь интересное, чтобы узнать, имеют ли они право на мешок с дерьмом. Что-то веселое может быть глупой флеш-игрой в духе «пунша обезьяны» или мини-путя «Орбитц», бейсбола, хоккея. Целью здесь является игра, которую бот не может написать, поэтому потребуется значительная осторожность. Цель также заключается не только в том, чтобы награждать победителей игр, но и всем игрокам.

Техническое ядро ​​игры заключается в том, что в конце игры на сервер, который проводит «мгновенную лотерею», делается запрос, чтобы определить, выиграл ли пользователь пакет с продажей дерьма. Запрос к серверу должен включать в себя что-то, рассчитанное самой игрой (грубо говоря, «хэш-деньги» ... сложный, потребляющий цикл процессора, расчет и, надеюсь, тот, который трудно воспроизвести). Это необходимо для предотвращения повторного входа бота в лотерею, просто запрашивая у сервера / службы лотереи.

Сама игра со временем может измениться. Вы можете делать специальные игры для Хэллоуина, Рождества, Вали, Пасхи и т. Д. Есть много возможностей для забавных маркетинговых идей, которые могут соответствовать "wootiness" woot.

Если пользователь выигрывает, он может купить N пакетов с дерьмом (в ограниченном по времени окне) ... но они также могут отправить N друзьям ограниченное по времени приглашение на покупку пакета с дерьмом (сроком на 24 часа). Это обеспечивает очень сильный сетевой эффект ... клиенты обязательно расскажут своим друзьям. Или вы можете сделать это как «купи 1, дай 1» ... пусть клиенты покупают до N, но заставляют каждую секунду отправлять другу. Ключевым моментом здесь является превращение эффекта «сеть / сплетни» в полноценную часть ... помогите клиенту рассказать миру о чудесности woot.

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

Вы также можете рекламировать, почему меняется объем продаж дерьма. Тем более, что вы наняли лучшую сумку консультантов по дерьму, доступных бесплатно.

0 голосов
/ 13 февраля 2009

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

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

...