Июль 07 2009

Вернуть старую навигацию в PHPMyAdmin 3

Категория: Юзабилитиgugglegum @ 17:13

Всем, кому не по душе новая навигация в PHPMyAdmin (PMA) версии 3.0 и выше, кто привык к тому, что в левой колонке при клике на имя таблицы показывается ее структура, а клик по иконке слева от имени таблицы — ее содержимое (а не наоборот, как сейчас), то Вам будут полезны следующие параметры конфигурации, которые надо добавить в config.inc.php:

$cfg['LeftDefaultTabTable'] = 'sql.php';
$cfg['DefaultTabTable'] = 'tbl_structure.php';

Найти эти параметры в конфигурации по ключевым словам, и даже при визуальном просмотре всех существующих параметров довольно трудно. В FAQ тоже нет, хотя это изменение — первое что бросается в глаза и некоторых начинает раздражать после перехода с PMA 2.x на 3.x.


Ноя 06 2008

Кириллический домен .РФ

Категория: Uncategorizedgugglegum @ 18:29

Вчера, 5 ноября, ICANN таки принял решение о создании зоны .рф (домена верхнего уровня). Что я могу сказать? Человеческая глупость не имеет предела.

В свое время RU-Center устроил голосование на своем сайте и разослал ссылку на него всем своим клиентам, т.е. всем, кто регистрировал какие-либо домены в зоне .ru и не только. Текст письма был составлен таким образом, чтобы вызывать патриотические чувства у людей, легко ведущихся на развод. Там говорилось про то, что Россия может быть первой страной, в которой будет введены кириллические домены (но не говорилось про то, что она же может стать и последней). Плюс они устроили акцию “Поддержи Россию, проголосуй за .РФ!”. Быдло всегда ведется на простые и понятные лозунги, не пытаясь разобраться в чем именно при этом будет заключаться поддержка России и кому это выгодно на самом деле.

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

Как будут развиваться события? Первым делом киберсквоттеры начнут скупать звучные домены из русского словаря типа пиво.рф, водка.рф, секс.рф и т.п. Через пару недель после этого “проснутся” обычные компании, которые уже имеют свои сайты и чтобы не стать жертвой киберсквоттеров начнут регистрировать свои торговые марки (как зарегистрированные, так и незарегистрированные) в русской раскладке типа “евросеть.рф”, “билайн.рф” и т.п. На этих доменах они будут делать либо зеркало (альяс) основного сайта, либо редирект на англоязычный домен в зоне .RU. Количество сайтов, существующих исключительно в зоне .РФ я оцениваю не более 5%.

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

Кстати, в браузере адреса в кириллице будут выглядеть весьма неприглядно. Введенный адрес, скажем, “кремль.рф” будет трансформироваться в нечто страшное: “http://www.xn--e1ajeds9e.xn--p1ai/”. Теоретически возможно написание какого-нибудь плагина или расширения для каждого браузера, которое будет подменять написание, и тогда в адресной строке можно будет видеть реальную кириллицу, но пока ничего такого нет. Opera, правда, не трансформирует русские домены — то ли она их попросту не поддерживает, то ли трансформирует незримо для пользователя.

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


Сен 30 2008

Защита сайта от cross-site request forgery (CSRF)

Категория: Безопасностьgugglegum @ 00:54

Cross-site request forgery — это разновидность атаки на пользователя, при которой посещаемый веб-сайт выполняет несанкционированные действия, используя действующую авторизацию.

Предположим Вы зашли на сайт A, авторизовались там как пользователь (используя куки) и не завершая сессии зашли на сайт B, который использует CSRF-уязвимость сайта A и выполняет от Вашего имени какие-либо действия, например, постит сообщение, содержащее спам, поднимает репутацию какому-нибудь пользователю или что-нибудь еще в таком духе. А может быть еще и вот такой забавный сценарий, который некогда воплотился на сайте вконтакте.ру.

Прежде чем продолжить, хочу сразу сделать оговорку. CSRF — это в общем понимании не совсем уязвимость. Уязвимость — это когда при каких-то определенных условиях программа ведет себя не так, как задумывал ее разработчик. Но CSRF — это нормальное поведение всех сайтов в Интернете! Это можно сказать фича Интернета, которая иногда может быть использована во вред.

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

Иногда это бывает удобно. Например, мне как-то раз надоело вручную заполнять одни и те же заявки на неисправность у провайдера КабiNET и я на локалхосте создал форму один в один повторяющую поля и указал в качестве обработчика (action) обработчик на сайте провайдера. В результате, у меня была своя форма заявки, в которой уже были заведены основные шаблоны описаний неисправностей, нужно было лишь выбрать шаблон и нажать Отправить.

