Евгений Степанищев

Эксперт в области разработки веб-приложений и безопасности в интернете. Каждый месяц мой блог посещают около 90 тысяч человек. Работаю техническим директором в «Системах документооборота», занимаюсь электронным правительством.

[Без заголовка]

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

There would, of course, be no job interview.


("А там, конечно, было вовсе не собеседование для приёма на работу").
Комментировать
24 ноября 2004 21:00

[Без заголовка]

Придумалось на слоган (первые четыре предложения) одного Card Reader'a, лежащего в коробке у нас в офисе:

No cables. No software. No drivers. No battery. Just a box.
Комментировать
24 ноября 2004 21:00

[Без заголовка]

Тут недавно повторяли замечательный фильм "Назад в будущее" и я вспомнил, что знаю какие ощущения испытывают гости из будущего. Через несколько месяцев после того как я посмотрел "Шрек-2" я увидел анонсы его будущего показа в кинотеатрах. Когда я говорил кому-нибудь, что уже смотрел "Шрек-2", то чувствовал себя, натурально, пророком - окружающие относились эквивалентно.
Комментировать
24 ноября 2004 21:00

[Без заголовка]

Фраза из руководства по MySQL (вариант руководства на русском):

Благодаря этому удобному синтаксису, в сервере MySQL не поддерживается оператор ANSI SQL || для конкатенации строк: вместо него используется функция CONCAT().


"Благодаря... не поддерживается"? Не вижу причин благодарить.
Комментировать
24 ноября 2004 21:00

[Без заголовка]

С подачи Ильи Бирмана начал изучать язык "toki pona" ("токи пона"). За три дня научился говорить простые предложения и понимать почти всё, что мне говорит Илья.

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

Пожалуй, подробно рассказывать о языке я не буду. Если интересно, загляните в WikiPedia. За эти три дня я убедился в двух вещах: на токи пона можно сказать всё; и ещё, что куда более интересно - некоторые вещи говорить не нужно. Последний принцип - один из основопологающих принципов toki pona. В оригинале он звучит несколько спорно: "если вы что-то не можете сказать на toki pona, то вам это не нужно".

Как не странно, принцип работает. На самом деле, просто-напросто, после перевода на toki pona понимаешь, что говорить это не нужно. Никаких чудес тут нет - в естественных языках очень много синонимов и способов выражения эмоций, тогда как в toki pona и слов-то немного, а способ выражения эмоций один - специальное слово-модификатор "а". Таким образом, прежде чем сказать фразу, приходится сначала понять что хочется сказать на базовом уровне. И, вполне может оказаться, что фраза ничего не означает.

Вышесказанное отлично иллюстрирует следующая небольшая история. Я спросил у Ильи как в toki pona выражают понятие "неделя". Оказалось, что понятия такого нет. Сказать мне его очень хотелось, поэтому я подумал, а что, собственно, такое неделя, почему в ней семь дней и откуда это пошл$о$? Вспомнить нетрудно - это семь дней сотворения мира. Таким образом, мы с Ильёй изобрели "неделю" - "tenpo pi pali ali" или "время, за которое было сотворено всё". Возможно, это слово скоро войдёт в официальный словарь сложных понятий toki pona.

Ещё небольшой пример. Предположим, ваш собеседник в аське давно не подаёт признаков жизни. Один из вопросов, который люди задают в этом случае является эмоциональное "ты где?". Попытавшись сказать это на toki pona, вы быстро обнаруживаете, что сконструировали что-то похожее на "ты находишься сейчас где?" ("sina lon seme?") и быстро понимаете, что спросить хотели совершенно не это. Разобравшись в себе, вы понимаете, что от собеседника вам нужно следующее: чтобы он вам ответил. Поэтому вы говорите просто "o toki" ("говори").
Комментировать
24 ноября 2004 21:00

[Без заголовка]

С днём рождения, Дима (5.42КБ)

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

Кстати, сразу отмету некоторые теории: дыра была не в регистре, у Димы на одной машине множество всего болтается и заливал я не через FTP.
Комментировать
13 ноября 2004 21:10

[Без заголовка]

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

CAPTCHA МТС (1.69КБ)

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

Кстати, подходящее время вернуться к разговору о защите от спамовых роботов, специализирующихся на форумах, гостевых книгах и т.п. Поводом послужила попытка Helix (aka Ulitka) усовершенствовать предложенные мною методы CAPTHA.

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

Предлагаю, умозрительно, поискать другие способы защиты от роботов, в стороне от методов CAPTCHA. Скажем, некоторые форумы генерируют для каждого пользователя или хоста, заходящего к ним, идентификатор, который может зависеть, от IP и User-agent пользователя. Идентификатор этот заносится в hidden-поле формы и должен присутствовать в данных формы. Как сервер получает эти данные, идентификатор удаляется и генерируется другой. Если по прошествии какого-то времени идентификатор не был использован, он так же удаляется.

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

Как известно, в браузерах есть скриптовые языки. Наиболее распространённым является JavaScript - его понимает максимальное количество современных браузеров. Код на этом языке включается прямо в страницу браузера "как есть", что делает заимствование кода на JavaScript часто минутным делом. Это положение вещей не устраивает некоторых разработчиков, что привело к появлению (обычной для интерпретируемых языков) защиты - программ изменяющих код таким образом, чтобы его было трудно прочитать человеку (такие программы часто называют "obfuscator").

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

