Человекочитаемые надписи. Давайте делиться алгоритмами.

kruglov

Новичок
Человекочитаемые надписи. Давайте делиться алгоритмами.

Давайте делиться алгоритмами генерации картинок с зашумленными текстами для отсеивания роботов.

Вот мой вариант на основе библиотеки ImageMagick.

Краткая идея — множественный -swirl в разных центрах на разные углы.

Как это выглядит: http://www.kruglov.ru/no-ocr/

Код демонстрационного примера:

PHP:
<h1>squiggly string</h1>
<?
$convert="/usr/local/magiclib/bin/convert";
$file_out="out.gif";

$direction=rand(0,1)==0?-1:1;

// в папке лежат несколько шрифтов TTF
$fonts=array();
if ($handle = opendir('.')) {
	while (false !== ($file = readdir($handle))) {
		if (preg_match('/\.ttf$/i',$file)) {
			$fonts[]=$file;
		}
	}
	closedir($handle);
}

// кодовая строка
$keystring=RAND(100000,999999);

// генерим картинку
$cmd=$convert." -size 300x100 xc:white -colorspace RGB -antialias -fill black -font ".$fonts[rand(0,count($fonts)-1)]." -pointsize 70 -draw 'text 20,70 \"".$keystring."\"' -negate -extent 400x120 -roll +".rand(95,105)."+".rand(0,20)." -swirl ".(rand(37,51)*$direction)." -extent 600x140 -roll +".rand(0,10)."+".rand(0,20)." -swirl ".(-rand(20,35)*$direction)." -crop 300x100+100+17 +repage -negate -resize 150x50 ".$file_out;

exec($cmd);

// нарушаем безопасность, выводим всю подноготную юзеру ;)
echo "<p>".$cmd."</p>";

?>
<img src="<?=$file_out.'?rand='.rand()?>" style="border: solid 1px gray" width=150 height=50>
 

white phoenix

Новичок
kruglov
По поводу http://www.kruglov.ru/no-ocr. Вообще неплохо, но для умножения головной боли создателей OCR советую распологать символы так, чтобы они слегка накладывались друг на друга, а также с умом использовать случайные цвета. Для каждого знака свой шрифт и размер. Для написания OCR на данный алгоритм я бы сделал просто:
1. т.к. элементы (символы) не накладываются друг на друга, выделяем каждый.
2. определяем размер шрифта.
3. название шрифта определяем по кол-ву закрашеных пикселей в каждом элементе и размеру шрифта.
4. известны и название шрифта и его размер, опять же по сумме закрашеных пикселей в каждом элементе определяем что там за цифра.
-
Естественно придется отдельно реализовать обучатель который заполнит таблицу нужными значениями. На досуге нужно будет реализовать.
По поводу шума есть некоторые соображения, но всё пока на стадии соображений.
 

Фанат

oncle terrible
Команда форума
Я думаю, чтобы не засорять тему, в дискуссию с предыдущим оратором просто вступать не стоит.

Кром, как тебе должно быть известно, в интернете навалом только мусора. А нормальных вещей днём с огнём не найти.
В отличсие от интернетовскового добра, автор этого скрипта
а) думал перед тем, как его написать
б) советуется с НАМИ, как сделать его лучше.

Popoff
красиво. цифры сам рисовал? ;-)

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

white phoenix

Новичок
kruglov
Действительно хорошо сделано, только сейчас это понял. И вполне понятно для человека, и OCR не так легко написать, искажения мешают. Буду пробовать.
 

kruglov

Новичок
Есть запас по безопасности, можно XORом накладывать картинки, вот простейший пример с полуплоскостью: http://www.kruglov.ru/no-ocr/index2.php

Можно накладывать другие функции, синусы, параболы и пр.

-~{}~ 22.01.06 10:29:

Фанат
Идея с рукописными шрифтами кажется мне неплохой
Я так понимаю, у Попова что-то вроде векторной графики, скорее всего, с небольшими случайными флуктуациями (координаты опорных точек "дрожат"). И общий scale - тоже.

Искажение должно иметь место быть, а то словарь образов составить можно будет.
 

ForJest

- свежая кровь
Кстати об OCR и защите рисунком.
Можно сделать реально нераспознаваемый компьютером образ, но не факт что это защитит вашу регистрацию :).
Подобные защиты, в тех местах где они нужны могут быть пройдены не только с помощью OCR (что само по себе является дорогим для разработки алгоритмом).
Легче всего пройти регистрационный код с помощью человека, чем успешно люди и пользуются - показывают картинку и человек её вводит.
Это могут делать как узбеки за $1 в день, так и просто пользователи, допустим - введите число изображённое здесь и получите доступ к порнухе.
Распрарсить статическую HTML страничку и получить оттуда картинку не так уж сложно :).
--------------
Так что усложнять стоит на каптчу, а содержимое HTML страницы - 5-6 различных алгоритмов для показа самой картинки, проверка реферера - чтобы программы парсинга вашего сервиса не могли её спереть или чтобы это было затруднительно.
Алгоритмы - на JS, используя DHMTL.
Проверка на реферер для защиты от прямой вставки в чужой браузер.
 

Фанат

oncle terrible
Команда форума
проверка реферера, насколько я понимаю, не поможет.
картинку ведь можно просто скачать, сохранить, показать, получить ответ, и заслать его с нужными реферерами.

Именно поэтому я полностью соладарен с этим постом
http://community.livejournal.com/ru_php/582289.html?mode=reply
и именно поэтому так не люблю вопросы на форуме про курл
 

ForJest

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

-~{}~ 23.01.06 13:09:

Вообще я думаю более перспективная тема это распознавание картинок и решение уравнений.
 

MpaK69

Новичок
э... оригинальный метод защиты был делан по такому прицыпу...

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

diamond_krnl

pure-php
встречал рисование букв по принципу ASCII-псевдо-графики, внутри тега pre.

может кто напомнит?
 
Сверху