Jak zabezpieczyć hasła do bazy danych w PHP?

Gdy aplikacja PHP nawiązuje połączenie z bazą danych, zazwyczaj musi podać login i hasło. Jeśli używam jednego, minimalnego uprawnienia logowania do mojej aplikacji, to PHP musi znać ten login i hasło gdzieś. Jaki jest najlepszy sposób zabezpieczenia tego hasła? Wygląda na to, że samo pisanie go w kodzie PHP nie jest dobrym pomysłem.

Author: AviD, 2008-09-19

17 answers

Kilka osób błędnie odczytało to jako pytanie o to, jak przechowywać hasła w bazie danych. To jest złe. Chodzi o to, jak zapisać hasło, które pozwala uzyskać do bazy danych.

Zwyczajowym rozwiązaniem jest przeniesienie hasła z kodu źródłowego do pliku konfiguracyjnego. Następnie pozostaw administration i zabezpieczenie tego pliku konfiguracyjnego administratorom systemu. W ten sposób programiści nie muszą nic wiedzieć o hasłach produkcyjnych, a nie ma zapis hasła w twojej kontroli źródła.

 209
Author: user11318,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-07 19:51:47

Jeśli hostujesz na cudzym serwerze i nie masz dostępu poza swoim webroot, zawsze możesz umieścić swoje hasło i / lub połączenie z bazą danych w pliku, a następnie zablokować plik za pomocą.htaccess:

<files mypasswdfile>
order allow,deny
deny from all
</files>
 94
Author: kellen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-03 18:28:18

Przechowuj je w pliku poza katalogiem głównym.

 36
Author: da5id,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 23:32:18

Najbezpieczniejszym sposobem jest brak informacji określonych w kodzie PHP.

Jeśli używasz Apache, oznacza to ustawienie szczegółów połączenia w httpd.plik conf lub virtual hosts file. Jeśli to zrobisz, możesz wywołać metodę mysql_connect () bez żadnych parametrów, co oznacza, że PHP nigdy nie wyświetli Twoich informacji.

W ten sposób można określić te wartości w tych plikach:

php_value mysql.default.user      myusername
php_value mysql.default.password  mypassword
php_value mysql.default.host      server

Następnie otwierasz połączenie mysql w następujący sposób:

<?php
$db = mysqli_connect();

Lub jak to:

<?php
$db = mysqli_connect(ini_get("mysql.default.user"),
                     ini_get("mysql.default.password"),
                     ini_get("mysql.default.host"));
 36
Author: Lars Nyström,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-21 14:42:21

Dla bardzo bezpiecznych systemów szyfrujemy hasło do bazy danych w pliku konfiguracyjnym (który sam jest zabezpieczony przez administratora systemu). Podczas uruchamiania aplikacji/serwera aplikacja poprosi administratora systemu o klucz deszyfrujący. Hasło do bazy danych jest następnie odczytywane z pliku konfiguracyjnego, odszyfrowane i przechowywane w pamięci do wykorzystania w przyszłości. Nadal nie jest w 100% bezpieczny, ponieważ jest przechowywany w pamięci odszyfrowanej, ale trzeba go nazwać "wystarczająco bezpieczny" w pewnym momencie!

 33
Author: pdavis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-19 13:33:51

To rozwiązanie jest ogólne, ponieważ jest przydatne zarówno dla otwartych, jak i zamkniętych aplikacji źródłowych.

  1. Utwórz użytkownika systemu operacyjnego dla swojej aplikacji. Zobacz http://en.wikipedia.org/wiki/Principle_of_least_privilege
  2. Utwórz zmienną środowiskową (nie sesyjną) dla tego użytkownika, z hasłem
  3. Uruchom aplikację jako ten użytkownik

Zalety:

  1. nie będziesz sprawdzał haseł do kontroli źródeł przez przypadek, ponieważ can ' t
  2. nie zepsujesz przypadkiem uprawnień do plików. Możesz, ale to nie wpłynie na to.
  3. może być odczytany tylko przez roota lub tego użytkownika. Root może odczytać wszystkie Twoje pliki i klucze szyfrowania.
  4. Jeśli używasz szyfrowania, jak bezpiecznie przechowujesz klucz?
  5. działa x-platform
  6. Upewnij się, że nie przekazujesz envvar do niezaufanych procesów potomnych

