Tąpnięcie

W pierwszej chwili myślałem, że posypały mi się statystyki. Nie zaglądam do nich często, ale strona ze statystykami jest otwarta w którejś tam zakładce w przeglądarce. Pewnego dnia ujrzałem ilość wejść na blog w okolicach zera. Była jedna czy dwie wizyty parę godzin wcześniej i… to wszystko. Odświeżenie strony nie pomogło. Korzystam z Matomo (dawniej Piwik) na własnym serwerze, więc jakaś awaria systemu, bazy czy koniec miejsca na dysku mogły mieć dokładnie taki efekt.

Posprawdzałem, nawet coś poprawiłem (drobny warning dotyczący bazy) i… bez zmian, a spadek wizyt dotyczył tylko podstawowego bloga, nie wszystkich stron. Spojrzałem w Google Webmaster Tools, a w zasadzie w Search Console, bo teraz tak to się chyba nazywa i… sprawa się wyjaśniła:

Blog w Google Search Console

Widać duży spadek przeciętnej pozycji w wyszukiwarce (z ~20 na ~60), idealnie skorelowany ze spadkiem wyświetleń (z ~800 na ~200), który przekłada się na trochę większy niż czterokrotny spadek odwiedzin. Myślałem, że chwilowe przeindeksowanie, zwłaszcza, że 04.08 w zasadzie wróciło do normy, wraz z wizytami na blogu, ale jak widać jest to raczej trwała zmiana.

Zapytałem wiedzących czy jest jakaś większa zmiana w Google. Ano jest, nazwa kodowa Maverick. Chociaż raczej chodzi o zmianę z pierwszego sierpnia. W każdym razie w Matriksie coś zmieniają.

Taka ciekawostka i ładny przykład, żeby się nie przywiązywać do strony, jej miejsca w wyszukiwarce i ilości wejść, skoro monopol na kształtowanie widoczności ma Google. W Search Console jest opóźnienie, więc jeszcze tego nie widać, ale patrząc na statystyki wizyt w ostatnich dniach wygląda, że sytuacja wraca do normy. I w sumie dobrze, bo nie mam weny na grzebanie w SEO.

PS Wpis pisany na raty, ostatecznie wygląda, że wizyty wracają do normy. Ziew.

Google CTF beginners quest 2019

W tym roku zostałem zaskoczony informacją o odbywającym się Google CTF na urlopie. Link o tym, że się odbywa wpadł z Hacker News. Zdziwiłem się, że minął już rok od ostatniej edycji. Planowałem poklikać podobne rzeczy, więc choć miałem nieco inne plany to stwierdziłem, że mogą poczekać, bo w zeszłym roku zabawa przednia była.

Google CTF 2019 screenshot

W tym roku formuła CTF dla początkujących była nieco inna. Wiele ścieżek, różne przejścia między węzłami (czyli więcej, niż jedna flaga w zadaniu), różne zakończenia w zależności od poziomu trudności. Nieco mieszane uczucia mam w stosunku do tego podejścia, zwł. szkoda, że nie widać wszystkich przejść między zadaniami.

Ponieważ urlop, to było sporo innych, ciekawszych zajęć, więc dość szybko się zniechęciłem. W zasadzie od razu po dotarciu do najłatwiejszego końca. Zadania wydawały mi się trudniejsze, niż w zeszłym roku. Albo inaczej – wymagające użycia dedykowanych narzędzi. W zeszłym roku chyba było bardziej ogólnie, przynajmniej jeśli chodzi o narzędzia, w tym bez gdb i pwntools wydaje mi się, że nie było szansy, nawet na najprostszym poziomie.

Nadal można próbować sił, do czego zachęcam. I w sumie sam pewnie siądę do reszty zadań w chwili wolnej, o ile jeszcze CTF będzie aktywny…

Wtyczki do WordPressa

Przesiadka na WordPressa była dobrym posunięciem, jednak ku mojemu zdziwieniu goły WordPress nie ma możliwości zrobienia – przynajmniej w prosty, cywilizowany sposób – wielu podstawowych rzeczy. Musiałem doinstalować pewne wtyczki, a po bliższym zapoznaniu się z tematem okazało się, że trafiają się tam naprawdę rewelacyjne narzędzia.

