Jak ograniczyć dostęp do strony podczas programowania?

17

Tworzę nową stronę opartą na Drupal 7.

Opracowanie nastąpi na serwerze, który jest publicznie dostępny. Pracuję w środowisku wielu witryn.

Chciałbym całkowicie zablokować dostęp do witryny każdemu i cokolwiek innego niż upoważnionym użytkownikom. W tym dostęp do nazwy witryny, motywu itp.

Wcześniej korzystałem z Bezpiecznej strony do podobnych zadań. Dokonał uwierzytelnienia na poziomie http i zwrócił 403, gdy uwierzytelnienie nie powiodło się. Nie ma wersji D7.

Jaki byłby najłatwiejszy sposób to zrobić?

daphshez
źródło

Odpowiedzi:

15

Utwórz moduł i wklej następujący kod w pliku modułu:

<?php

/**
 * Implementation of hook_boot().
 *
 * Ask for user credentials and try to authenticate.
 */
function foo_boot() {
  require_once DRUPAL_ROOT . '/includes/password.inc';

  if (isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])) {
    $query = "SELECT pass FROM {users} WHERE name = :name";
    $result = db_query($query, array(':name' => $_SERVER['PHP_AUTH_USER']));
    $account = new stdClass();
    foreach ($result as $row) {
      $account->pass = $row->pass;
    }
    if (isset($account->pass)) {
      if (user_check_password($_SERVER['PHP_AUTH_PW'], $account)) {
        return;
      }
    }
  }

  header('WWW-Authenticate: Basic realm="Development"');
  header('HTTP/1.0 401 Unauthorized');
  exit;
}

Korzysta z uwierzytelniania HTTP i sprawdza bazę danych Drupal pod kątem prawidłowej nazwy użytkownika i hasła.

Jeśli masz jakiekolwiek problemy z PHP CLI, Drush lub cron, możesz dodać następujący kod w haku:

  // Allow cron through
  if (basename($_SERVER['PHP_SELF']) == 'cron.php') {
    return;
  }  

  // Allow PHP CLI/Drush through
  if (isset($_SERVER['argc'])) {
    if (php_sapi_name() == 'cli' || (is_numeric($_SERVER['argc']) && $_SERVER['argc'] > 0)) {
      return;
    }
  }
Bart
źródło
Słowo dla mądrych, to całkowicie spieprzy twoje środowisko Drush. Dodatkowe opinie ode mnie, jeśli stworzysz obejście Drush.
Lester Peabody
Gotowe, dodano szersze podejście, które obejmuje PHP CLI i cron.php.
Bart
1
Gorąco. Szybka odpowiedź też. Głosowałbym ponownie, gdybym mógł.
Lester Peabody
to nie działa w ogóle z Drupal 8
DrCord
Dlatego jest to oznaczone jako Drupal 7.
Bart
4

Jeśli używasz Drupala 7, moduł Osłony jest dostępny do tego celu. Uwierzytelnia pojedynczego, wspólnego użytkownika i hasło.

Tarcza uwierzytelniania PHP. Tworzy prostą osłonę dla witryny z uwierzytelnianiem Apache. Ukrywa strony, jeśli użytkownik nie zna prostej nazwy użytkownika / hasła. Traktuje Drupala jako „otoczony murem ogród”. Ten moduł pomaga chronić witrynę (programistę) za pomocą uwierzytelniania HTTP.

Johnathan Elmore
źródło
+1 - Nie wymyślaj koła ponownie. Jest to już zrobione i uwzględnia różne konfiguracje serwerów i drush.
Adam Balsam
2

Dodaj mod_authdo konfiguracji Apache. Zależy to od twojego hosta (Linux, Windows). Może to obejmować pobranie modułu, może wymagać jedynie odkomentowania linii w pliku httpd.conf

 LoadModule auth_basic_module modules/mod_auth_basic.so

Utwórz plik .htpasswd za pomocą htpasswdpolecenia w folderze plików binarnych apache

 htpasswd -c user pass

Dodaj następujący kod do <DIRECTORY>wyciągu zaraz po regule przepisywania czystych adresów URL:

AuthType Basic
AuthName "My Auth"
AuthUserFile \path\to\.htpasswd
Require valid-user

Uruchom ponownie apache. Zysk.

Alex C.
źródło
Dzięki. Nie mogę przetestować tego rozwiązania, ponieważ ten projekt jest na hostingu współdzielonym i nie mam dostępu do httpd.conf. Zastanawiam się jednak, czy to w ogóle może działać w środowisku z wieloma witrynami.
daphshez,
czy masz dostęp do .htaccesspliku w katalogu głównym drupal? Nie jestem w 100% pewien, ale możesz spróbować go tam umieścić. Pamiętaj, że rozwiązanie Barta wydaje się o wiele lepsze :)
Alex C
zobacz moją odpowiedź do Dana. Mogę zmienić plik .htaccess, ale nie jestem pewien, w jaki sposób pomaga mi to w konfiguracji z wieloma witrynami.
daphshez
Jest to dobre rozwiązanie, ale nie można za jego pomocą przetestować funkcji udostępniania społecznościowego.
Sukhjinder Singh,
0

OP skomentował, że dotyczy to hostingu współdzielonego. Większość hostingu współdzielonego zapewnia cPanel lub inny panel sterowania, który zapewni proste zabezpieczenie hasłem .htaccess dla katalogów.

Za pomocą tej metody zabezpieczyłem katalog najwyższego poziomu tworzonej witryny. Jeśli używasz cPanel do ochrony katalogu, poszukaj punktu menu „Katalog chroniony hasłem”.

Jeśli chronisz katalog najwyższego poziomu przed instalacją Drupala, cPanel utworzy plik .htaccess w tym katalogu. Dołącz lub dołącz zawartość tego pliku za pomocą pliku .htaccess, który zapewnia Drupal. Jeśli zabezpieczysz katalog po zainstalowaniu Drupala, jestem całkiem pewien, że cPanel po prostu doda potrzebne linie do istniejącego pliku .htaccess Drupala i nie zakłóci reszty pliku. Upewnij się, że zachowałeś te linie, jeśli zastąpisz plik .htaccess podczas aktualizacji Drupal.

Dan Halbert
źródło
Dzięki, ja też mam dostęp do powłoki. Ale czy mogę użyć htaccess (lub httpd.conf, jeśli o to chodzi), jeśli chcę chronić tylko jedną witrynę w konfiguracji obejmującej wiele witryn?
daphshez
Przepraszam, przegapiłem komentarz dotyczący wielu witryn w PO. Nie używam wielu witryn, ale sprawdziłem, jak to działa. Ponieważ wiele witryn Drupal używa jednego katalogu najwyższego poziomu, rozwiązania tutaj, myślę, że tylko Bart's by działały. Być może możesz także uruchomić witrynę programistów w trybie konserwacji, aby zablokować wszystkich oprócz administratora. Zobacz tutaj kilka wskazówek.
Dan Halbert