Opiszę tutaj jak odzyskać hasło admina do systemu CMS Drupal 7 w przypadku pojawienia się kłopotów z wysłaniem nowego hasła w wiadomości email i nie mając dostępu do Shell'a. Zakładam tutaj jednak możliwość dostępu do katalogu www poprzez FTP, a także dostęp do bazy danych poprzez phpMyAdmin.
W systemie Drupal 6, w którym hasło admina zabezpieczane było w tabeli bazy danych SQL algorytmem kryptograficznym MD5, odzyskanie hasła w sytuacji opisanej powyżej wiązało się jedynie z wydaniem jednego polecenia SQL w interfejsie phpMyAdmin, np:
update users set pass = md5('newpass') where uid = 1;
W systemie Drupal 7, gdzie hasła użytkowników haszowane są za pomocą o wiele bezpieczniejszego od MD5 algorytmu sha512, sytuacja nieco się komplikuje, lecz odzyskanie hasła jest możliwe nadal w sposób dość banalny, pod warunkiem, że wiemy jak to zrobić. Jak więc odzyskać hasło admina Drupal 7 gdy system nie wysyła poczty? Ponadto, skoro nie mamy dostępu do Shell'a to nie możemy wygenerować zahaszowanego ciągu znaków nowego hasła, korzystając ze specjalnego skryptu znajdującego się zestawie skryptów Drupal 7, tak aby wygenerowany w ten sposób ciąg znaków wpisać później do kolumny o nazwie pass w tabeli users, w wierszu odpowiednim użytkownikowi admin, czyli o wartości uid = 1 . Gdy dostęp do Shell'a jest możliwy, wówczas z poziomu głównego katalogu Drupal ciąg znaków odpowiadający zahaszowanemu hasłu można wygenerować w ten oto sposób:
cd scripts;
password-hash.sh 'nowehasloadmina'
password-hash.sh 'nowehasloadmina'
Jedyne co nam pozostaje, w sytuacji gdy nie mamy dostępu do Shell'a, a wiadomości z nowym hasłem nie są wysyłane przez system Drupal, to utworzenie skryptu php z odpowiednią zawartością, przesłanie go na główny katalog systemu Drupal poprzez ftp i uruchomienie skryptu w przeglądarce. Oto jaką treść powinien zawierać nasz magiczny skrypt php, który po uruchomieniu w przeglądarce wyświetli nam ciąg znaków odpowiadający zahaszowanemu hasłu:
<?php
define('DRUPAL_ROOT', getcwd());
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
require_once 'includes/common.inc';
require_once 'includes/password.inc';
echo user_hash_password('nowehasloadmina');
die();
?>
define('DRUPAL_ROOT', getcwd());
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
require_once 'includes/common.inc';
require_once 'includes/password.inc';
echo user_hash_password('nowehasloadmina');
die();
?>
Otrzymany w ten sposób ciąg znaków należy wprowadzić do kolumny o nazwie pass, w tabeli users, po uprzednim uwierzytelnieniu się w interfejse phpMyAdmin, wydając następujące polecenie SQL:
update users set pass = 'zahaszowanehasloadmina' where uid = 1;
To wszystko na dziś i mam nadzieję, że artykuł okaże się pomocny. Jeśli tak, to z góry dziękuję za udostępnianie.