Ta metoda jest sugerowana przez Heroku, którzy są bardzo skuteczni.

 13
Author: Neil McGuigan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-26 16:20:46

Jeśli możliwe jest utworzenie połączenia z bazą danych w tym samym pliku, w którym przechowywane są poświadczenia. Wprowadź dane uwierzytelniające w instrukcji connect.

mysql_connect("localhost", "me", "mypass");

W przeciwnym razie najlepiej jest odłączyć poświadczenia po instrukcji connect, ponieważ poświadczenia, które nie znajdują się w pamięci, nie mogą być odczytywane z pamięci ;)

include("/outside-webroot/db_settings.php");  
mysql_connect("localhost", $db_user, $db_pass);  
unset ($db_user, $db_pass);  
 11
Author: Bob Fanger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-19 05:49:50

Twoje wybory są trochę ograniczone, ponieważ mówisz, że potrzebujesz hasła, aby uzyskać dostęp do bazy danych. Jednym z ogólnych sposobów jest przechowywanie nazwy użytkownika i hasła w oddzielnym pliku konfiguracyjnym, a nie w głównym skrypcie. Następnie należy przechowywać to poza głównym drzewem sieci. To było, jeśli istnieje problem z konfiguracją sieci Web, który pozostawia Pliki php po prostu wyświetlane jako tekst, a nie są wykonywane, nie ujawniono hasła.

Poza tym jesteś na właściwej linii przy minimalnym dostępie do używanego konta. Dodaj do tego

  • nie używaj kombinacji nazwy użytkownika/hasła do niczego innego
  • Skonfiguruj serwer bazy danych tak, aby akceptował tylko połączenia z hosta sieciowego dla tego użytkownika (localhost jest jeszcze lepszy, jeśli DB jest na tej samej maszynie) w ten sposób, nawet jeśli poświadczenia są ujawnione, nie są użyteczne dla nikogo, chyba że ma inny dostęp do maszyny.
  • zaciemnić hasło (nawet ROT13 zrobi) to nie będzie dużo obrona, jeśli niektórzy uzyskają dostęp do pliku, ale przynajmniej uniemożliwi przypadkowe oglądanie go.

Piotr

 7
Author: Vagnerr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 23:36:03

Myślę, że OP oznacza hasło do bazy danych.

Chyba, że ktoś uzyska dostęp do twojego serwera przez FTP lub SSH (w takim przypadku jesteś już zepsuty), nie martwiłbym się przechowywaniem haseł w tekstach zwykłych w plikach PHP. Większość aplikacji PHP, które widziałem, robi to w ten sposób, na przykład phpbb.

 5
Author: Ryan Bigg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 23:31:52

Umieść hasło do bazy danych w pliku, ustaw je tylko do odczytu dla użytkownika obsługującego pliki.

Chyba, że masz jakieś sposoby zezwalania procesowi serwera php na dostęp do bazy danych, to prawie wszystko, co możesz zrobić.

 5
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 23:32:40

Jeśli używasz PostgreSQL, to automatycznie wyszukuje w ~/.pgpass hasła. Więcej informacji można znaleźć w instrukcji .

 5
Author: Jim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 23:52:43

Jeśli chodzi o hasło do bazy danych, w przeciwieństwie do hasła pochodzącego z przeglądarki, standardową praktyką wydaje się umieszczenie hasła do bazy danych w pliku konfiguracyjnym PHP na serwerze.

Musisz tylko mieć pewność, że plik php zawierający hasło ma odpowiednie uprawnienia. Tzn. powinien być czytelny tylko przez serwer WWW i przez twoje konto użytkownika.

 4
Author: Jason Wadsworth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 23:35:09

Poprzednio przechowywaliśmy DB user / pass w pliku konfiguracyjnym, ale od tego czasu trafiliśmy w tryb paranoid -- przyjmując politykę obrony w głębi .

Jeśli aplikacja jest zagrożona, użytkownik będzie miał dostęp do odczytu pliku konfiguracyjnego, więc istnieje możliwość, że cracker odczyta te informacje. Pliki konfiguracyjne mogą również zostać przechwycone w kontroli wersji lub skopiowane wokół serwerów.

