Распознавание CAPTCHA MTC
МТС сделал у себя на сайте защиту спама в сервисе отправки SMS. Защита, надо сказать плюшевая — усреднением помехи убираются почти подчистую, дальше распознать цифры очень просто — я пробовал. Удалось добиться стопроцентной вероятности распознавания.

Алгоритм на этот раз не публикую даже из исследовательских целей. Алгоритм для Beeline потом был использован в одной
Кстати, подходящее время вернуться к разговору о защите от спамовых роботов, специализирующихся на форумах, гостевых книгах и т. п. Поводом послужила попытка Helix (aka Ulitka) усовершенствовать предложенные мною методы CAPTHA.
Как уже было сказано, метод CAPTHA — помещение на картинку некого кода, который человек должен прочитать и ввести в особое текстовое поле, обладает следующим недостатком — слишком простое изображение читается роботом, слишком сложное — уже с трудом читается человеком и отпугивает посетителей.
Предлагаю, умозрительно, поискать другие способы защиты от роботов, в стороне от методов CAPTCHA. Скажем, некоторые форумы генерируют для каждого пользователя или хоста, заходящего к ним, идентификатор, который может зависеть, от IP
Всё бы ничего, но хорошие спамовые программы давно содержат средства для быстрой настройки обхода таких средств защиты — идентификатор легко изымается из кода страницы и отсылается серверу. Тем не менее, этот путь мне кажется плодотворным.
Как известно, в браузерах есть скриптовые языки. Наиболее распространённым является JavaScript — его понимает максимальное количество современных браузеров. Код на этом языке включается прямо в страницу браузера «как есть», что делает заимствование кода на JavaScript часто минутным делом. Это положение вещей не устраивает некоторых разработчиков, что привело к появлению (обычной для интерпретируемых языков) защиты — программ изменяющих код таким образом, чтобы его было трудно прочитать человеку (такие программы часто называют «obfuscator»).
Обычно такие программы изменяют имена пользовательский функций, процедур и переменных, убирают форматирование и, иногда, модифицируют сам код программы. Даже программисту средней руки вполне по силам создать неплохой obfuscator, делающий над строкой такие преобразования, чтобы JavaScript смог восстановить исходную строку, а написание
Таким образом, объединение «маркеров», которыми помечаются пользователи
Ждать!
Финское чудо — телефон Nokia 6230, руссифицированный, думаю,
Видеокарта приехала
Теперь у меня дома есть горстка сибирской пыли — заботливо упакованная в четыре (!) пакета, пупырчатый полиэтилен и коробку
Кстати, наверное некоторые уже и не знают что такое XT. XT — это машины с процессорами 8086/8088. Вот Pentium (еще до Celeron) считался 80586. Когда я начинал работать лаборантом на ВМК, там в одном классе стояли эти замечательные машины. Было видно как печатаются буквы в «Нортоне».
Моностих
Из статьи «Хайку и Моностихи»:
То разбиение, что так упорно принимается у нас за признак хайку (три строки
по 5-7-5 слогов) на самом деле делается с помощью разделительныхслов-пауз. То есть это может быть больше похоже на пунктуацию внутри однострочника, чем на «стиховое» деление.
В статье цитируется несколько моностихов, мне более всех понравился моностих Александра Смира:
Денег… на лепесток розы
Sort в PHP
Оказывается функция sort в PHP не использует установки локали в PHP4. Косвенно это можно узнать из руководства:
Sorting type flags:
SORT_REGULAR — compare items normally
SORT_NUMERIC — compare items numerically
SORT_STRING — compare items as strings
SORT_LOCALE_STRING — compare items as strings, based on the current locale. Added in PHP 5.0.2
Параметр SORT_LOCALE_STRING появился только в PHP 5.0.2. На мой взгляд, это очень странно. Valshooter рекомендует в этом случае использовать
usort($fruit, 'strcoll');правда, в том случае, если локаль у вас UTF8 вряд ли сортировка вернёт осмысленные данные.
Юзабилити-тесты
Перевод статьи «90% всех
ЛЮДИ ГОЛОС

