PHP Datenbankdaten sicher ablegen, aber wie?

Schöty

Cadet 4th Year
Registriert
Aug. 2011
Beiträge
106
Hallo zusammen,
ich befasse mich gerade etwas mit dem Thema PHP/MySQL und wie wahrscheinlich üblich fange ich mit einem Login an. Nun würde ich die Daten über die Datenbank abfragen und dem Nutzer nach erfolgreichem Login auf den internen Bereich weiterleiten.

Ich frage mich aber: Ist es sicher, die Datenbankdaten in einer Datei XYZ.php abzulegen db_host, db_user usw. und diese einfach in die login.php einzubinden?

Kann man den Inhalt der XYZ.php verschlüsseln? Muss ich einen
PHP:
die
einfügen? Gibt es lesenswerte Lektüre zu diesem Thema? Wie geht man vor, um einen Login sicher zu machen?

Ich bin dankbar für jede Antwort!
 
Einfach in eine Verbinden.php alles rein packen und die Rechte passend setzen. Diese verbinden.php in das skript per include_once einbinden und gut ist.
 
Alles was online über einen Server abrufbar ist, kann theoretisch auch geknackt werden, 100% Sicherheits gibts in der IT nie, man kann sich diesen 100% nur mit hohem Aufwand annähern. Wenn dein Webserver korrekt konfiguriert ist, sollte aber gar nichts passieren. Wenn der Webserver selbst gehackt wird, ist eh alles zu spät.

Der PHP-Interpreter parst das File mit den DB-Daten und gibt im Browser nur eine leere Seite aus, vorausgesetzt das File ist richtig programmiert. Wenn du ein die() einfach so in das File schreibst, wird die Ausführung abgebrochen und damit funktioniert bei dir auch nichts mehr. Wenn die(), dann nur unter bestimmten Voraussetzungen, bzw. nach vorheriger Abfrage ob der Aufruf der Datei auch korrekt ist.

Aufgrund deiner Fragestellung empfehle ich dir erstmal dich mit den Grundlagen von PHP / Mysql zu befassen. z.b. ist SelfPHP für den Anfang sicher kein schlechter Anlaufpunkt -> http://www.selfphp.de
 
Dbhost und dbuser sind keine so gewaltigen Geheimnisse, dbpass ist das Schützenswerte. Wenn Du sie in einer .php ablegst ist das aber nicht so dramatisch, da sie vom Server ja erst geparst wird bevor sie ausgegeben wird. Was Du probieren kannst: die Datei Berechtigungen zu verschärfen, chmod 750 oder ähnliches.
 
Zuletzt bearbeitet:
Schöty schrieb:
Kann man den Inhalt der XYZ.php verschlüsseln?
Und dann liegt der Schlüssel zum Entschlüsseln auch auf dem Server, ja? Das ist wie wenn du den Haustürschlüssel unter die Fußmatte legst. Sicherheit kannst du da nicht reinbringen. Die Credentials müssen nun mal in Plain Text vorliegen und selbst wenn du es irgendwie mit Schlüsseln sichern könntest (ich bezweifel aber, dass irgendein RDBMS sowas unterstützt), müssten diese dann wiederum ebenso auf dem Server vorgehalten werden, damit die Verbindung bei jedem Request aufgebaut werden kann.

Ergo: Bringt alles nichts. Security through obscurity ist ebenso keine Lösung.
 
Gibt verschiedene Ansätze für die Frage "Wohin mit meiner Config-Datei". Allen ist eines gemein: Wenn ein Angreifer Dateisystem-Zugriff erlangt (z.B. indem er dein FTP-Passwort klaut, oder wenn du eine Directory Traversal Lücke im Code hast), dann sind alle deine Geheimnisse keine mehr.

Die üblichen Lösungen sind:
- bau (der Ordnung halber) einen Unterordner für Config-Dateien und pack deine Datenbank-Credentials und sonstigen Konfigurationssachen (z.B. Verschlüsselungs-Schlüssel, falls du Inhalte in der DB symmetrisch verschlüsseln willst, oder deine API-Daten für Facebook, Twitter & Co) in eine php-Datei. Verwende dann von deinen eigentlichen Scripten aus ein require_once(). Wenn du in einer Intialisierung noch einen bestimmten Wert, z.B. eine Konstante setzt, dann könntest du deine Config.php sogar noch eine Stufe besser absichern:
if(!isset(DEINE_KONSTANTE)){die("Flossen weg, du Dieb!");}
$config['database']['host'] = localhost;
...

