Kilka dni temu zwrócił się do mnie z zapytaniem jeden z czytelników, czy mógłbym pomóc przy stronie opartej o platformę WordPress – zadanie z pozoru banalne, bo trzeba skasować jeden katalog z zawartością, oraz utworzyć nowy, i wgrać do niego odpowiedni plik.
Ale był też haczyk – brak dostępu do systemu plików. Zarówno przez protokół FTP czy SCP, jak i przez jakikolwiek menedżer plików w formie webowej…
Spis treści w artykule
Zarządzanie plikami bezpośrednio z WordPressa
Pech chciał, że z dotychczasowym administratorem strony (i zarządzający kontem hostingowym) kontakt się – tak jakby – urwał kilka dni temu (nie, prawdopodobnie to nie ten sam administrator co w 2be/Adweb ;-)), a na koncie hostingowym coś poszło nie tak, i…
W każdym razie trzeba było skasować jeden katalog – powiedzmy, że był to katalog:
wp-content/uploads/backup-12345678/
A w nim potencjalnie kilka giga tymczasowych plików…
W normalnej sytuacji zalogowałbym się do serwera po FTP/SCP, i najzwyczajniej w świcie skasował stwarzający problemy katalog, w raz z całą zawartością – w tym przypadku nie było takiej możliwości, nie było też szans na szybkie uzyskanie loginu i hasła do panelu zarządzani kontem.
Kasowanie plików i katalogów za pomocą PHP
Na szczęście czytelnik posiadał login i hasło do panelu zarządzania WordPressem, i miał wystarczające uprawnienia by możliwe było zmodyfikowanie plików szablonu/motywu (a już np. zarządzanie wtyczkami miał wycięte/zablokowane), i właśnie ten element postanowiłem wykorzystać.
Tak więc szybko przeszedłem do edytora plików związanych z wybranym/aktywnym motywem:
- Ustawienia > Wygląd > Edytor
Moim celem w takich przypadkach zazwyczaj jest plik header.php, gdyż kod w nim umieszczony wywoływany jest przy każdym wczytaniu strony, a więc wykona się bez większych kombinacji.
I tak na samym końcu postanowiłem dodać linijkę, dzięki której wybrany katalog zostanie skasowany wraz z zawartością:
<?php array_map('unlink', glob("wp-content/uploads/backup-12345678/*")); ?>
By ew. dodatkowo się zabezpieczyć przed wykonaniem kodu podczas wizyty na stronie przypadkowego użytkownika, można ograniczyć jego wywołanie np. tylko do zalogowanych użytkowników:
<?php
if ( is_user_logged_in() ) {
array_map('unlink', glob("wp-content/uploads/backup-12345678/*"));
}
?>
Na koniec wystarczy zapisać plik, i wejść na stronę, by wywołał się dodany przez nas kod, a tym samym katalog zniknął z naszego konta/dysku.
Pamiętajcie, by po wywołaniu kodu (jednorazowym wejściu na stronę) skasować dodane linijki, czyli przywrócić plik header.php do pierwotnej/oryginalnej zawartości.
Tworzenie katalogów, wgrywanie plików z pomocą PHP
Ale by nie było, że w ten sposób możemy podejmować tylko i wyłącznie działania destrukcyjne, to korzystając z okazji pokaże jak w ten sam sposób – korzystając tylko z innego kodu – utworzyć katalog, lub wgrać plik.
A by nie była to sucha pisanina, to jako wzór posłuży mi opisany niedawno sposób na monitorowanie stanu strony za pomocą szablonu własnej strony, więc naszym celem będzie utworzenie katalogu „page-templates” w katalogu z motywem:
wp-content/themes/nazwa-motywu/page-templates
Podstawowy kod, za pomoca którego utworzymy katalog może wyglądać tak:
<?php mkdir('wp-content/themes/nazwa-motywu/page-templates'); ?>
Choć w przypadku WordPressa możemy/warto skorzystać z innego polecenia:
<?php wp_mkdir_p('/wp-content/themes/nazwa-motywu/page-templates'); ?>
Dodatkową zaletą jest to, że jednym poleceniem możemy utworzyć wiele zagnieżdżonych podkatalogów, bez konieczności tworzenia jednego po drugim:
<?php wp_mkdir_p('/wp-content/themes/nazwa-motywu/page-templates/web/insider/pl'); ?>
Gdy już mamy utworzony niezbędny katalog, możemy przystąpić do wgrywania pliku – do wyboru mamy co najmniej 2 drogi:
- Utworzenie nowego, pustego katalogu i późniejszą edycję
- Wgranie pliku gotowego z zewnętrznej lokalizacji
Plik – do późniejszej edycji za pomocą np. edytora szablonów/motywów – utworzymy za pomocą polecenia:
<?php touch('/wp-content/themes/nazwa-motywu/page-templates/wordpress-status.php'); ?>
Możemy też przygotować gotowy plik, który następnie umieszczamy w innej lokalizacji, i pobieramy/dodajemy go bezpośrednio do naszej strony:
<?php file_put_contents('/wp-content/themes/nazwa-motywu/page-templates/wordpress-status.php', fopen('https://webinsider.pl/przykladowy-plik-zrodlowy.txt', 'r')); ?>
Jak być może zauważyliście – plik źródłowy ma rozszerzenie „txt” zamiast „php”, dzięki czemu zostanie wyświetlony/pobrany w całości, a nie wykonany.
Oczywiście przedstawione tutaj przykłady nie wyczerpują tematu, ale tym wpisem chciałem Wam tylko zasygnalizować kierunek, np. gdybyście znaleźli się w podobnej sytuacji…
- Zero Trust od Cloudflare, czyli prosty i bezpieczny sposób na dostęp do lokalnych zasobów z zewnątrz, bez publicznego adresu IP i otwierania portów na routerze - 1970-01-01
- Home Assistant i integracja z IMGW-PIB, czyli tworzymy automatyzację z powiadomieniami bazując na sensorach zagrożenie i alarm powodziowy - 1970-01-01
- Home Assistant 2024.9 i kolejne przydatne nowości w widoku „sekcje”, dzięki którym jeszcze lepiej można dopasować wygląd - 1970-01-01
Oo! Fajny temat! Dodaję palca w górę ;)
Dzięki.
Teraz to wprawdzie było zlecenie, które mogłem przyjąć bądź nie, ale kiedyś – zablokował się (jak zwykle w takich przypadkach – sam ;-)) dostęp do FTP na hostingu, a musiałem dokonać pilnie pewnych zmian, nie mogąc sobie pozwolić na czekanie na reakcję BOKu – powiedzmy, że tego typu operacjami uratowałem nie tylko swój tyłek… ;-)