понедельник, 24 декабря 2007 г.

Защита от сервиса с непристойным названием

или Окапываемся в SAPE (часть 3)

После нахождения в сети злополучного для всех саповцев сервиса определения продажных ссылок, и даже подняв вокруг него небольшую шумиху на ньюсе2.ру (отдельное спасибо s13 за размещение новости). Я несколько был поражен и озадачен алгоритмом, с помощью которого система, в моем случае, безошибочно определяла автоматически расставленные ссылки. В скором времени я разобрался, что и по чем, тем самым обезопасил свои ресурсы от грозного сервиса с незвучным названием.

Вкратце поясню, принцип работы сервиса для тех, кто в бронетранспортёре.

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

Проще говоря, получая на вход такой линк http://site.ru/, сервис загружает сраницу, затем генерит примерно следующий урл http://site.ru/?vsyakiy_musor=!@#$^%&*() и по нему загружает вторую страницу. Сравнивает их, берет разность по ссылкам и считает ее продажной.

Зная этот ключевой момент, просто делаем так чтобы саповский скрипт правильно сравнивал полученный урл с имеющемся с базе линков.

Расскажу что я сделал для того чтобы обмануть сервис. Для этого залез в sape.php

С помощью метода тыка и добрался до этого блока. 

...
// Убиваем PHPSESSID
if (strlen(session_id())) {
$session = session_name() . '=' . session_id();
$this->_request_uri = str_replace(array('?'.$session,'&'.$session), '', $this->_request_uri);
}
...

В данном блоке производится выкашивание из $this->_request_uri идентификатора сессии. И мне показалось данная операция является очень схожей с той которая нам нужна. Только в моем случае надо убивать не только сессию, но и все что приходит после символа '?'.

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

  $this->_request_uri = preg_replace('/\?\S*/',"",$this->_request_uri);

Сохранил изменения. Проверяю...

Еззз! После этих манипуляций чудо-сервис прекратил определять все автоговнолинки.

Ну что господа?! Кто ещё не в Sape?! Бегом регаться, пока ироды какой-нибудь другой бяки не придумали :)

А чуть не забыл. Хочу предупредить, данное решение работает только на урлах без параметров и/или поверх ЧПУ-ссылок. То есть если сравниваемые урлы будут с параметрами, то задача по противостоянию усложняется в разы. Как я вижу, нужно будет определять все допустимые параметры и с помощью тех же регулярных выражений, но более извращенных, производить их фильтрацию. Но это охрененное усложнение. Лучше и проще, на мой взгляд, юзать mod_rewrite, тем более в популярных движках поддержка ЧПУ-ссылок уже является стандартом де-факто.

Ещё на всякий случай, сниму всю ответственность за неправильное истолкование и использование представленной здесь информации. Короче люди, если что-то у кого-то не заработает – я не виноват. Перед экспериментами советую сделать бэкап скрипта, а лучше всего сайта.

пятница, 21 декабря 2007 г.

SMO сифа :)

или 5 фактов cущей правды из моей офлайн жизни

Совсем недавно, мой земляк Могилевский бомж и Enginman запулили в меня эстафетной палочкой Презренного Манимэкера. За что им персональная благодарность. Разъяснять правила и условия этой блогерской игры не буду, а просто сошлюсь на первоисточник.

Суть игры. Я должен рассказать пять интересных вещей о себе. Вещей личных, никак не связанных с Интернетом, о которых Вы, наверняка, не слышали, а затем указать пять человек, которых нужно привлечь к этому же занятию. Еще раз повторяю главное условие - вещи не должны касаться интернета и работы - только личная жизнь, которая до недавнего момента была скрыта от читателей. И, мне кажется, это идеальный вариант сближения с аудиторией блога :).

Вполне понятно.

Итак! Сближаемся с аудиторией блога...