Кадр из фильма «Небесный капитан». Судя по фразам, переводили
Меня это всегда удивляло — неужели из многомиллионного бюджета фильма нельзя выделить потратить сотню баксов на переводчиков (в фильме мелькают передовицы газет различных стран)? Сколько возмёт переводчик за перевод шести строк текста? На программу для перевода они ж потратились, а стоила она, подозреваю, далеко за сотню.
Фразы, которые удаётся различить:
ЛЮДИ ГОЛОС. СОВЕТ. которые присту.. чтобы печататься СССР. … марта. На вопрос, … атмость каждого из этих…
(Гига)нтские Металлические …асы Наций Кражи …шин Угля, Нефти и Урана. (М)ировые Лидеры Двигаются, (что)бы Защитить Запасы. …механические атакуют Россию
Кастанеда
Начните со статьи Дон Хуан живее всех живых или история одного обмана, потом походите по гуглю.
Курение может стать причиной медленной и мучительной смерти
Цитата с сайта Adme:
Комиссар ЕС по делам здравоохранения Дэвид Бирн представил эскизы нового оформления сигаретных пачек, которое вскоре станет обязательным для всех производителей табака для европейцев. Всего предлагается использовать 42 фотографии, иллюстрирующих вредное воздействие курения на человека.
Надпись на иллюстрации — «Курение может стать причиной медленной и мучительной смерти». Загляните на сайт — там ещё несколько картинок.
Мой mod_autoindex
Испокон веков в Apache (внимание! речь идёт об Apache 1.x) существует модуль mod_autoindex — в комментариях в его исходном коде есть дата, видимо написания первой версии — 23 марта 1993 года. С тех пор модуль, очевидно, претерпевал
С 1993 года HTML обогатился таблицами и каскадными стилями (CSS). Вряд ли сейчас
В моём портфолио есть несколько проектов, где приходилось изобретать
Стандартный модуль Apache позволяет менять, в этом плане:
- header, т. е. часть над списком файлов (HeaderName, SuppressHTMLPreamble)
- footer, часть под списком файлов (ReadmeName)
- размер иконок (IconWidth, IconHeight)
- внешний вид иконок (AddIcon, AddIconByType, AddIconByEncoding)
- убирать из списка некоторые столбцы (SuppressLastModified, SuppressSize, SuppressDescription)
- изменять описание файла (AddDescription)
- и весьма ограниченно менять внешний вид выводимой информации (FoldersFirst, SuppressColumnSorting и т. п.)
Чаще всего этого для «упаковки» списка файлов в дизайн очень мало. Для облегчения задачи интеграции вывода mod_autoindex в дизайн я несколько усовершенствовал этот модуль. Всё по порядку.
Что умеет новый модуль

- Режим FancyIndex всегда включен и не выключается. Вряд ли найдётся много людей
не использующих этот режим. - В основном режиме (об этом подробнее — чуть ниже) таблица файлов выводится при
помощи тега TABLE, где у большинства объектов (например, у первой строка, чётных
и нечётных строк) прописаны идентификаторыCSS-классов, из чего следует, что внешний
вид таблицы вы легко сможете задать при помощи файла стилей. - Новая опция, позволяющая включить в листинг файла ссылку на корень сайта
(IndexOptions +RootFolder, при использовании не забудьте добавить иконку,
например так: «AddIcon /icons/back.gif .») - Появилась возможность перенести Description в отдельную (новую) строку
(IndexOptions +DescriptionAtNewRow) - Появилась возможность локализовать (перевести на родной язык) текстовую
информацию модуля (директивы ParentStr, RootStr, NameStr, SizeStr, DescriptionStr, LastModifiedStr). - С первой страницы (если пользователь находится в корне сайта) убрана
ссылка «Parent Directory», ведущая в этом случае, на ту же самую страницу. - Появился новый режим вывода, основанный на теге SPAN (именно он на иллюстрации),
в частности, количество иконок в строке в этом режиме зависит от ширины окна браузера
(IndexOptions +BoxWidth=N +BoxHeight=N +MaxIconHeight=N)
Новый режим вывода