Przełączyliśmy się na przechowywanie user / pass w zmiennych środowiskowych ustawionych w Apache VirtualHost. Ta konfiguracja jest odczytywana tylko przez roota - mam nadzieję, że Twój użytkownik Apache nie działa jako root.

Przekręt polega na tym, że teraz hasło znajduje się w globalnej zmiennej PHP.

Aby zmniejszyć to ryzyko, mamy następujące środki ostrożności:

  • hasło jest zaszyfrowane. rozszerzamy klasę PDO o logikę do odszyfrowania hasła. Jeśli ktoś przeczyta kod, w którym nawiązujemy połączenie, nie będzie oczywiste, że połączenie jest ustalany za pomocą zaszyfrowanego hasła, a nie samego hasła.
  • zaszyfrowane hasło jest przenoszone ze zmiennych globalnych do zmiennej prywatnej aplikacja robi to natychmiast, aby zmniejszyć okno, że wartość jest dostępna w przestrzeni globalnej.
  • phpinfo() jest wyłączony. PHPInfo jest łatwym celem, aby uzyskać przegląd wszystkiego, w tym zmiennych środowiskowych.
 4
Author: Courtney Miles,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-15 02:41:48

Dodatkową sztuczką jest użycie oddzielnego pliku konfiguracyjnego PHP, który wygląda tak:

<?php exit() ?>

[...]

Plain text data including password

Nie uniemożliwia to prawidłowego ustawienia reguł dostępu. Ale w przypadku, gdy Twoja witryna zostanie zhakowana, "wymagaj" lub "dołącz" po prostu zamknie skrypt w pierwszej linii, więc jeszcze trudniej jest uzyskać dane.

Niemniej jednak, nigdy nie pozwól plikom konfiguracyjnym w katalogu, do którego można uzyskać dostęp za pośrednictwem sieci. Powinieneś mieć folder "Web" zawierający kontroler kod, css, obrazki i js. To wszystko. Wszystko inne trafia do folderów offline.

 3
Author: e-satis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-19 13:08:18

Najlepszym sposobem jest nie przechowywać hasła w ogóle!
Na przykład, jeśli korzystasz z systemu Windows i łączysz się z serwerem SQL, możesz użyć zintegrowanego uwierzytelniania, aby połączyć się z bazą danych bez hasła, używając tożsamości bieżącego procesu.

Jeśli musisz połączyć się z hasłem, najpierw Zaszyfruj , używając silnego szyfrowania( np. używając AES-256, a następnie Chroń klucz szyfrowania, lub używając szyfrowania asymetrycznego i niech system operacyjny chroni cert), a następnie przechowuj go w pliku konfiguracyjnym (poza katalogiem WWW) za pomocą strong ACLs .

 3
Author: AviD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-20 21:17:12

Po prostu umieszczenie go gdzieś w pliku konfiguracyjnym jest tak, jak to zwykle robi się. Tylko upewnij się, że:

  1. zablokowanie dostępu do bazy danych z serwerów spoza twojej sieci,
  2. Uważaj, aby przypadkowo nie pokazać hasła użytkownikom (w komunikacie o błędzie lub poprzez Pliki PHP przypadkowo podane jako HTML, itp.)
 3
Author: Marijn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-10 03:14:41

Rozwiązaliśmy to w ten sposób:

  1. Użyj memcache na serwerze, z otwartym połączeniem z innego serwera haseł.
  2. Zapisz do memcache hasło (lub nawet całe hasło.plik PHP zaszyfrowany) oraz klucz deszyfrujący.
  3. strona internetowa, wywołuje klucz memcache z hasłem pliku hasła i odszyfrować w pamięci wszystkie hasła.
  4. Serwer haseł wysyła nowy zaszyfrowany plik hasła co 5 minut.
  5. Jeśli używasz zaszyfrowanego hasła.php na Twoim projekt, umieścić audyt, że sprawdzić, czy ten plik został dotknięty zewnętrznie - lub oglądane. Gdy tak się stanie, możesz automatycznie wyczyścić pamięć, a także zamknąć serwer w celu uzyskania dostępu.
 3
Author: Asi Azulay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-28 16:27:10