Это был пример мирного применения CSRF, но существуют естественно и враждебные, защиту от которых должен предусмотреть разработчик сайта. Ситуация осложняется тем, что враждебный сайт может использовать Javascript, чтобы произвести отправку формы (без всяких кликов, неважно GET или POST) в невидимом IFrame’е так, что пользователь даже не будет знать о том, что от его имени где-то что-то выполнилось. Страшно? :)

Как же защититься от враждебного применения CSRF?

В примитиве обработчик формы может просто проверять HTTP-заголовок Referer, где указывается с какого адреса пришел запрос и если адрес левый, то не обрабатывать запрос. Но этот заголовок не является обязательным и некоторые файрволлы (я точно знаю, что Agnitum Outpost Firewall) подменяют значение этого заголовка на название или адрес сайта файрволла. Поэтому полагаться на Referer все же не стоит.

Более грамотным решением является встраивание в форму дополнительного скрытого поля, содержащее какое-то значение, зависящее от текущей сессии пользователя. Самое простое и первое что приходит в голову — естественно идентификатор сессии. Враждебный сайт не сможет прочитать куку другого сайта (см. same origin policy) и соответственно не сможет подставить в скрытое поле правильное значение.

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

См. также описание CSRF на википедии.


Сен 29 2008

Несколько функций __autoload в одном коде на PHP

Категория: PHPgugglegum @ 05:35

С полгода назад я писал про нюансы автоматической загрузки классов с использованием __autoload(), и там указывал на проблему использования данного способа, заключающуюся в том, что функция с магическим именем “__autoload” может быть объявлена только одна. Поэтому, если Вы пишете свой фреймворк и использовали в нем функцию с этим именем, то другой фреймворк, использующий аналогичную функцию уже не сможет работать в паре с Вашим.

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

Так было полгода назад. В последствии я ближе познакомился со Standard PHP Library (SPL) и осознал, что эта проблема давно решена при помощи функции spl_autoload_register, которая активизирует стэк из функций автозагрузки классов.

Разумеется, Вы должны использовать уникальное имя для своей функции автозагрузки, поэтому от имени “__autoload” лучше отказаться сразу. Можете использовать уникальный префикс типа “myframework_autoload” или завернуть эту функцию в отдельный класс автозагрузки. А еще лучше (в рассчете на будущее) использовать нэймспэйсы в PHP, хотя это сразу ограничит минимальную версию PHP до 5.3.0.

Когда Вы первый раз вызываете функцию spl_autoload_register(), она активизирует стэк функций автозагрузки классов и с этого момента функция с именем “__autoload” уже не вызывается автоматически, если только Вы не зарегистрируете и ее. Т.е. с момента вызова spl_autoload_register функция с именем “__autoload” перестает быть магической. И даже разрегистрирование всех функций автозагрузки при помощи spl_autoload_unregister не возвращает ее магическое предназначение.

Зарегистрированные функции вызываются в том же порядке, в каком они были зарегистрированы. Цепочка вызовов прекращается сразу как только очередная функция автозагрузки нашла и загрузила нужный класс. Исходя из этого, логичнее регистрировать функции автозагрузки в порядке частоты их предполагаемого использования (частые в начало). Продолжить чтение “Несколько функций __autoload в одном коде на PHP”


Сен 27 2008

Что нового нас ждет в PHP 5.3?

Категория: PHPgugglegum @ 13:26

Случайно наткнулся на сайте php.net на анонс альфа версии PHP 5.3, глянул список изменений и был настолько воодушевлен, что решил написать об этом здесь. Данное обновление принесет нам, пожалуй, самые ожидаемые нововведения в синтаксисе языка.

Ура! В PHP наконец-то появятся нэймспэйсы! Что это такое? Это разделяемые пространства имен, в которых Вы определяете классы и функции, чтобы они не пересекались там, где не надо. Случалось ли Вам объявлять какой-то класс, например, DB или Log, а потом при подключении какой-нибудь библиотеки или репозитария классов обнаружить, что там уже есть класс с точно таким же именем и это создает Вам проблемы. Особенно при использовании функции автозагрузки классов (см. __autoload).

И что в этой ситуации делают почти все разработчики библиотек? Правильно, приписывают префиксы к именам своих классов типа “MyFramework_ClassName”. При этом сами имена классов бывают довольно длинные, а в купе с префиксом и вовсе разростаются иной раз до 40 и более символов. Конечно, это неудобно каждый раз везде писать такие длинные имена, особенно внутри самого фреймворка.

Решение в нэймспэйсах — Вы просто объявляете в начале каждого файла с классом нэймспэйс и все Ваши классы в рамках этого нэймспэйса, будут друг с другом “на короткой ноге”. А чтобы обратиться из другого нэймспэйса нужно либо указать полное имя класса вместе с нэймспэйсом, либо импортировать нэймспэйс при помощи ключевого слова “use”.