Новый режим вывода включается автоматически, если были использованы параметры BoxWidth и BoxHeight. Эти два параметра отвечают за размер прямоугольника, в который заключена иконка (на иллюстрации выделено чёрным) и, по сути, определяют расстояние между соседними иконками.
Размер этот нужно выбирать исходя из размеров иконки, текста названия файла и строки, где выводится размер файла, плюс некоторое пространство, необходимое для обеспечения зазора между соседними иконками. Есть ещё один параметр — MaxIconHeight, выбрать его просто — это всего лишь максимальная высота иконки в вашем наборе. Нужен этот параметр для того, чтобы подписи к иконкам располагались на одном уровне (на иллюстации — синяя линия).
В этом режиме под иконкой выводится имя файла, размер и дата модификации (если, конечно, не были использованы опции SuppressLastModified и SuppressSize), описание файла выводится в аттрибут «title» тега SPAN, охватывающего иконку и надписи (если не была использована опция SuppressDescription) — вы можете использовать DHTML, чтобы выводить информацию из title в статусную строку, всплывающую подсказку и т. п.
Пример
Файлы для вывода информации так, как это изображено на иллюстрации выглядят так:
Файл «.htaccess»:
IndexOptions +SuppressHTMLPreamble +NameWidth=*
IndexOptions +SuppressLastModified +FoldersFirst +RootFolder +DescriptionWidth=*
IndexOptions +BoxWidth=80 +BoxHeight=80 +MaxIconHeight=33
HeaderName /_bolk_autoindex/.HEADER.html
ReadmeName /_bolk_autoindex/.FOOTER.html
ParentStr "Наверх"
RootStr "В корень"
NameStr "Имя"
SizeStr "Размер"
DescriptionStr "Описание"Файл «.HEADER.html»:
<head>
<title></title>
<style type="text/css">
td,
body { background-color: white; font-family: Verdana,Tahoma; font-size:10px }
a { color: black; text-decoration:none }
.cell0, .cell1 {text-align: center}
a:hover { text-decoration: underline }
</style>
</head>
<body>
<h4>Пример использования</h4>
Содержимое каталога:
<!--#echo var="DOCUMENT_URI" encoding="none" -->
<br clear="all" /><br />Файл «.FOOTER.html»:
</body>Где взять и как установить
Файл можно взять у меня на сайте (ZIP, около 15Кб), для установки нужно переписать его на место старого модуля (каталог src/modules/standard) и перекомпилировать Apache. Проблемы и их решения
Часто, помимо имени файла, его размера и даты создания, хочется вывести другую полезную информацию — например, разрешение для картинок, ID3 теги для MP3 файлов и так далее. Для этой цели я рекомендую воспользоваться полем «Description» и директивой «AddDesription». Задачей модуля не является и, надеюсь, не будет являться (иначе это приведёт к снижению производительности) автоматический вывод информации такого рода. Напишите скрипт (кстати, возможно позднее я его выложу), который пробежит по каталогам и добавит эту информацию в соответствующие .htaccess файлы и вызывайте его далее по мере необходимости.
Один из заказчиков попросил предоставить пользователю возможность самому выбирать какой вид листинга файлов он хочет получить — табличный или в виде иконок. К сожалению, у Apache 1.x нет методов переключения конфигурации в зависимости
<VirtualHost example.com:80>
...
AccessFileName .htaccess .htaccess-table
...
</VirtualHost>
<VirtualHost example.com:443>
...
AccessFileName .htaccess .htaccess-icons
...
</VirtualHost>где прописаны одно общее имя
По всем вопросам, с пожеланиями по улучшению — добро пожаловать в мой почтовый ящик, он есть на моём сайте внизу каждой страницы.
«Чёрный бумер»
Тест: слышите ли вы примерно
myPHPinfo
Известно, что некоторые хостеры отключают функцию phpinfo из соображений безопасности. Неприятно, но часто приходится мириться и делать
Именно для таких случаев я написал myPHPinfo — программу на PHP, эмулирующую вывод функции phpinfo, насколько это возможно, конечно. Инструкции, ссылки для скачивания и изучения примеров работы есть в специальном разделе сайта.
Наученный горьким опытом даю совет: если вам кажется, что «зачем это нужно, если есть phpinfo», то перечитайте текст выше — там как раз об этом.
Новый 8sender
Обновился 8sender (PHP) — программа, позволяющая отправлять
Новое в этой версии:
- Имена передаваемых файлов записываются ещё и в тему письма.
E-mail отправителя теперь можно не указывать — в этом случае
система автоматически подставит «admin@example.com»
Напоминаю, что для того, чтобы использовать эту программу, вам нужен интерпретатор языка PHP (минимально — файлы php.exe и php4ts.dll).
Для удобства тех, кто работает под Windows я сделал специальный файл — 8sender.bat. Скачивать и запускать нужно его, в пределах видимости скрипта должен быть расположен файл php.exe — той же папке или в любой папке, указанной в системной переменной PATH.
Плохие новости владельцев Windows 95/98/ME — вам придётся указать SMTP сервер для отправки сообщений. Инструкцию по запуску можно получить, запустив программу без параметров.
Pimpin Aint Easy Watch
На иллюстрации — Pimpin Aint Easy Watch. Часы с 72 светодиодами. размеры 30x55x10 мм, водонепроницаемые, выдерживают до 3 атмосфер. Стоят 17800 йен или 155 долларов США. Производит их компания Tokyo Flash.