Wtyczki podzieliłem – bardzo subiektywnie – na dwie grupy – trzeba mieć oraz warto mieć. Zwykle będą to najniezbędniejsze narzędzia do podstawowych funkcjonalności, zdrowego SEO oraz narzędzia do optymalizacji bloga, zwł. czasu ładowania strony. Pora na grupę pierwszą, czyli pluginy IMO niezbędne:

BackWPup
Niezależnie od tego, czy masz własny serwer, korzystasz z hostingu który „robi backupy” czy kupujesz gotowca, warto mieć własną kopię zapasową. BackWPup robi robotę, ma sporo opcji konfiguracyjnych co backupować i gdzie przesyłać backup (tu akurat średnio jestem przekonany, lepiej zaciągać backup, niż go wysyłać z backupowanej maszyny). Potrafi działać cyklicznie, bez ingerencji, umie zrobić pełną kopię, wraz ze zdjęciami. Przypadł mi do gustu, więc nie testowałem alternatyw.

Advanced noCaptcha & invisible Captcha
Że spam na blogu może się zdarzyć – wiadomo. Miałem włączoną moderację, więc nic się nie prześlizgnęło, ale spamu wpadała cała masa. W przeciwieństwie do mniej popularnych platform blogowych, blogi oparte o WordPress są narażone na automatyczne znajdowanie przez boty, a wtedy… przychodzi nawet po kilka spamów dziennie. Moderowanie szybko mi się znudziło, różnego rodzaju rozwiązania antyspamowe mnie nie do końca przekonywały, postawiłem na standardowe rozwiązanie od Google. Ujęło mnie tym, że potrafi zabezpieczyć nie tylko formularz komentarzy, ale także logowanie, co znacznie utrudnia atak brute force (chociaż nie powstrzyma zdesperowanego atakującego, są rozwiązania do łamania CAPTCHA od Google). Prosta, standardowa konfiguracja, do wyboru różne warianty captcha, w tym wersja niewidoczna. Spam niemal zniknął, pojedyncze sztuki w miesiącu to raczej robota ludzi.

Download External Images In Posts
Znalazłem go poszukując sposobu na zaimportowanie obrazków podczas migracji z Blox i w sumie zrobił mi dzień. Działa w ten sposób, że pobiera zdalne obrazki i zapisuje je lokalnie, następnie serwuje z naszego serwera. Dzięki temu blog ładuje się szybciej (brak odwołań do wielu domen), mamy pełną kontrolę nad treścią i gwarancję jej niezmienności. Warto tu przypomnieć, że należy podawać źródło, skąd pochodzi dany obrazek na naszym blogu. Jeśli mamy ten plugin to odwiedzający nie może nawet „po prostu” zajrzeć w źródło, żeby to sprawdzić. Drobną wadą jest to, że nasz blog zajmuje nieco więcej miejsca – w końcu wszystkie zasoby są przechowywane u nas, ale przy dzisiejszych pojemnościach i cenach hostingu nie powinien być to żaden problem.

Najważniejsze wtyczki za nami, pora na mniej istotne.

Insert Headers and Footers
Potrzebowałem dodać statystyki Matomo (dawniej Piwik) i… okazało się, że w gołym WordPressie nie bardzo można to zrobić. Oczywiście do wszystkiego są dedykowane pluginy, ale jeśli ktoś – podobnie jak ja – przywykł do tego, że sam robi odpowiednie wklejki w stopce, to jest to plugin w sam raz dla niego. Nie szukałem alternatyw.

Cache Enabler
Z tym pluginem jest śmieszna historia. Tak naprawdę nie chodziło mi o cache czy różnego rodzaju funkcje optymalizacyjne (to już miałem zrobione, czy to natywnie w serwerze WWW, czy ręcznie), tylko o funkcję ukrytą pod nazwą create an additional cached version for WebP image support. Okazało się, że jest to – a przynajmniej był – najprostszy sposób, by zmusić WordPressa do serwowania grafik w formacie WebP przeglądarkom, które ten format umieją.

