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.
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.
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>
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.
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"));
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!
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.
- Utwórz użytkownika systemu operacyjnego dla swojej aplikacji. Zobacz http://en.wikipedia.org/wiki/Principle_of_least_privilege
- Utwórz zmienną środowiskową (nie sesyjną) dla tego użytkownika, z hasłem
- Uruchom aplikację jako ten użytkownik
Zalety:
- nie będziesz sprawdzał haseł do kontroli źródeł przez przypadek, ponieważ can ' t
- nie zepsujesz przypadkiem uprawnień do plików. Możesz, ale to nie wpłynie na to.
- może być odczytany tylko przez roota lub tego użytkownika. Root może odczytać wszystkie Twoje pliki i klucze szyfrowania.
- Jeśli używasz szyfrowania, jak bezpiecznie przechowujesz klucz?
- działa x-platform
- Upewnij się, że nie przekazujesz envvar do niezaufanych procesów potomnych
Ta metoda jest sugerowana przez Heroku, którzy są bardzo skuteczni.
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);
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
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.
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ć.
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 .
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.
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.
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.
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 .
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:
- zablokowanie dostępu do bazy danych z serwerów spoza twojej sieci,
- Uważaj, aby przypadkowo nie pokazać hasła użytkownikom (w komunikacie o błędzie lub poprzez Pliki PHP przypadkowo podane jako HTML, itp.)
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:
- Użyj memcache na serwerze, z otwartym połączeniem z innego serwera haseł.
- Zapisz do memcache hasło (lub nawet całe hasło.plik PHP zaszyfrowany) oraz klucz deszyfrujący.
- strona internetowa, wywołuje klucz memcache z hasłem pliku hasła i odszyfrować w pamięci wszystkie hasła. Serwer haseł wysyła nowy zaszyfrowany plik hasła co 5 minut.
- 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.
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