Принцип отображения примерно понятен из картинки, подробнее, думаю разбирать смысла не имеет — подход ясен, интерфейс проигрывает дизайну. Захотите приобрести — придётся привыкать.
Будущее CAPTCHA
Кажется, перед разработчиками начинает маячить проблема роботов, оставляющих спам в форумах или выполняющих автоматическую регистрацию (часто — для того чтобы спамить в тех форумах, где анонимно это сделать не получается).
Традиционно, разработчики либо мирятся с неизбежным злом, либо используют так называемый
Если сильно исказить картинку, пользователь может не понять (со мной такое бывало), что на ней, собственно, изображено и после первой же неудачно попытки ввода уйти — робота же это не смутит. Если, скажем, вероятность распознавания составить всего лишь 20%, ничего не мешает роботу сделать несколько попыток до успеха.
Второй недостаток… Недавнее изобретение спамеров — метод «леммингов». Спамер открывает порносайт и… предлагает всем желающим войти, в качестве «платы», ввести код, написанный на картинке. Картинка берётся с сайта «жертвы». Как только «лемминг» вводит код,
Разновидность этого
Защиту от техники леммингов, в общем случае, я предложить не берусь — разве что отлавливать подозрительную активность
Образы.

Незаслуженно редко используют в качестве
- Они предлагают пользователю ввести слово
целиком. Пользователю неудобно. Я предлагаю использоватьradio-кнопки , вероятность
угадывания роботом увеличивается, но смотри пункт 2. - Они ничего не делают в случае неправильного ответа. Единственное, что сразу приходит
в голову — сразу блокировать IP нарушителя. Делать так можно, но существует
опасность заблокировать весьdialup-пул какого-нибудь провайдера, всех пользователей
какого-нибудь NATили прокси-серверов.
Пользователь (см. иллюстрацию)
может не попасть по «зайцу»(кто-то отвлёк, мышка заела) и выбрать «дрезину», но
он не за что не кликнет в «рукомойник». Человек, в здравом уме, не спутает зайца с рукомойником.
Ошибки позиционирования для близлежащих элементов можно и нужно прощать, за остальные —
наказывать: для этого IP переходить к другому, более неприятномуCAPTHA-методу ,
заставляя вводить слово целиком. - Они не пытаются запутать робота. Базу картинок, можно слить, если спам на
данный сервер очень важен или у спамера много свободного времени,
составить hash каждой иллюстрации и занести в базу.
Несложно увеличить стоимость взлома — достаточно выводить не одну картинку, а, например,
вывести в одну картинку сразу три изображения и туда же (в картинку) писать вопросы вида:
«что изображено на картинке в центре».
Количество вариантов изображения увеличивается
до N*M*S, где N — количество изображений в базе, M — количество изображений, печатаемых
в одну иллюстрацию, S — количество вариантов фраз. Важно, кстати, не делать изображения
фиксированными по ширине — иначе их легко будет разделить. Проявите фантазию — изображения
можно чуть масштабировать, инвертировать или перечеркнуть, фразу — писать в случайном месте
и так далее. Число вариантов увеличивается настолько, что базу можно и не менять. А методы
разделения и распознавания изображения по его участку не сработают.
Figlet.
История FIGlet началась весной 1991 года. Frank Sheeran написал другу автора первой версии Ian Chai письмо, где в качестве подписи использовалась строка, написанная
С тех пор появилось несколько версий подобных программ, библиотеки на различных языках, я сам, относительно недавно, написал библиотеку Text_Figlet для PHP (скоро войдёт в PEAR). В данный момент доступно примерно 420 шрифтов для написания.
Шрифт в изображении можно уменьшить, например, до 4 пикселей и фраза на экране будет занимать вполне приемлемое пространство. Жизнь спамера осложняется не только тем, что количество шрифтов довольно велико, но и эффектом „smushing“ (горизонтальная склейка), который используется в некоторых шрифтах. Посмотрите внимательно на написанную фразу — соседние буквы в ней „склеены“.
В начале было слово…
В начале было слово, но записать его, думаю, было нечем — Богу вряд ли нужна авторучка с бумагой, а людей тогда ещё не было. Первые люди писать тоже не могли, но могли говорить. Так что голос — довольно древнее средство общение, но с его распознованием у роботов всё ещё большие проблемы.
Некоторые сервисы (LiveJournal), например, используют альтернативный
Активный контент.
Надеюсь, этот метод распространения не получит распространения — я такой контен недолюбливаю, но спам не люблю ещё больше. В браузерах есть такая вещь как плагины — наиболее распространнёными, наверное, можно считать Flash и Java — два языка программирования, на которых вполне можно написать приложение выводящее текст или цифры.
Разобраться в том, как это приложение работает, чтобы понять что оно выводит роботу не по силам. В принципе, можно было бы давать
Animated GIF.
Несколько более простая разновидность предыдущего метода не требующая отдельного плагина — Animated GIF. Если бы вы смогли разыскать
Хитрость заключается в том, что GIF позволяет создавать анимации, где каждый кадр может иметь свою локальную палитру. Предел палитры в GIFе, как мы знаем — 256 цветов. Но никто не говорил, что нельзя записать 10 кадров, в каждом из которых было бы по максимуму цветов и которые были бы все одновременно видны. В результате мы получим 2560 цветов. Неплохо для начала.
Подобная идея приходила в голову не одному только Лебедеву, конечно. Картинка — одна из иллюстраций из статьи True Color GIF, где в формате GIF используются 32796 цветов. Заливка, которую вы видите, нужна лишь для демонстрации — в „Ководстве“ Лебедева GIF, содержащий 1792 цвета отображался без заливки, сразу целиком.
Пора, наверное, уже сказать к чему я клоню, если вы ещё сами не догадались. Разбор GIF’a, скомпонованного подобным образом — задача довольно сложная. Писать можно полноцветными буквами, части которых находятся в разных кадрах, играя с их перекрытием (например, заслонять символы или их части).
Безусловно, задача решаемая — нужно только последовательно разобрать все кадры и наложить их один на другой, но для этого нужно уметь работать с animated GIF, да и правильно наложить один кадр на другой — в общем, тут есть где споткнуться спамеру.
Как писать ВЫ
Случайно нашёл на сайте Яндекс документ «Как писать слово ВЫ»:
Таким образом, местоимения Вы, Ваш пишутся с прописной буквы при обращении к одному лицу в текстах следующих жанров:
(а) личное письмо (адресат — конкретное лицо; факультативное написание — выбор определяет сам пишущий, выражая/ не выражая вежливое или уважительное отношение к адресату);
(б) официальные документы (адресат — конкретное лицо, отношение пишущего к адресату не имеет значения);
(в) анкеты (адресат — неконкретное лицо; отношение пишущего к адресату не имеет значения).
Еще раз напомним, что при обращении к нескольким лицам местоимения вы, ваш пишутся со строчной буквы (см. выше).
…
Поскольку большинство текстов Интернета не соответствуют условиям (а), (б), (в) написания Вы с прописной буквы (сообщения электронной почты не являются личными письмами в традиционном смысле слова), можно рекомендовать написание вы, ваш при обращении к читателям/ посетителям страницы в Интернете со строчной буквы.
Съёмки «Волкодава»
Тем временем, съёмки фильма «Волкодав» идут полным ходом.

