2017-10-23 8 views
-2

Ich habe einen Benutzer der Datenbank wurdeWarum muss mysqli_connect() den Parameter password ohne Verschlüsselung erhalten?

CREATE USER 'my_user'@'localhost' IDENTIFIED BY 'my_pass'; 
GRANT ALL PRIVILEGES ON * . * TO 'my_user'@'localhost'; 
FLUSH PRIVILEGES; 

Der Pass in verschlüsselten Modus auf dem mysql.user Tabelle gespeichert zu verwenden.

Aber wenn ich die mysqli_connect() Methode benutze, finde ich, dass wenn ich den Pass als Parameter gebe, ich den unverschlüsselten, ursprünglichen Wert geben muss, den ich bei der Abfrage benutzt habe, wenn ich den nicht bekommen will berühmt "Verbindung fehlgeschlagen: Zugriff verweigert für Benutzer 'my_user' @ 'localhost' (mit Passwort: YES)".

Aber das ist eigentlich ein anderer String-Wert, der in der Datenbank gespeichert ist (verschlüsselte Version).

Wie ist es? Wäre es nicht sicherer, die verschlüsselte Version als Parameter anzugeben, falls jemand auf die .PHP-Datei zugreift, wo ich die Verbindung herstelle? Warum akzeptiert mysqli_connection das nicht? Gibt es einen Weg, es zu tun?

+1

Wenn Sie sich in stackoverflow oder einer anderen Website anmelden - Sie geben Ihren einfachen Text passowrd - aber sie sind Hash gespeichert. Sie werden gehashed, falls die db, die sie enthält, kompromittiert ist. – nogad

+1

Warum wäre es sicherer? Sie könnten sich immer noch mit dem Passwort einloggen, das in der PHP-Datei – JimL

+1

zu finden ist. Was ist der Sinn des verschlüsselten Passworts, wenn es genauso gut verwendet werden kann? Wenn Ihr imaginäres mysqli_connect ein verschlüsseltes Passwort akzeptiert, dann brauchen Sie nur in eine PHP-Datei zu gucken, das Passwort zu erhalten und eine Verbindung zu einer Datenbank herzustellen.WAS GIBT? –

Antwort

1

Sie als Benutzer nicht wissen, wie das Passwort verschlüsselt ist (es ist überhaupt nicht verschlüsselt, aber Hashed).

Sie übergeben einfach das Passwort, und MySQL kann das gleiche Hashing wie das ursprüngliche Passwort durchführen und es mit dem gespeicherten vergleichen. Wenn Sie die Hash-Version übergeben, ist der ganze Nutzen von Hashing weg: Wenn jemand die Hashes vom Server bekommt, können sie sich einfach dazu anmelden, als wären sie normale Passwörter. Der Hash ist dann das Passwort geworden.

Zusätzlicher Vorteil ist, dass MySQL, weil es das ursprüngliche Passwort hat, es mit einem besseren Algorithmus neu hashen könnte, fügen Sie ein bisschen Salz hinzu und speichern Sie diese verbesserte Version. Wenn es nie das Original bekommt, kann das nicht gemacht werden. PHP's password functions unterstützen dies auch. Sie können überprüfen, mit password_needs_rehash, wenn ein Hash-Passwort noch ordnungsgemäß Hashed ist, und aktualisieren Sie Ihre Datenbank, wenn dies nicht der Fall ist.

Also, aus Sicherheitsgründen müssen Sie andere Maßnahmen ergreifen. Dies sind mindestens:

  • Speichern Sie das Kennwort in einer Include-Datei, die außerhalb des Stammverzeichnisses lebt. Auf diese Weise kann niemand diese Datei direkt öffnen.
  • Sie können verhindern, dass Include-Dateien geöffnet werden, ohne eingeschlossen zu werden (z. B. indem Sie nach einer Definition suchen, die in index.php festgelegt wurde). Das ist nett, aber wenn PHP aufgrund eines Konfigurationsfehlers fehlschlägt, können Leute einfach die Quelle der Datei durchsuchen, also kleben Sie die vorherige Regel.
  • Machen Sie immer einen speziellen Datenbankbenutzer. Verwenden Sie nicht root. Geben Sie diesem Benutzer gerade genug Rechte, um die Datenbank zu betreiben, aber nicht mehr. Keine Rechte zum Beispiel, um Tabellen zu löschen.
  • Geben Sie diesem Benutzer immer ein eindeutiges Passwort. Sie müssen sich dieses Passwort nicht merken. Erzeuge einfach zufälligen Müll mit vielen Charakteren.
  • Ändern Sie das Passwort regelmäßig. Vielleicht könntest du das sogar skripten und das aktualisierte Passwort in der Config speichern.
+0

Ich denke, ich bin Neuling und ich weiß noch nicht, wie ich diese Dinge machen soll. Zum Beispiel das erste (Passwort in einer Datei außerhalb des Stammverzeichnisses speichern und dann einschließen). Aber ich werde es mir merken und etwas darüber erfahren. Danke für solch eine nützliche Information. – FranP

+1

Der erste ist relativ einfach. Wenn Sie beispielsweise zu IhrerDomain/index.php navigieren, verwendet sie '/ var/www/public-html/index.php', was bedeutet, dass'/var/www/public-html' die 'Wurzel' von what ist ist öffentlich sichtbar. 'index.php' kann '/ var/www/config.php'' oder' include' ../ config.php' enthalten. Diese Datei befindet sich eine Ebene höher als der (öffentliche) Stamm, sodass Benutzer nicht dorthin navigieren können. Aber trotzdem, das ist ein bisschen abseits von diesem Q & A. Ich bin mir sicher, dass Sie bessere Quellen finden können, aber ich hoffe, dass ich Sie auf den richtigen Weg gebracht habe. – GolezTrol

+0

Ja natürlich @GolezTrol, es war sehr hepful für mich und bringt mich auf den richtigen Weg! Tausend Dank! – FranP

Verwandte Themen