Nachteil/Risiko bei diesem Ansatz: Wenn im Webserver die PHP-Interpretation ausfällt (z.B. grobe Fehlkonfiguration), dann würde der Server deine Config-File als lesbaren Text ausliefern.
Abhilfe schafft da, zumindest für Apache-Server, eine .htaccess im Config-Ordner, die alle Zugriffe ablehnt.

- bau deine Config-Datei wie oben (oder ähnlich wie oben), aber lege sie außerhalb/parallel des Web-Roots ab. Das geht nicht überall, dafür kann selbst eine eklatante Fehlkonfiguration des Webservers hinsichtlich PHP-Dateien nicht dafür sorgen, dass die File im Klartext ausgeliefert wird.
 
@Daaron, wenn die Zugriffe angelehnt werden durch die .htaccess, kommt man doch via 'include' oder 'require' auch nicht mehr an die Daten, oder irre ich mich da gerade?

Ich habe mir den Link mit der sicheren Lösung für ein Login-Script angeschaut. An sich sieht das schon gut aus. Aber war es nicht so, dass diese globalen Variablen "define()" Problematisch sind, oder waren das nur die "$_SERVER" Variablen?

Gruß, Domi
 
Domi83 schrieb:
@Daaron, wenn die Zugriffe angelehnt werden durch die .htaccess, kommt man doch via 'include' oder 'require' auch nicht mehr an die Daten, oder irre ich mich da gerade?
Da irrst du. include() ist eine Filesystem-Operation, so wie fopen(). Du willst die Datei ja nicht ansurfen, also hat der Apache damit gar nichts zu tun.

Was $_SERVER angeht: Nutze sie, aber trau ihnen nicht blind.
define() hat übrigens nicht mit globalen Variablen zu tun, zumindest nicht direkt. define() definiert Konstanten, die durchaus einen globalen Kontext haben, aber sie sind eben keine globalen VARIABLEN. Globale Variablen kann man entweder im Array $_GLOBALS hinterlegen, oder man nutzt das Schlüsselwort global. So wie in "global $objDatabase;"
Mir ist kein sicherheitstechnischer Grund bekannt, globale Variablen nicht zu verwenden. Und auch die in dem Beispiel verwendeten Konstanten machen Sinn. Ich würde es nur einfach nicht so machen.... Ich würde mir ein (evtl. global definiertes) Array $config anlegen, in dem ich assoziativ allerhand Konfigurationsmist lagere: DB-Zugang, FTP-Zugang (z.B. für Save Mode Hacks), SMTP-Zugangsdaten für besseren Mailversand, Socialnetwork API Credentials,... Den ganzen Kram. Wenn du dir für jeden dieser Aspekte einen Konstanten-Namen ausdenken willst wie in dem Beispiel, na dann gute Nacht. HOST könnte z.B. für die Datenbank natürlich der localhost sein, während es für eine SMTP-Konfiguration mail.deinserver.tld wäre. Sag ich hingegen $config['database']['host'], weiß ich ganz genau, was gemeint ist.
 
Alles klärchen, dass mit dem include() macht Sinn und versteht sich dann von selbst. Was die Konstante define() angeht, war das auch nur eine Interessen Frage.

Aber so wie du das mit dem assoziativen Array erwähnt hast, habe ich es auch gemacht...
Code:
$cfg = array();
$cfg['sql']['host'] = "bla";
$cfg['sql']['user'] = "bla"; 
$cfg['sql']['pass'] = "bla";
$cfg['sql']['daba'] = "bla";
die Verbindung wir dann erst innerhalb der Klasse aufgebaut und die Variable $cfg['sql'] übergebe ich dann einfach nur noch und hole mir den Rest heraus, was gebraucht wird. So ähnlich habe ich es zumindest auch in Foren Systemen oder CMS gesehen :D

Aber das mit der .htaccess werde ich wohl die Tage mal auf der Arbeit für einige Domains umsetzen. Ich muss nur einmal schauen, was da rein geschrieben werden soll / muss.

Gruß, Domi
 
Code:
<IfModule mod_authz_core.c>
    # Apache 2.4
    Require all denied
  </IfModule>
  <IfModule !mod_authz_core.c>
    # Apache 2.2
    Order allow,deny
    Deny from all
</IfModule>

Funktioniert in Apache 2.4 und 2.2.
 
Zurück
Oben