Очень интересно как получатся боевые сцены, коих в фильме должно быть великое множество. Будет ли это
Сессии в SSI
Один из проектов, в разработке которого я участвовал в недавнем времени, расчитывался на огромную посещаемость (забегая вперёд, скажу — проект действительно стал исключительно посещаемым), в связи с чем пришлось разрабатывать и использовать технические решения, позволяющие проекту не «падать» под огромными нагрузками.
В частности, была разработана система кеширования, которую можно охарактерировать как «всё по максимуму в в HTML, остальное — включаем через SSI и фреймы». Поскольку на сайте используются пользовательские сессии, сложилась ситуация, когда сессию должны могли инициировать и скрипты (язык программирования — PHP, основной сервер — Apache 1.x), включенные через SSI. Тут надо заметить, что
Trans_sid использовать нельзя, скрипты, включенные через SSI заголовок выдать не могут и, следовательно, проставить сессию в cookie — тоже. Сначала я, было, решил полностью отказаться от SSI и работать исключительно с iframe, но подумал — нельзя ли Apache заставить генерировать идентификатор сессии самостоятельно?
Оказалось — можно. Первое, что пришло в голову — использовать модуль mod_unique_id к Apache — я слышал об этом модуле, но никогда его не использовал. Внимательно прочитав инструцию к модулю, я понял, что это совсем не то, что нужно — модуль генерирует уникальный идентификатор для каждого запроса:
This module provides a magic token for each request which is guaranteed to be unique across «all» requests under very specific conditions. The unique identifier is even unique across multiple machines in a properly configured cluster of machines.
Внимательно пролистав список официальных модулей Apache, я нашёл в списке mod_usertrack — модуль, маркирующий пользователей при помощи cookie. Обычно он используется для того, чтобы различать пользователей в логах
Проведя испытания, я столкнулся с вполне ожидаемыми трудностями — во время первого запроса, когда сервер только что отослал cookie клиенту, в переменной PHP \_COOKIE$ пусто — cookie ещё не пришли от клиента назад и, соотвественно, не были записаны в эту переменную.
В PHP есть функция apache_response_headers, возвращающая массив всех заголовков, выдаваемых
<?php
function U_sid()
{
// Если идентификатор уже есть в cookie, возвращаем его
if (isset($_COOKIE['Apache'])) return $_COOKIE['Apache'];
// Иначе - ищем его в ответе Apache
$responce = apache_response_headers();
foreach (preg_split('/s*;s*/', @$responce['Set-Cookie']) as $chunk)
{
list($key, $value) = explode('=', $chunk, 2);
if ($key == 'Apache') return $value;
}
return null;
}«Apache» — это имя cookie, которое проставляет Apache. Далее — всё просто, в php.ini отключаем «session.use_trans_sid» и «session.use_cookies», чтобы запретить PHP создавать сессии, в .htaccess помещаем директивы модуля mod_usertrack:
CookieFormat Compact CookieTracking on CookieStyle CookieА в библиотечный файл (или наши файлы PHP, поближе к началу), вызов необходимых, для создания сессии, функций:
<?php
// Узнаём идентификатор сессии
if (($sid = U_sid()) !== null)
{
// Если он не null, создаём сессию
session_id($sid);
session_start();
}В итоге мы получаем
Решение проблемы box-model
В журнале kukutz’a на сайте NPJ появилась заметка «Решение проблемы
Известно, что есть как минимум два варианта
бокс-модели: W3Cшный, когда в ширину блока включен только размер содержимого (контента), майкрософтовский, когда в ширину блока включается ещё padding и border.
Майкрософтовский, надо сказать, куда более понятен и интуитивен.
Сегодня мы рассмотрим, как, проиграв в валидируемости ваших CSS, попросить все браузеры придерживаться Майкрософтовской
бокс-модели.
Находка
Меня поправляют. Спасибо Ильгизу Ахмадуллину:
Найдя чужую вещь,необходимо заявить о находке в милицию или в орган местного самоуправления (ст. 227 Гражданского кодекса РФ). Если в течение шести месяцев со дня заявления о находке лицо, управомоченное получить найденную вещь, не будет установлено или не заявит о себе в органы милиции, местного самоуправления, — нашедший вещь приобретает на нее собственность (согласно ст. 228 Гражданского кодекса РФ). В то же время лицо, нашедшее вещь, вправе потребовать от собственника вознаграждения. Согласно ст. 229 ГК РФ размер вознаграждения за находку может составлять до двадцати процентов стоимости вещи. Ссылка.
Что называется — я слышал звон, да не знаю где он. Что примечательно — впервые узнал я о положении с находками именно из программы «Час суда». Видимо, невнимательно слушал судью или неверно понял.