Что еще примечательно, нэймспэйсы могут быть вложенными, т.е. образовывать иерархическую структуру, обращаться к которой можно через путь. Вам это ничего не напоминает? Да, именно так реализованы пакеты классов в Java. Только там это называются package, а здесь namespace.

Я не буду переводить всю документацию, моей целью было рассказать лишь общую суть. Подробнее читайте сами.

Еще советую познакомиться с другим интересным нововведением в синтаксисе — “Late static binding“. Дело в том, что при статических вызовах self:: не является своего рода статичным аналогом $this, т.к. self:: ссылается на класс, в котором он используется, а не на тот, к которому идет обращение. Пример в документации очень наглядно демонстрирует проблему и решение, при помощи нового синтаксиса “static::”. Как минимум это должно упростить использование паттерна Singleton когда класс, реализующий данный паттерн, необходимо расширить (наследовать).


Сен 03 2008

Google Chrome. Первые впечатления

Категория: Googlegugglegum @ 12:50

Вчера мой друг Макс прислал мне ссылку на подборку новостей о том, что Google опубликовал анонс выпуска собственного браузера “Chrome”, основанного на исходниках Apple WebKit (Safari). По правде сказать, для меня это было неожиданностью. Уже 4 года ходят слухи о том, что гугл вроде как собирается выпустить свой браузер, но воспринимались они как что-то очень недостоверное и далекое во времени. К тому же были и официальные заявления с опровержениями этих слухов — мол существующие браузеры их и так устраивают. А тут бац! Нате новый браузер.

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

Просто я установил Chrome-beta себе на компьютер и могу поделиться первыми впечатлениями. Итак, первое впечателние: просто супер! Эргономика интерфейса на высшем уровне. Сделано так, чтобы было удобно пользоваться. Правда, удобство может обернуться обратной стороной, когда возникнет потребность расширять функционал посредством сторонних расширений. Надеюсь, разработчики предусмотрели и это. А пока что без расширений Chrome для меня просто забавная игрушка типа Opera. Странно, конечно, что разработчики взяли за основу движок Apple WebKit, а не Mozilla Gecko, но главное чтоб он хорошо работал и соблюдал стандарты по части рендеринга страниц.

Пожалуй, главным новшеством в Chrome является мульти-процессная архитектура (multi-process design). Это означает, что все вкладки и окна браузера живут не в одном процессе и делят процессорное время посредством искусственных механизмов в самом браузере, а в отдельных процессах и их разделением занимается операционная система. Теоретически это также должно позволить обрабатывать разные табы разными ядрами процессора на компьютерах с мультиядровыми процессорами. В Chrome есть один главный процесс самого браузера и по одному процессу на каждый непустой таб. Продолжить чтение “Google Chrome. Первые впечатления”


Авг 13 2008

HowTo: Как не стать Supernode в Skype

Категория: Lifehack, Безопасностьgugglegum @ 13:14

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

Если пользователь сидит за NAT или прокси-сервером, то установить соединение к нему извне в общем случае невозможно. Такой пользователь может только сам устанавливать исходящие соединения, а принимать входящие не может. В случае если из двух звонящих только один не может принимать входящие соединения, то соединение инициирует тот, который как раз не может (к тому, который может). А если оба не могут, то тут проблема! И для решения этой проблемы Skype использует специальные узлы, которые могут принимать входящие соединения и выступают посредниками для передачи трафика между двумя пользователями. Такие узлы называются супер-узлами (supernodes) и как правило ими являются обычные пользователи, сетевые настройки и организация сети которых позволяют Skype принимать входящие соединения, а также скорость сетевого канала и мощность компьютера достаточно хороши. Программа Skype переходит в режим супер-узла автоматически, если видит такую возможность, никак не уведомляя при этом пользователя.

Для пользователей с прямым и быстрым выходом в интернет (без прокси-сервера и роутера с функцией NAT) это чревато тем, что Skype будет использовать мощность процессора и память на благо других пользователей Skype, но самое главное — это сетевой трафик. В России все еще в большинстве регионов оплата за Интернет идет помегабайтно, в таком случае Вы можете реально попасть на деньги. Для тех же, кто использует безлимитные тарифы провайдера трафик не так страшен, но вряд ли кому-то будет приятно потерять часть от и без того ограниченной скорости. Нигде точно не сказано какой минимально должна быть скорость соединения, чтобы ее было достаточно для того, чтобы стать супер-узлом. Везде говорится про быстрый канал. Скажем, 1 мегабит это быстро или нет? Кому как… Продолжить чтение “HowTo: Как не стать Supernode в Skype”


Авг 06 2008

Убираем лишние пункты меню в del.icio.us (firefox add-on)

Категория: Firefox, Lifehack, Юзабилитиgugglegum @ 15:06