EWWW Image Optimizer
Narzędzie do optymalizacji grafik przechowywanych lokalnie. Mocno konfigurowalne, klikalne, potrafi bezstratnie (oraz stratnie, jeśli ktoś woli i wybierze taką opcję) optymalizować rozmiar zdjęć, dzięki czemu blog zajmuje mniej miejsca i wczytuje się szybciej. Potrafi też dokonywać przeskalowania grafik, dzięki czemu wysyłana jest nie tylko zoptymalizowana, ale najbliższa danemu rozmiarowi ekranu wersja. Domyślnie korzysta z zainstalowanych dodatkowych programów, więc nie jestem przekonany, czy będzie działał na shared hostingach. Jeśli ktoś ma swój VPS – polecam.

Google XML Sitemaps
Goły WordPress posiadał szczątkową sitemapę, albo wręcz jej nie posiadał. Plugin załatwia sprawę generowania sitemapy, która ułatwia poprawne zaindeksowanie treści. Jest sporo alternatyw w różnych wtyczkach do SEO, ten plugin spodobał mi się, bo nie jest kombajnem, robi tylko sitemapę.

Subscribe to Comments Reloaded
Chciałem dać czytelnikom często spotykaną na innych blogach i często przeze mnie wykorzystywaną możliwość subskrypcji komentarzy do danego wpisu, stąd jego obecność. Zachwalana funkcjonalność nie spotkała się z szerszym zainteresowaniem, ale samo rozwiązanie wydaje się działać OK. Na niedziałanie nikt się nie skarżył, alternatyw nie szukałem.

Tyle o pluginach, jeśli znasz inne ciekawe, podziel się nimi w komentarzach. Jeśli potrzebujesz pomocy z konfiguracją WordPressa – zapraszam do działu kontakt.

SEO przy zmianie domeny bloga

To ostatni wpis nawiązujący do Blox, przynajmniej techniczny, bo być może pojawi się jeszcze jeden o tym, jak Agora ma w głębokim poważaniu wolność słowa (określając to górnolotnie) i że ważniejsze jest parę złotych.

Po przeniesieniu bloga, o którym nieco pisałem, przyszedł czas na przeniesienie pozycjonowania w Google w nowe miejsce, czyli zabawę z SEO, aby ludzie wchodząc z wyszukiwarki trafiali w nowe miejsce. Przyznaję, że motywację miałem nikłą – nie zarabiam na wejściach, bo ani nie służy on do sprzedaży produktu, ani nawet nie ma podpiętych innych, pośrednich form zarobku.

Po przeniesieniu treści postanowiłem poczekać. Zwyczajnie i po prostu, nie robiąc nic, poza daniem informacji Google, że blog jest i jak interpretować zawarte na nim dane. Zresztą akurat miałem co innego na głowie. Znaczy ograniczyłem się do wypełnienia Data HighliterWebmaster Tools. Stan taki trwał jakiś miesiąc albo dwa.

Z braku kontroli nad nagłówkami pomysł przekierowania w nowe miejsce przy pomocy kodu odpowiedzi 301 odpadł w przedbiegach, choć to najprostsza, automatyczna i zalecana – także z punktu widzenia SEO – forma przekierowania ruchu w nowe miejsce.

Trochę czasu minęło, ilość wejść na nową lokalizację była szczątkowa, choć miałem nadzieję, że Google zacznie ogarniać sytuację samodzielnie. Niestety tak się nie stało, więc postanowiłem zacząć działać, choć miałem świadomość, że to praca, która się nie automatyzuje. Pierwsze co przyszło mi do głowy, to ustawienie link canonical dla wybranych, najczęściej odwiedzanych wpisów z nową lokalizacją jako celem. I tu okazało się, że Blox przewidział sytuację i… stosowne elementy HTML znikają po dodaniu ich w edycji źródła[1].

Z braku lepszych pomysłów dodałem w najpopularniejszych wpisach namiar na nowe miejsce, poprawiłem też linki do bloga w większości miejsc, gdzie były one umieszczone i… postanowiłem jeszcze poczekać. Poczekałem kwartał, ale nie wydarzyło się nic specjalnego. Statystyki wg Webmaster Tools wyglądały na koniec kwartału następująco:

ostanie 28 dni: impr: 2250, CTR 0,84%, avg pos 33,7. 130 wizyt

Delikatnie mówiąc szału nie ma.