Таким образом, объединение "маркеров", которыми помечаются пользователи и JS-obfuscator'a, возможно, будет хорошим решением проблемы защиты от роботом-спамеров. Проблемы, которые нужно решить - написание хорошего obfuscator для JavaScript и вопрос генерации "маркера" (не забывайте о защиты от flood'a, если "маркер" генерируется при каждом заходе пользователя, злоумышленник может сгенерировать гигантское количество "маркеров"), оставляю на читателя.
Комментировать
13 ноября 2004 21:05

[Без заголовка]

Финское чудо - телефон Nokia 6230, руссифицированный, думаю, где-то в пределах России, обладает исконно российским хамством. При включении, если очень быстро открыть адресную книгу, он может сообщить "Ждать, SIM-карта не готова".
Комментировать
13 ноября 2004 21:00

[Без заголовка]

Газета "Люди Голос" (21.04КБ)

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

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

Фразы, которые удаётся различить:

ЛЮДИ ГОЛОС. СОВЕТ. которые присту.. чтобы печататься СССР. ... марта. На вопрос, ... атмость каждого из этих...

(Гига)нтские Металлические ...асы Наций Кражи ...шин Угля, Нефти и Урана. (М)ировые Лидеры Двигаются, (что)бы Защитить Запасы. ...механические атакуют Россию
Комментировать
12 ноября 2004 21:00

[Без заголовка]

Перевод статьи "90% всех юзабилити-тестов - бесполезны" (90% of All Usability Testing is Useless, автор - Lane Becker).
Комментировать
12 ноября 2004 21:00

[Без заголовка]

Оказывается функция 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 вряд ли сортировка вернёт осмысленные данные.
Комментировать
12 ноября 2004 21:00

[Без заголовка]

Из статьи "Хайку и Моностихи":

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


В статье цитируется несколько моностихов, мне более всех понравился моностих Александра Смира:

Денег... на лепесток розы
Комментировать
12 ноября 2004 21:00

[Без заголовка]

Теперь у меня дома есть горстка сибирской пыли - заботливо упакованная в четыре (!) пакета, пупырчатый полиэтилен и коробку из-под сибирских котлет приехала она на видеокарте Nvidia GeForce3 Ti 200. Дима Смирнов, узнав, что у меня "до сих пор Riva TNT2" подарил мне свою старую карточку. Мне и старой хватало, но теперь я знаю что такое нормальный ClearType - без спецэффекта "мы работаем на XT". Спасибо, Дима!

Кстати, наверное некоторые уже и не знают что такое XT. XT - это машины с процессорами 8086/8088. Вот Pentium (еще до Celeron) считался 80586. Когда я начинал работать лаборантом на ВМК, там в одном классе стояли эти замечательные машины. Было видно как печатаются буквы в "Нортоне".
Комментировать
12 ноября 2004 21:00

[Без заголовка]

Цитата с сайта Adme:

Комиссар ЕС по делам здравоохранения Дэвид Бирн представил эскизы нового оформления сигаретных пачек, которое вскоре станет обязательным для всех производителей табака для европейцев. Всего предлагается использовать 42 фотографии, иллюстрирующих вредное воздействие курения на человека.


Эскиз пачки сигарет (22.42КБ)

Надпись на иллюстрации - "Курение может стать причиной медленной и мучительной смерти". Загляните на сайт - там ещё несколько картинок.
Комментировать
31 октября 2004 22:00

[Без заголовка]

Испокон веков в Apache (внимание! речь идёт об Apache 1.x) существует модуль mod_autoindex - в комментариях в его исходном коде есть дата, видимо написания первой версии - 23 марта 1993 года. С тех пор модуль, очевидно, претерпевал какие-то изменения, но с 1993 года форматирование вряд ли изменилось - всё тот же тег PRE.

С 1993 года HTML обогатился таблицами и каскадными стилями (CSS). Вряд ли сейчас кто-то использует браузеры не знающие что это такое, странно, что для вывода информации в модуле mod_autoindex до сих пор используется PRE. Сам по себе модуль очень неплох - он позволяет быстро (часто для этого вообще ничего не надо делать - просто убрать индексный файл из папки) организовать файловые архивы, а главное - организовать их без использования относительно медленного скриптинга, что может часто бывает критично для сервисов, пользующихся большой популярностью.

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

Стандартный модуль Apache позволяет менять, в этом плане:

Чаще всего этого для "упаковки" списка файлов в дизайн очень мало. Для облегчения задачи интеграции вывода mod_autoindex в дизайн я несколько усовершенствовал этот модуль. Всё по порядку.

Что умеет новый модуль my_mod_autoindex (10.06КБ)



Новый режим вывода

Прямоугольник (7.08КБ) Новый режим вывода включается автоматически, если были использованы параметры 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 нет методов переключения конфигурации в зависимости от каких-то внешних условий "на лету", так что было выбрано такое решение. На портах 80 и 443 (обычно используется для HTTPS-соединений) были заведены два виртуальных хоста:
<VirtualHost example.com:80>
...
AccessFileName .htaccess .htaccess-table
...
</VirtualHost>

<VirtualHost example.com:443>
...
AccessFileName .htaccess .htaccess-icons
...
</VirtualHost>

где прописаны одно общее имя .htaccess-файла для общих настроек и деректив AddDescription и два разных имени для различных наборов настроек mod_autoindex. Переключение происходит перенаправлением пользователя на определённый порт.

Хотелось бы ещё...

По всем вопросам, с пожеланиями по улучшению - добро пожаловать в мой почтовый ящик, он есть на моём сайте внизу каждой страницы.
Комментировать
31 октября 2004 21:00