Я использую этот сервис сетевых закладок уже более 2-х лет и для удобства использую устанавливаемое в браузер расширение Firefox, позволяющее добавлять закладки чуть быстрее и удобнее. Но, чем дальше, тем меньше оно мне нравится. В первую очередь своей назойливостью. Мне нравятся программы, которые делают то, для чего предназначены и не делают ничего лишнего. По началу так и было — старое расширение добавляло всего 2 кнопки (одну из которых можно было и убрать). Но с переходом на Firefox 3.0 про данное расширение можно забыть и пользоваться новым расширением, которое совсем не так скромно.

Новое расширение в обычном режиме всячески стремится заменить собой обычные закладки браузера. Мне же это совсем не нужно, у меня разные области применения для них. В Firefox я храню закладки, к которым обращаюсь достаточно регулярно (посещаемые сайты, форумы, темы/посты с моими комментариями в ожидании ответов, базовая документация, собственные проекты, часто востребованные сервисы и т.п.), а в del.icio.us я храню то, что хотел бы сохранить на будущее на случай, если мне это вдруг когда-нибудь понадобится. Система организации часто используемых ссылок на основе тегов, к сожалению, неудобна, т.к. не позволяет, например, выносить часто используемые ссылки на верхний уровень, а редко используемые — в самый низ иерархии разделов, плюс не дает сортировать их вручную. А когда тегов больше сотни, искать нужный тег весьма неудобно.

delicious_normal.pngКроме этого, это расширение создает дополнительное корневое меню Delicious между меню Журнал и Закладки и переопределяет некоторые стандартные горячие клавиши Firefox. Так, например, Ctrl-B открывает уже не панель закладок Firefox, а панель закладок Delicious. Добавляет пункт опций в меню Инструменты; добавляет в меню Закладки в конце пункт “Hide This Menu”, который скрывает меню Закладки так, что их вернуть можно только через опции расширения; добавляет в контекстное меню таба пункт “Bookmark This Tab In Delicious…” и черт знает что еще, большая часть из которого не отключается через обычные настройки. Продолжить чтение “Убираем лишние пункты меню в del.icio.us (firefox add-on)”


Авг 03 2008

Тихий UPS для дома

Категория: Бесшумностьgugglegum @ 01:30

В сегодняшнем посте я поделюсь своим жизненным опытом, касающимся выбора UPS для домашнего использования.

Небольшое вступление

Около года назад я решил обзавестись источником бесперебойного питания, пошел в Трилайн и по рекомендациям консультанта купил одну из не самых дешевых моделей UPS — APC Back-UPS RS 500. Придя домой, поставил его заряжаться без нагрузки, как и положено было инструкцией, но меня сразу напряг высокочастотный шум (свист, в районе 14-16 КГц) и одновременно низкочастотный (гудение, в районе 50 Гц). Я подумал может это по-началу так при первой зарядке, но шум этот не пропал и потом. Я достаточно щепетильно отношусь к любым шумам у себя дома, стараюсь везде где можно использовать пассивное охлаждение, а там где нельзя — тихие вентиляторы (чаще всего ZALMAN и GlacialTech).

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

Я обратился в магазин, они передали его в сервисный центр, те взяли UPS на проверку, через некоторое время сообщили, что UPS дефектный и приняли на ремонт. Обещали сделать за неделю, в итоге растянулось это на несколько месяцев. В конечном итоге его якобы починили, но, когда я пришел его забирать, я проверил его и характерный шум никуда не исчез и сотрудники магазина убеждали меня, что это нормально, так и должно быть. Меня это естественно не устроило, я был просто в ярости — 3 месяца они трахали мой мозг и в итоге ничего не исправили. Я вернул деньги, но UPS мне по-прежнему был нужен и я вернулся к тому же, с чего начал… Продолжить чтение “Тихий UPS для дома”


Июль 30 2008

Решение проблемы AutoRun-вирусов (отключение autorun.inf)

Категория: Lifehack, Безопасностьgugglegum @ 11:49

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

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

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

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

Трагедия заключается в том, что в Windows XP по умолчанию запрет автозапуска для съемных дисков не установлен, и благодаря этому вирусы типа Autorun получили огромную распространенность. В версиях Windows 2000 и 2003 заразить Autorun-вирусом можно по сути только через CD, но через CD много людей не заразишь, да и сам CD заразить довольно сложно, а флешки — просто идеальный вариант. Поэтому, если у Вас Windows XP, и Вы ничего специально не настраивали, то Вы рискуете заразить свой компьютер, вставляя очередную флешку Вашего лучшего друга, и начать заражать после этого других своих друзей. Далее я расскажу про 2 способа защититы от этого. Продолжить чтение “Решение проблемы AutoRun-вирусов (отключение autorun.inf)”


« Предыдущая страницаСледующая страница »