- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Зачем быть уникальным в мире, где все можно скопировать
Почему так важна уникальность текста и как она влияет на SEO
Ingate Organic
В 2023 году 36,9% всех DDoS-атак пришлось на сферу финансов
А 24,9% – на сегмент электронной коммерции
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Популярно защищать формы от программ картинками. На досуге я довольно долго размышлял над тем, как сделать картинку проблемной для роботов, но совершенно не проблемной для людей.
Этот вопрос волнует не меня одного:
Какая картинка лучше для защиты от автосабмита?
Работа над одним новым проектом, который претендует в дальнейшем на роль весьма посещаемого, принудила меня ускорить мысли в этой области и довести их до конечных выводов.
Делюсь выводами и размышлениями.
Рассмотрим наиболее типичные картинки защиты:
(см. Рисунок 1).
На первый взгляд все три варианта распознать сложно.
Это ошибочно.
Давайте посмотрим нам эти картинки с точки зрения программиста, которому поставили задачу распознать эти числа.
Сначала нам потребуется алгоритм распознания.
Составим маску для цифр:
(см. Рисунок "Маски").
Здесь красным отмечены точки, в которых должно быть отличие яркости более 50%, от тех точек, которые отмечены синим, тогда мы будем считать цифру совпавшей с маской.
Далее мы будем обходить (сканировать) маской изображение:
(см. Рисунок "Сканирование маской").
Где:
ш1 = координата наложения маски X=0, Y=0;
ш2 = координата наложения маски X=1, Y=0;
ш3 = координата наложения маски X=1, Y=1;
шN = координата наложения маски X=n, Y=n;
То есть, как принтер перемещает печатающую головку, обходя линию за линией будущего изображения, так мы и "сканируем" картинку по порядку, каждой из 10-ю маскок.
X где было совпадение мы запоминаем.
В итоге мы имеем координаты, где находились цифры, и какие именно это были цифры, далее по расположению (координата X) определяем порядок следования цифр.
Это будет работать, только если у нас чистая от шума картинка (линии в 1 точку для нас не помеха, но и от них лучше избавиться).
Избавимся от шума.
Будем использовать только простые (не ресурсоёмкие) алгоритмы.
Прежде всего, попробуем удалить все цвета кроме чёрного, белого и оттенков серого (все _цвета_, просто приравняем к белому), примерно так (для RGB):
if (r[x,y] != g[x,y] && g[x,y] != b[x,y] && b[x,y] != r[x,y]){r[x,y]=255; g[x,y]=255; b[x,y]=255;}
Избавились от цветовых элементов... сверили с маской.
Цифры найдены - ОК.
Если нет - переходим к методу 2:
Вернёмся к исходному изображению (возьмём его из буфера в памяти) и сделаем то, что в фотошопе называется "яркость/контрастность", а точнее поднимем и яркость и контрастность изображения до 100%.
Опять повторим проход маской.
Если цифры найдены - ОК.
Можно ещё поработать с порогами при которых идёт удаление цвета, удалять только определённые цвета, поднимать яркость/контрастность, затем размывать на 1 точку, и снова поднимать яркость/контрастность, что бы удалить разрывы в цифрах вызванные наложением шума.
Как можно увидеть, манипуляции с удалением цвета и яркостью/контрастностью замечательно работают для вариантов A и B:
(см. Рисунок "Первые рисунки после удаления шумов").
Остаётся вариант "Ц".
Для варианта "Ц", тоже есть решение, как привести геометрию к некой норме (я знаю его но не буду его описывать здесь), решение это весьма ресурсоёмкое и оно не будет работать если искажения введены как по оси Y так и по оси X да ещё и нелинейно.
Хотя, я уверен, что найдутся те, кто имеет решения и для уничтожения таких сложных искажений, но я так же уверен, что те, кто могут решить задачу с такими искажениями не будут заниматься такой чепухой как создание спамерского софта.
В итоге, лучшим можно признать вариант искажений "Ц".
Ещё лучше, если этот вариант немного усложнить (печатать не цифры а цифры прописью и случайные фрагменты изображения инвертировать):
(см. Рисунок "Вот это точно лучше").
В процессе генерации такое изображение может быть получено эффектом "Линза" + "Скручивание" или "Волна" или 2-3 раза применив эффект "Линза".
Теперь несколько слов, что бы Вас шокировать, уважаемые :)
Можно распознать число, не распознавая картинку!
Как?
Очень просто - ваш генератор картинок каким-то способом передаёт то, что он сгенерировал в виде JPG, скрипту который сверяет то, что ввёл пользователь, глядя на сгенерированное JPG. Или скрипт сверщик, передаёт генератору что нужно сгенерировать в виде графики.
Так или иначе, этот процесс передачи - слабое звено.
Помните: вы должны передавать не число а хеш числа, некую последовательность символов или цифр, которую обратно невозможно преобразовать в число, или это сделать крайне сложно, только тогда ваша защита картинкой будет эффективна.
Для примера, простейший генератор хеша числа:
NUMmy = число которое нужно передать;
NUMout = то что будем передавать (в куках или как ещё - не важно) и с чем будем сверять;
NUMout = int( (NUMmy * 7 + 11) / 3);
Получить NUMmy из NUMout невозможно не зная как получен NUMout, а для некоторых NUMmy вообще невозможно.
Можно поступить и проще:
$out = md5_hex('ля-ля-ля'.$num.'ещё ля-ля-ля');
Дополнительные 'ля-ля-ля' и 'ещё ля-ля-ля' необходимы, т.к. "распознавальщикам" никто не мешает точно так же воспользоваться той же функцией, однако не зная дополнительных символов они не получат нужный результат.
И не забывайте про ограничения по времени!
Ведь если срок "жизни" вашего числа на картинке не ограничен, то распознав его глазами 1 раз, не сложно всегда применять его.
Оптимальным, я считаю, срок жизни числа или хеша равным 60 минут.
Хотя на выделенной линии с хорошей скоростью и за 60 минут можно натворить много неприятного.
Вообще, намного лучше ограничение на число использований картинки, но это, наверно, уже слишком сложно :)
Таким я увидел мир картинок, взглянув на них глазами спам-бота... Как защищаться - решать Вам
Вы изобретаете велосипед. Все три картинки в верхнем ряду вообще не могут использоваться как защита от спам-ботов, причем это понятно было уже 3-4 года назад. В сети навалом (точно тестировал 5 или 6) сервисов, который предлагают онлайн тестирование картинок и прогнозируют процент распознавания различных защит (например вот: http://www.ocr-research.org.ua/demo.html). В крайнем случае разработчику можно брать демо-версию файнридера и прогонять картинки через нее.
На текущий момент есть даже рекомендованная исслодовательскими лабораториями Microsoft примерная форма CAPTCHA изображения, которая на практике устойчива к распознаванию ботами. Можете почитать тут: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/hip_aspnet.asp. Ничего сложного с точки зрения разработчика там нет, мы в нашу CMS встроили подобный алгоритм для генерации защитных кодов согласно этой спецификации примерно за 2.5 часа. Пример, о котором я говорю, можно увидеть на www.stratek.ru/feedback.
Не заявляю что это единственно возможный путь, видел на порядки более сложные реализации CAPTCHA, не всегда удобные, правда, в использовании на сайте по ряду параметров.
А что CAPTCHA можно обойти и без распознавания кода в лобовую в статьях (западных) расписано было еще 5 лет назад. Есть даже методы подбора кодовых строк, которые идентифицируют картинку и, как правило, передаются в хидден поле. Но это уже высший пилотаж. А в большинстве случаев это вообще тривиально из-за неграмотной архитектуры решения. Например в Битриксе модуль CAPTCHA содержит элементарную недоработку программистов, никакого распознавания вообще не требуется, спамь - не хочу.
Показать желающим создать свои скрипты (каталогов форумов, гостевых), что не всегда сойдёт первое что попадёт под руки.
причем это понятно было уже 3-4 года назад
Дополнили. Спасибо.
Вы изобретаете велосипед.
Я не боюсь изобретать велосипеды :) Страшнее потретять дар изобретать...
Спортивный велосипед с карданным валом (производитель: ALPINE BIKE)