Факт 1. Я очень рассеян. Причина в том, что если мне приходиться думать и сосредотачиваться на какой-то мысли, то делаю я это в однопотоковом режиме. Все фоновые процессы переключаются на уровень бессознательных условных рефлексов, которые порой и подводят. Обделенные моим вниманием мелочи, вытесняются из памяти наиболее глобальной мыслью в виду своей малозначительности. В результате чего: чайники на плите кипят 2-3 часа;  вода, не закрытая после утренней помывки, течёт весь день; колпачки от зубных паст не завинчены, двери не закрыты, кошельки, флэшки, ключи позабыты дома и т.д. и т.п.

Факт 2. Мне нужна информация. Где-то на третьем курсе университета у меня проснулось чувство, так называемого, информационного голода. Не самое плохое на мой взгляд чувство. Я понимал и понимаю, что что пока есть этот голод его нужно утолять. Чем я и занимаюсь по сей день. Куда бы я не пошел, чтобы я ни делал, мне нужно получать извне информацию, постоянно в чем-то разбираться, читать, развиваться. Для этих целей я купил себе чудо-девайс смартфон, на который я с регулярной постоянностью скидываю необходимую литературу и который я зачитываю до дыр.

Факт 3. "Нам песня строить и жить помогает". Я меломан. Жить не могу без хорошей музыки. Особенно живой гитарной музыки. Благо сейчас с этим проблем нету. Понравилось что-то, залез в инет, поискал и качай хоть всю дискографию. Для этих целей я купил себе чудо-девайс смартфон, на который я с регулярной постоянностью скидываю необходимую музычку и слушаю везде где бы я не находился. Пинк Флойд - фарева!

Факт 4. Приветствую здоровый и адекватный спор и соответственно людей, которые умеют спорить "правильно". Не беспочвенно выдумывать свои предположений или уничижительно и саркастично пререкаться, не желая слышать и слушать никого кроме себя, (в такой спор я стараюсь не вступать, ибо бесполезен он) А состязаться в качестве интеллектуальной дискуссии, в которой всегда интересно посмотреть на объект спора со стороны оппонента. Не перебивая, выслушать его точку зрения, проанализировать, сравнить, возразить, привести опровергающие факты и доводы. В таком споре действительно рождается истина. В случае даже если правда оказывается не на моей стороне, мне без особого труда и совершенно невпадлу признать своё поражение. Главное, для меня в этом деле, не победа, а сам процесс.

Факт 5. На юзерпике справа, на самом деле, не я :)

Теперь нужно передать эстафету "пятерым счастливчикам".
Итак, эстафетную палку кидаю в следующих блоггеров.

  1. Одесскому бомжу;
  2. Ищущему трезвых людей;
  3. Дендрологу Бананового Рая;
  4. Другу человеков (Rajaka);
  5. Сергею Михайлову.

За сим откланиваюсь. Бывайте.

суббота, 8 декабря 2007 г.

Оптимизированный H1

SEO-оптимизация блоггерского темплейта

В данной статье обозначу несколько рекомендаций по поводу поисковой оптимизации блоггерского шаблона. 

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

Исходим из вышеописанного утверждения, и принимаем её за неоспоримую условность.

Итак, на странице тэг h1 используем только один раз.

Продолжаем развивать тему. 

В большинство представленных на выбор блоггерских темплейтов тэгом h1 обрамлен заголовок блога.  И так на всех страницах блога. То есть гугл помещая в индекс очередную страницу с этого ресурса каждый раз натыкается на один и тот же заголовок. Что в общем-то не есть хорошо. Намного эфективнее и оптимальнее, на мой взляд, было бы сделать следующее: на морде оставить все как есть, то бишь хидером1 обрамляем <h1>заголовок блога</h1>, а на всех остальных страницах <h1>название поста</h1>

Итак, сделаем это на нашем любимом блогспотовском блоге.