Postanowiłem więc podziałać inaczej. Skoro nie mogę przekierować wyszukiwarki Google, to postanowiłem przekierować przynajmniej żywych ludzi, licząc, że Google w jakiś sposób to zauważy i odpowiednio zinterpretuje. Skoro nic nie działa, to co zadziała na pewno i czego nie można zablokować? Oczywiście JavaScript. Malware korzystający z niego ma się dobrze dzięki obfuskacji, zablokować całkowicie wykorzystania JS na stornie nie bardzo można, bo masa funkcjonalności z niego korzysta. Użyłem następującej wersji przekierowania z jednej lokalizacji na drugą (dla najpopularniejszych wpisów):

<script>
window.location.replace('https://zakr.es/blog/2017/09/goodbye-yanosik/');
</script>

Oczywiście powyższy JS był tylko w odpowiadającym wpisie na starym blogu, a URL w skrypcie to URL na nowym blogu.

Zadziałało nadspodziewanie dobrze. Nadspodziewanie, bo przy wejściu na URL kategorii zawierającej wyświetlany wpis z przekierowaniem, także przekierowywało. Co gorsza przekierowywało przy wejściu na stronę główną, bo także znalazł się tam wpis z przekierowaniem. Może i więcej ruchu przez to, ale niezupełnie o to chodziło i mało to precyzyjne… Dla wpisów z głównej dokonałem więc stosownej korekty w stylu:

<script>
var stringPathName = window.location.pathname;
if (stringPathName == "/2018/02/Waze-jako-nawigacja.html") {
  window.location.replace('https://zakr.es/blog/2018/02/waze-jako-nawigacja/');
}
</script>

Poczekałem miesiąc, wyniki w statystykach były zauważalne, zacząłem więc dodawać tego typu przekierowania dla kolejnych, popularnych linków. Po dwóch miesiącach od dodania przekierowań w JS, wyniki wyglądały następująco:

28 dni: impr: 10450, CTR 4,46%, avg pos 18.8, 490 wizyt

Jak widać wzrost wszędzie. Uznałem, że jest sukces, zacząłem – dla pewności – usuwać większość treści wpisów na starym blogu. Nie było negatywnego wpływu, nastąpił nawet dalszy, równie znaczący wzrost wskaźników, choć zakładam, że wynika on po prostu z upływu czasu.

Największym zaskoczeniem jest dla mnie, że Google przy pozycjonowaniu uwzględnia JS do tego stopnia. Wiedziałem, że radzi sobie z treścią w JS i umie odczytać URLe, ale w tym przypadku wygląda, że poprawnie interpretowany jest fakt przekierowania.

Co można było zrobić lepiej lub inaczej? Całość działań można było zamknąć w mniej niż dwa miesiące, gdybym od razu wiedział co robić i działał zdecydowanie. Oczywiście lepsze efekty byłyby, gdyby zmiany dotyczyły wszystkich wpisów, ale jest to żmudna, ręczna praca, której poświęcałem kilka minut dziennie przy porannej kawie. Powyższy sposób przekierowania nie jest jedynym dostępnym w JS, miałem w planach sprawdzenie różnych, ale ten sprawdziłem jako pierwszy i zadziałał powyżej oczekiwań, więc nie testowałem innych.

Na koniec jeszcze garść cyferek. Ingerowałem ręcznie w ww. sposób w 40 wpisów. Wg Matomo nowy blog ma obecnie ok. 4-5 razy większą ilość wizyt, niż stary. Czyli ładny podział zgodnie z zasadą Pareto.

Co dalej? Dodawanie przekierowań w kolejnych wpisach i usuwanie z nich treści. Ostatecznie pewnie usuwanie przekierowanych wpisów, ale póki co nie mam na to ciśnienia.

[1] Tu zniknęła moja wątpliwość w celowość działań Blox w celu przywiązania użytkowników do swojej platformy. Przypominam: technicznie mają kontrolę nad nagłówkami i domeną – to jakby naturalne i cena za korzystanie ze współdzielonej platformy. Do tego wyłączyli parę lat temu – rzekomo tymczasowo – API. Ale jak widać dodatkowo jeszcze celowo ingerują w treść HTML.

