Kiedy aplikacja PHP nawiązuje połączenie z bazą danych, oczywiście musi podać login i hasło. Jeśli używam jednego loginu o minimalnym uprawnieniu do mojej aplikacji, PHP musi gdzieś znać ten login i hasło. Jaki jest najlepszy sposób zabezpieczenia tego hasła? Wygląda na to, że samo napisanie go w kodzie PHP nie jest dobrym pomysłem.
404
Odpowiedzi:
Kilka osób błędnie odczytało to jako pytanie o sposób przechowywania haseł w bazie danych. To jest złe. Chodzi o to, jak przechowywać hasło, które pozwala dostać się do bazy danych.
Zwykle rozwiązaniem jest przeniesienie hasła z kodu źródłowego do pliku konfiguracyjnego. Następnie pozostaw administrację i zabezpieczenie tego pliku konfiguracyjnego administratorom systemu. W ten sposób programiści nie muszą wiedzieć nic o hasłach produkcyjnych i nie ma zapisu hasła w kontroli źródła.
źródło
Jeśli hostujesz na serwerze innej osoby i nie masz dostępu poza katalogiem głównym, zawsze możesz umieścić hasło i / lub połączenie z bazą danych w pliku, a następnie zablokować plik za pomocą .htaccess:
źródło
Najbezpieczniejszym sposobem jest całkowite wyeliminowanie informacji zawartych w kodzie PHP.
Jeśli używasz Apache, oznacza to ustawienie szczegółów połączenia w pliku httpd.conf lub pliku wirtualnego hosta. Jeśli to zrobisz, możesz wywołać mysql_connect () bez parametrów, co oznacza, że PHP nigdy nie wyświetli twoich informacji.
W ten sposób określasz te wartości w tych plikach:
Następnie otwórz połączenie MySQL w następujący sposób:
Lub tak:
źródło
ini_get()
.but any user (or a hacker abusing badly written php script) can read the password via ini_get()
Jak sobie z tym poradzić?ini_get()
lubgetenv()
.Przechowuj je w pliku poza katalogiem głównym.
źródło
include('../otherDirectory/configfile.conf')
?W przypadku bardzo bezpiecznych systemów szyfrujemy hasło bazy danych w pliku konfiguracyjnym (który sam jest chroniony przez administratora systemu). Po uruchomieniu aplikacji / serwera aplikacja monituje administratora systemu o klucz deszyfrujący. Hasło bazy danych jest następnie odczytywane z pliku konfiguracyjnego, odszyfrowywane i przechowywane w pamięci do wykorzystania w przyszłości. Nadal nie jest w 100% bezpieczny, ponieważ jest przechowywany w odszyfrowanej pamięci, ale w pewnym momencie musisz nazwać go „wystarczająco bezpiecznym”!
źródło
To rozwiązanie jest ogólne, ponieważ jest przydatne zarówno w aplikacjach o otwartym, jak i zamkniętym źródle.
Zalety:
Metodę tę sugerują Heroku, którzy odnoszą duże sukcesy.
źródło
jeśli możliwe jest utworzenie połączenia z bazą danych w tym samym pliku, w którym przechowywane są poświadczenia. Wstaw poświadczenia w instrukcji connect.
W przeciwnym razie najlepiej jest rozbroić poświadczenia po instrukcji connect, ponieważ poświadczeń, które nie są w pamięci, nie można odczytać z pamięci ;)
źródło
Twoje wybory są w pewnym stopniu ograniczone, ponieważ, jak mówisz, potrzebujesz hasła, aby uzyskać dostęp do bazy danych. Jednym ogólnym podejściem jest przechowywanie nazwy użytkownika i hasła w osobnym pliku konfiguracyjnym zamiast w skrypcie głównym. Następnie pamiętaj, aby przechowywać to poza głównym drzewem internetowym. Tak było, jeśli istnieje problem z konfiguracją sieci, który powoduje, że pliki php są po prostu wyświetlane jako tekst, a nie wykonywane, nie ujawniono hasła.
Poza tym jesteś na właściwej linii z minimalnym dostępem do używanego konta. Dodaj do tego
Piotr
źródło
Jeśli używasz PostgreSQL,
~/.pgpass
automatycznie wyszukuje hasła. Więcej informacji znajduje się w instrukcji obsługi .źródło
Wcześniej przechowywaliśmy DB / pass użytkownika w pliku konfiguracyjnym, ale od tego czasu przeszliśmy w tryb paranoiczny - przyjmując politykę Obrony w głębi .
Jeśli aplikacja zostanie naruszona, użytkownik będzie miał dostęp do odczytu pliku konfiguracyjnego, więc cracker może odczytać te informacje. Pliki konfiguracyjne można również złapać w kontrolę wersji lub kopiować wokół serwerów.
Przełączyliśmy się na przechowywanie zmiennych użytkownika / hasła w zmiennych środowiskowych ustawionych w Apache VirtualHost. Ta konfiguracja jest możliwa do odczytania tylko przez użytkownika root - mam nadzieję, że użytkownik Apache nie działa jako użytkownik root.
Wadą tego jest to, że teraz hasło jest w zmiennej Global PHP.
Aby ograniczyć to ryzyko, stosujemy następujące środki ostrożności:
phpinfo()
jest niepełnosprawny. PHPInfo jest łatwym celem, aby uzyskać przegląd wszystkiego, w tym zmiennych środowiskowych.źródło
Umieść hasło bazy danych w pliku i ustaw je jako tylko do odczytu dla użytkownika obsługującego pliki.
O ile nie masz środków pozwalających tylko procesowi serwera php na dostęp do bazy danych, to prawie wszystko, co możesz zrobić.
źródło
Jeśli mówisz o haśle bazy danych, w przeciwieństwie do hasła pochodzącego z przeglądarki, standardową praktyką jest umieszczanie hasła bazy danych w pliku konfiguracyjnym PHP na serwerze.
Musisz tylko upewnić się, że plik php zawierający hasło ma odpowiednie uprawnienia. Oznacza to, że powinien być czytelny tylko dla serwera WWW i konta użytkownika.
źródło
Zwykłe umieszczenie go w pliku konfiguracyjnym jest takie, jak zwykle. Upewnij się tylko, że:
źródło
Rozwiązaliśmy to w ten sposób:
źródło
Dodatkową sztuczką jest użycie osobnego pliku konfiguracyjnego PHP, który wygląda następująco:
Nie uniemożliwia to prawidłowego ustawienia reguł dostępu. Ale w przypadku włamania się do Twojej witryny „wymaganie” lub „dołączenie” po prostu wyjdzie ze skryptu w pierwszym wierszu, więc jeszcze trudniej jest uzyskać dane.
Niemniej jednak nigdy nie należy zezwalać na pliki konfiguracyjne w katalogu, do którego można uzyskać dostęp za pośrednictwem Internetu. Powinieneś mieć folder „Web” zawierający kod kontrolera, css, zdjęcia i js. To wszystko. Wszystko inne trafia do folderów offline.
źródło
require
/include
ale jak temu zapobiecfopen
?Najlepszym sposobem jest w ogóle nie przechowywać hasła!
Na przykład, jeśli korzystasz z systemu Windows i łączysz się z SQL Server, możesz użyć zintegrowanego uwierzytelnienia, 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 je, używając silnego szyfrowania (np. Za pomocą AES-256, a następnie chroń klucz szyfrowania lub za pomocą szyfrowania asymetrycznego i system operacyjny chroni certyfikat), a następnie przechowuj w plik konfiguracyjny (poza katalogiem WWW) z silnymi listami ACL .
źródło