Примечание: Все экзекуции я производил исключительно на xml-шаблонах (конкретнее на Stretch Denim Light), так как старые классические html-шаблоны, имхо, потиху отмирают.

Значит так, логиннимся идем в макет править в ручную шаблон. Ищем что-то наподобии этого:

<h1 class='title'>
<b:if cond='data:blog.url == data:blog.homepageUrl'>
<data:title/>
<b:else/>
<a expr:href='data:blog.homepageUrl'><data:title/></a>
</b:if>
</h1>

Это вывод заголовка блога. Изменяем найденный блок на этот

<b:if cond='data:blog.pageType != "item"'>
<h1 class='title'>
<b:if cond='data:blog.url == data:blog.homepageUrl'>
<data:title/>
<b:else/>
<a expr:href='data:blog.homepageUrl'><data:title/></a>
</b:if>
</h1>
<b:else/>
<h2 class='title'>
<b:if cond='data:blog.url == data:blog.homepageUrl'>
<data:title/>
<b:else/>
<a expr:href='data:blog.homepageUrl'><data:title/></a>
</b:if>
</h2>
</b:if>

Здесь просто добавляется дополнительное условие - является страница мордой или нет. Если морда - то заголовок в h1, если нет- в h2.  

 Дальше проделываем все тоже самое с точностью до наоборот с блоком вывода названия поста. Ищем

<b:if cond='data:post.title'>
<h3 class='post-title'>
<b:if cond='data:post.link'>
<a expr:href='data:post.link'><data:post.title/></a>
<b:else/>
<b:if cond='data:post.url'>
<a expr:href='data:post.url'><data:post.title/></a>
<b:else/>
<data:post.title/>
</b:if>
</b:if>
</h3>
</b:if>

и заменяем на

<b:if cond='data:post.title'>
<b:if cond='data:blog.pageType == "item"'>
<h1 class='post-title'>
<b:if cond='data:post.url'>
<a expr:href='data:post.url'><data:post.title/></a>
<b:else/>
<data:post.title/>
</b:if>
</h1>
<b:else/>
<h3 class='post-title'>
<b:if cond='data:post.url'>
<a expr:href='data:post.url'><data:post.title/></a>
<b:else/>
<data:post.title/>
</b:if>
</h3>
</b:if>
</b:if>

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

h1.title, h2.title {
line-height: 1.4em;
font-size: 150%;
}
h1.post-title, h3.post-title {
line-height: 1.2em;
font-size: 100%;
}

Всё. Сохраняем темплэйт и проверяем все ли работает так как надо.

Идею можно применить не только к блоггерскому, но и к любому другому тэмплейту, а точнее взять за шаблон при разработке своих собственных шаблонов :)

ту би континуед ...

суббота, 1 декабря 2007 г.

Сервис определения продажных ссылок

Наткнулся накануне на сервис, который с порога грозиться определить на продажность любую страницу сайта.

Название домена ebanavrot.spb.ru не внушило никакого доверия. Сразу закралось сомнение и предвзятость к функциональному назначению данного сервиса. Саркастически улыбаясь, я решил произвести апробацию сервиса и заодно проверить свой квазиэнтропийный говнолинкоконцентратор.

И шо ви думаите.

Зараза-сервис, плевать хотел на все мои мегаэнтропийные ссылки и со свистом определил факт продажности, вдобавок вывел их на экран. 

Сарказм и улыбка сменилась озадаченностью и озабоченностью.

Я проверил ещё …

И ещё …

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

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

Только после этого эксперимента в глаза бросилась ключевая фраза сервиса: Система не определяет продажные ссылки расставленные вручную.

Как же так? Какие будут соображения, господа гусары?

ЗЫ. Если поисковые системы возьмут на вооружение алгоритм данного сервиса (если, конечно, уже не взяли), то можно готовиться к не самым хорошим временам. Так что, пока не поздно быстренько регаемся в системе и гребём балабасы рыдлеўкамi ;)