UPDATE: Wersja ultimate, czyli przekierowująca – w założeniu – wszystkie wpisy, a dodawana prosto w jednym miejscu (Własny HTML pod każdym wpisem). Sprawdza, czy URL kończy się ciągiem „.html”, jeśli tak, do URLa bazowego nowej lokalizacji (koniecznie bez / na końcu!) dodaje ścieżkę. Działa dla schematu URLi w WordPress zgodnego z Blox. Wyżej opisane wpisy szczegółowe mają pierwszeństwo.

<script>
var stringPathNameBlog = window.location.pathname;
myRegexp = /(.*?)\.html/;
myBase = "https://zakr.es/blog";
if (stringPathNameBlog.match(myRegexp)){
var match = myRegexp.exec(stringPathNameBlog);
var newLoc = myBase + match[1] + "/";
window.location.replace(newLoc);
}
</script>

UPDATE: Warto jeszcze poprawić URLe do innych wpisów na blogu tak, by kierowały na nową lokalizację. Jak to zrobić dla WordPressa opisałem w aktualizacji wpisu o migracji z Blox na WordPress.

Trzy lata, sześć miesięcy i dwa tygodnie

Rzadko coś mnie zadziwia do tego stopnia i wielowymiarowo, jak to, o czym dowiedziałem się dziś. Chodzi oczywiście o błąd w Google+. No dobrze, nie sam błąd mnie zadziwił, bo ten był raczej mizerny. Poszło o to, że jeśli użytkownik Google+ udostępnił jakiejś aplikacji dostęp do danych publicznych swojego konta Google+, to aplikacja miała też dostęp do danych prywatnych. Z bardziej krytycznych – w świetle choćby RODO – do adresu email, imienia, nazwiska.

Chodzi o 500 tys. użytkowników, dane nie są super wrażliwe, udostępnione tylko aplikacjom. Oczywiście błąd pozostaje błędem, ale ten w dodatku został wykryty samodzielnie, nie na skutek wycieku. Ogólnie niezły potencjał na opowieść, którą nawet jeśli nie można się pochwalić, to nie ma się co wstydzić.

I tu pojawiają się tytułowe trzy lata, sześć miesięcy i dwa tygodnie, które jeżą włos na głowie. No dobrze, nie wszystkie. Trzy lata, to czas, kiedy podatność była dostępna. Tak naprawdę, powinny być dwa i pół, ale lepiej pasowało do clikcbaitowego tytułu. W dodatku zupełnie nie ma znaczenia ile czasu podatność była obecna – prawdopodobieństwo wykrycia nie rośnie z każdym dniem.

Ciekawe są dwie kolejne wartości. Sześć miesięcy to czas, przez który Google zataiło informację o podatności, bojąc się reakcji opinii publicznej. Wykryto ją w marcu 2018, ogłoszono wczoraj. W dodatku twierdzą, że w sumie nie wiedzą, czy podatność została wykorzystana, bo logi API mają z tytułowych dwóch tygodni, a nie trzymają ich dłużej, bo szanują prywatność użytkowników. Poważnie tak uzasadnili, w informacji o wycieku, która jest niejako przy okazji. Bardzo ładne zagranie PR-owe, ale jedyny komentarz, który przychodzi mi do głowy to:

Źródło: https://imgflip.com/i/2jpigy

Prędzej uwierzyłbym, że nie mają tych logów, bo im się na dyskach nie mieściły. 😉

Nie wiem, czy tak właśnie wygląda the right thing w świecie security, ale po graczu wielkości Google spodziewałem się jednak większej transparentności.

Kolejne zaskoczenie to reakcja rynku. Czy też może właśnie brak tej reakcji. Akcje Alphabet symbolicznie spadły, szybko odrobiły. Nie stało się nic… Przynajmniej na razie, zobaczymy jeszcze jak zareagują urzędy regulujące różnej maści, ale póki co wszystko wskazuje na to, że ani prywatność, ani transparentność nie są dzisiaj w cenie.

UPDATE: Po dokładniejszym zbadaniu, 10 grudnia, Google oznajmiło, że chodzi o 52 mln użytkowników więcej. Tzn. tylu więcej podobno dotyczył bug. O logach ani słowa. 😉