Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > PHP > PHP-Programmierung > Ist Datei sicher?
Antwort
 
Themen-Optionen
Alt 31.03.2008, 21:00   Nach oben    #1
Holgerwa
Neuer Benutzer
 
Registriert seit: 31.03.2008
Beiträge: 3
Standard Ist Datei sicher?

Hallo!
Ich habe bisher nur sehr wenig mit PHP gemacht, daher würde ich gerne sicher sein, ob diese Überlegung richtig ist:
Ich habe ein PHP-Skript, das Login-Daten eines Benutzers prüft. Es werden also Name und Paßwort entgegengenommen und diese mit einer Liste verglichen. Und genau um diese Liste geht es. Der Inhalt sollte unter keinen Umständen einsehbar sein. Daher habe ich diese Daten in eine Datei geschrieben und diese außerhalb des WWW-Bereichs auf dem Linux-Server gespeichert. Soweit ich weiß, kann man von außen nicht auf Dateien zugreifen, die nicht im Public-HTML-Verzeichnis eines Apache-Servers liegen.
Daher sollten die Daten in dieser Datei absolut sicher sein?!?
Oder gibt es Möglichkeiten, so etwas zu umgehen und ich sollte das lieber anders machen? Es dürfte doch nicht möglich sein, die Daten, die ein PHP-Skript intern einliest, von außen einzusehen?

Vielen Dank und viele Grüße,
Holger
Holgerwa ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.03.2008, 21:15   Nach oben    #2
Bleistift
Erfahrener Benutzer
 
Benutzerbild von Bleistift
 
Registriert seit: 31.12.2006
Ort: Zürich
Beiträge: 289
Standard

Speicher lieber nur einen Hash des Passworts ab (One-Way-Verschlüsselung). Siehe dazu z.B. http://php.net/md5
__________________
. <-- This is Punkt. Copy Punkt into your signature to help him on his way to world domination.
Bleistift ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.03.2008, 21:26   Nach oben    #3
Holgerwa
Neuer Benutzer
 
Registriert seit: 31.03.2008
Beiträge: 3
Standard

Hallo,
das mach ich für das Paßwort, aber mir geht es auch darum, daß gar keine Daten aus dieser Datei zugänglich sind, denn die "Login-Namen" sind Email-Adressen.
Deshalb die Idee, alle wichtigen Daten an einem Platz aufzubewahren, an dem sie nicht zugänglich sind.
Geht das?

Viele Grüße,
Holger
Holgerwa ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.03.2008, 21:43   Nach oben    #4
Bleistift
Erfahrener Benutzer
 
Benutzerbild von Bleistift
 
Registriert seit: 31.12.2006
Ort: Zürich
Beiträge: 289
Standard

Am erwähnten Ort sind sie vor Zugriff via Web-Server grundsätzlich sicher. Du könntest noch eine .htaccess-Datei mit dem Inhalt "Deny from all" anlegen, falls mal was falsch konfiguriert ist. So könntest du die Datei übrigens in einem eigentlich zugänglichen Unterordner von public-html platzieren
__________________
. <-- This is Punkt. Copy Punkt into your signature to help him on his way to world domination.
Bleistift ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.03.2008, 21:47   Nach oben    #5
Basti
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 752
Standard

Hallo Holger.

Ja, das sollte so passen, falls dein Provider nicht gepfuscht hat. Mögliche Lücken sehe ich spontan hier:

- Durch falsch gesetzte Rechte können andere Kunden auf dem Server auf die Datei zugreifen;
- Die Datei liegt noch innerhalb eines weiteren doc_root;
- Ein öffentlicher (öffentlich lesbarer) FTP-Zugang;
- Ein PHP-Skript, das die Daten bei Übergabe ungünstiger Parameter ausgibt;

Basti

Geändert von Basti (31.03.2008 um 22:01 Uhr).
Basti ist gerade online  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.03.2008, 21:58   Nach oben    #6
Holgerwa
Neuer Benutzer
 
Registriert seit: 31.03.2008
Beiträge: 3
Standard

Hallo,
das hört sich gut an, dann versuch ich mal mein Glück!

Vielen Dank für Eure Hilfe!
Holger
Holgerwa ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.03.2008, 22:02   Nach oben    #7
Flor1an
Der Student
 
Benutzerbild von Flor1an
 
Registriert seit: 03.01.2007
Ort: München
Beiträge: 59
Standard

Theoretisch kannst du die Email auch mit md5() verschlüsseln, dann hast du immer nur ein paar aus zwei Hashes! Dann kannste beide vergleichen aber die Daten nicht erkennen.
__________________
Wenn ich du wäre, wäre ich lieber ich.

http://www.clubstars.net
http://www.x-tinct.de
Flor1an ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.04.2008, 03:21   Nach oben    #8
Jojo
Irgendwas mit e
 
Benutzerbild von Jojo
 
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 388
Standard

Allerdings - so habe ich es gelernt - ist md5() für die Verschlüsselung von Passwörtern weder gedacht noch geeignet.
Da md5() einen ultimativ repräsentativen Hash errechnet, ist er - zum Beispiel - dafür gedacht, Fehler bei einem Dateitransfer über ein Netzwerk zu entdecken.

Die ultimative Repräsentativität (also, dass er bei allen md5()-Aufrufen gleich ist) macht ihn allerdings leider für Rainbow Tables angreifbar.

Die Funktion crypt() hingegen ist genau für den Einsatz bei Passwortverschlüsselung konzipiert und bringt einen weiteren Faktor zum Hash-Errechnen mit: den Salt.
Damit unterscheidet sich je nach gewähltem Salt das Ergebnis, was zur Folge hat, dass für jedes mögliche Salt eine eigene Rainbow-Table angelegt werden müsste.

Ich persönlich bevorzuge diesen Algorythmus zum Erstellen eines PW Hashes:
PHP-Code:
$cryptpw crypt($pw); 
Wobei PHP einen automatisch generierten Salt nimmt.
Der Witz liegt dabei darin, dass der Salt immer an den Anfang des verschlüsselten Strings gehängt wird und man zum Vergleichen einfach den verschlüsselten String selbst als Salt benutzen kann, denn je nach Verschlüsselung werden nur die ersten x Zeichen als Salt benutzt.

Mein Vergleich sieht daher so aus:
PHP-Code:
if ($cryptpw == crypt($pw$cryptpw)) {
  echo 
"Du bist drin!";

Man möge mich berichtigen, wenn ich Stuss gelabert habe...

Jojo
__________________
In the beginning was the word
and the word was content-type: plain/text

heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int
Jojo ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.04.2008, 09:54   Nach oben    #9
Basti
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 752
Standard

sha1() und md5() kannst du auch salzen, was spricht dagegen? Und, wenn bei jedem Aufruf der Verschlüsselung (durch dein System) nicht der gleiche Hash bei rauskäme, wäre das ganze Verfahren ziemlich unsinnig.

Basti
Basti ist gerade online  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.04.2008, 13:05   Nach oben    #10
mepeisen
Erfahrener Benutzer
 
Registriert seit: 30.03.2006
Ort: Pfinztal
Beiträge: 355
Standard

Hash != Verschlüsselung. bei einem Hash wird nur ein Weg unterstützt, nämlich der vom Ursprungstext zum Hash. Zurück geht es nicht und zwar aus einem sehr einfachen Grund: Alle gängigen Hash-Algorithmen können nie garantieren, dass der Hash eindeutig ist. So kann "a" und "b" zum gleichen Hash führen mit der Auswirkung, dass "b" als Passwort akzeptiert würde, selbst wenn der ursprüngliche User "a" eingetippt hat. Und da könnt ihr noch soviel salzen, wie ihr wollt. Vergesst es. Hashes sind unsicher, gesalzen oder nicht.
__________________
Open Sourcing the Online Gaming Universe
PHP/SQL/Java/C++/Assembler.
Seit Jahren Mitglied und Entwickler in einem der wohl größten Java-Projekte der Welt: http://weblogs.java.net/blog/hansmul...e_desktop.html
mepeisen ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.04.2008, 13:30   Nach oben    #11
Flor1an
Der Student
 
Benutzerbild von Flor1an
 
Registriert seit: 03.01.2007
Ort: München
Beiträge: 59
Standard

Was allerdings auch wieder irgendwo egal ist. Wenn es jemand darauf abgesehen hat einen Hash zu knacken und per Brute Force alle Passwörter ausprobiert ist es egal ob er jetzt das richtige oder eine "alternative" findet. Und bei md5() tretten Kollisionen bei den normalen Passwort konstellationen nicht auf.

Wenn das Passwort jetzt noch mit nem Salt zusammen gehasht wird gibt es dafür auch keine Rainbow Tables. Fürs Web sollte das eigentlich ausreichen!

Vor allem in der Hinsicht dass falls jemand an deine ganzen Passwörter die per crypt verschlüsselt sind heran kommt, dann wird er wohl genauso an den Salt mit dem die Passwörter verschlüsselt sind heran kommen! Und dann ist das ganze noch gefährlicher.
__________________
Wenn ich du wäre, wäre ich lieber ich.

http://www.clubstars.net
http://www.x-tinct.de
Flor1an ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.04.2008, 14:23   Nach oben    #12
Basti
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 752
Standard

Ich schnalls nicht so recht: crypt() benutzt auch ausschließlich Einweg-Verschlüsselungs-Verfahren. Es geht doch hier garnicht um den Vergleich von Verschlüsselung vs. Prüfsummen.

Ein Hash, der mit deinem salt erstellt wurde bringt dir nichts, wenn du das Salz nicht kennst (z.B. wenn jemand lesenden Zugriff auf die Datenbank hat, nicht aber auf das Dateisystem in dem der salt gespeichert ist). Kennst du allerdings das Salz auch, kannst du daheim in aller Ruhe versuchen, einen Treffer zu landen und musst damit nicht das Zielsystem penetrieren.

Basti
Basti ist gerade online  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.04.2008, 14:33   Nach oben    #13
Jojo
Irgendwas mit e
 
Benutzerbild von Jojo
 
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 388
Standard

Zitat:
Zitat von Basti Beitrag anzeigen
Kennst du allerdings das Salz auch, kannst du daheim in aller Ruhe versuchen, einen Treffer zu landen und musst damit nicht das Zielsystem penetrieren.
Aber es ist wesentlich billiger, eine Rainbow Table zu nutzen, als per Bruteforce einen Treffer zu landen.

Natürlich kann man md5 salzen, macht aber kaum einer.
Crypt() hingegen zwingt dem Benutzer dieses Verfahren auf.
Daher ist es vom Prinzip her sicherer.

@mepeisen
Ich habe von crypt() nicht als Mehrwegeverschlüsselung gesprochen.
Latürnich ist es auch eine Ein-Weg-Verschlüsselung.
Wobei natürlich die Frage auftritt, ob eine Verschlüsselung per Definitionem wieder zangsweise entschlüsselt werden können muss.
__________________
In the beginning was the word
and the word was content-type: plain/text

heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int
Jojo ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.04.2008, 17:02   Nach oben    #14
mepeisen
Erfahrener Benutzer
 
Registriert seit: 30.03.2006
Ort: Pfinztal
Beiträge: 355
Standard

Das Problem ist, dass Verschlüsselung ein allgemeiner Begriff ist, also prinzipiell eine "Verfälschung" eines Inhalts. Du kannst auch den Inhalt Zeichen für Zeichen als Hex-String ausgeben. Sowas kann man auch Verschlüsselung nennen, obgleich die sehr plump ist.
Das gefährliche daran ist die Annahme, dass eine Verschlüsselung immer eindeutig sein muss bzw. ist das die weitverbreitete Meinung.

Im Prinzip will man doch, dass man eine eindeutige Passwort-Prüfung hat und dass man - für den Fall eines Einbruchs ins System - die Daten sicher hat. Beides zusammen geht nicht mit einem einfachen Hash. Gut, den Salt müsste man wissen, um schnell ne Rainbow Table an die Hand zu kriegen. Aber muss man den wirklich kennen? Wie wird eine Rainbow-Table errechnet? Nicht durch Trial and Error sondern durch Reverse Engineering des Hash-Algorithmus. Und da lassen sich jederzeit Salts mit einbeziehen. Wenn die normale Rainbow-Table nicht funktioniert, kann man den möglichen Salt errechnen und je mehr Passwörter man probiert, desto eindeutiger wird er bis nur noch einer übrig bleibt. Fakt ist, dass es ziemlich leicht ist, den Salt herauszufinden, selbst wenn man die Datei mit den verschlüsselten Passwörtern nicht zur Hand hat. Das ist dann eine Mischung aus Rainbow-Tables und Bruteforce.

Aber mal zurück zur Ausgangssituation. Man will die Passwörter verschlüsseln (im ursprünglichen Sinn des Wortes), damit für den Fall eines Angriffs das ganze nicht weiter schlimm ist, will aber dadurch auf der Webseite nicht Tür und Tor öffnen. Die Lösung ist simpel: Für jeden User einen eigenen zufälligen Salt nehmen, der sich aus einer in der DB gespeicherten Random-Zahl ergibt. Selbst wenn man dann zufällig für User X ein Passwort findet, das passt und damit auf eine Raindbow-Table und einen Salt kommen könnte, passt das plötzlich bei User Y nimmer. So ein Schutz reicht in meinen Augen.
__________________
Open Sourcing the Online Gaming Universe
PHP/SQL/Java/C++/Assembler.
Seit Jahren Mitglied und Entwickler in einem der wohl größten Java-Projekte der Welt: http://weblogs.java.net/blog/hansmul...e_desktop.html
mepeisen ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.04.2008, 17:13   Nach oben    #15
Jojo
Irgendwas mit e
 
Benutzerbild von Jojo
 
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 388
Standard

Zitat:
Zitat von mepeisen Beitrag anzeigen
Für jeden User einen eigenen zufälligen Salt nehmen, der sich aus einer in der DB gespeicherten Random-Zahl ergibt. Selbst wenn man dann zufällig für User X ein Passwort findet, das passt und damit auf eine Raindbow-Table und einen Salt kommen könnte, passt das plötzlich bei User Y nimmer. So ein Schutz reicht in meinen Augen.
Aber das kann man doch auch - wie in meinem Codeblock - PHP überlassen.
Wenn kein Salt angegeben wird, generiert es doch einen zufälligen
Oder ist das unsicherer als eine manuelle Salterzeugung?
__________________
In the beginning was the word
and the word was content-type: plain/text

heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int
Jojo ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.04.2008, 17:40   Nach oben    #16
Basti
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 752
Standard

Zitat:
Zitat von mepeisen Beitrag anzeigen
Das Problem ist, dass Verschlüsselung ein allgemeiner Begriff ist, also prinzipiell eine "Verfälschung" eines Inhalts. Du kannst auch den Inhalt Zeichen für Zeichen als Hex-String ausgeben. Sowas kann man auch Verschlüsselung nennen, obgleich die sehr plump ist.
Das gefährliche daran ist die Annahme, dass eine Verschlüsselung immer eindeutig sein muss bzw. ist das die weitverbreitete Meinung.
Redet hier doch niemand von.

Zitat:
Im Prinzip will man doch, dass man eine eindeutige Passwort-Prüfung hat und dass man - für den Fall eines Einbruchs ins System - die Daten sicher hat. Beides zusammen geht nicht mit einem einfachen Hash.
Wie denn dann?

Zitat:
Fakt ist, dass es ziemlich leicht ist, den Salt herauszufinden, selbst wenn man die Datei mit den verschlüsselten Passwörtern nicht zur Hand hat.
Whow, du kannst zaubern! Aber erklär dich. Wie bekommt man den Salt raus, wenn man den Hash nicht kennt? Was hat man denn dann für Informationen? Bleibt ja nur der Algorithmus und das Passwort! Ersterer ist eh bekannt, aber wie bekommt man jetzt ausschließlich anhand eines Passwortes heraus, mit welchem Salz es auf irgendeinem System wohl verschlüsselt ist (oder sein wird)?

Zitat:
Aber mal zurück zur Ausgangssituation. Man will die Passwörter verschlüsseln (im ursprünglichen Sinn des Wortes), damit für den Fall eines Angriffs das ganze nicht weiter schlimm ist, will aber dadurch auf der Webseite nicht Tür und Tor öffnen. Die Lösung ist simpel: Für jeden User einen eigenen zufälligen Salt nehmen, der sich aus einer in der DB gespeicherten Random-Zahl ergibt. Selbst wenn man dann zufällig für User X ein Passwort findet, das passt und damit auf eine Raindbow-Table und einen Salt kommen könnte, passt das plötzlich bei User Y nimmer. So ein Schutz reicht in meinen Augen.
Kann ich nachvollziehen, aber die Lücke, die hier noch gestopft wird ist doch minimal in Relation zu den üblichen Angriffsvektoren auf Web-Anwendungen. Der Fall, in dem diese Methode ein Mehr an Schutz bringt ist der, dass der Angreifer a) das Passwort eines Benutzers kennt, b) den Hash in der Datenbank (und damit ggf. c) den Salt), aber weder hashes, noch Salts der anderen Benutzer auslesen, noch deren Passwörter abfangen kann. Ist doch ziemlich unwahrscheinlich, oder?

Nicht, dass ich es deswegen schlecht reden will, aber diese Massnahme für den Fall, dass ein Angreifer bereits zumindest teilweise ins System eingestiegen ist fällt dann eben in die Kategorie Schadensbegrenzung.

Zitat:
Zitat von Jojo Beitrag anzeigen
Aber das kann man doch auch - wie in meinem Codeblock - PHP überlassen.
Wenn kein Salt angegeben wird, generiert es doch einen zufälligen
Jo, sicherer ist es schon, nur kannst du damit halt auch nichts mehr anfangen! crypt() ohne Salt gibt bei jedem Aufruf was anderes aus und selbst wenn es sich die Daten irgendwo merken würde,was wäre bei einem Upgrade oder einer Migration? Dann wäre es einfacher sich die Daten selbst zu merken und das ist das, was Martin hier vorschlägt.

Basti

Geändert von Basti (02.04.2008 um 17:49 Uhr).
Basti ist gerade online  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.04.2008, 17:54   Nach oben    #17
Jojo
Irgendwas mit e
 
Benutzerbild von Jojo
 
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 388
Standard

Zitat:
Zitat von Basti Beitrag anzeigen
Jo, sicherer ist es schon, nur kannst du damit halt auch nichts mehr anfangen! crypt() ohne Salt gibt bei jedem Aufruf was anderes aus und selbst wenn es sich die Daten irgendwo merken würde,was wäre bei einem Upgrade oder einer Migration? Dann wäre es einfacher sich die Daten selbst zu merken und das ist das, was Martin hier vorschlägt.
Siehe:
PHP-Code:
if ($cryptpw == crypt($pw$cryptpw)) {
  echo 
"Du bist drin!";

Funktioniert bei mir prima.
//edit:
Latürnich bringt es nix, wenn man auf dem anderen System nicht auf die Verschlüsselung achtet.
Da gebe ich dir recht.
__________________
In the beginning was the word
and the word was content-type: plain/text

heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int
Jojo ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.04.2008, 18:10   Nach oben    #18
Basti
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 752
Standard

Zitat:
Zitat von Jojo Beitrag anzeigen
Zitat:
Zitat von Basti Beitrag anzeigen
Jo, sicherer ist es schon, nur kannst du damit halt auch nichts mehr anfangen! crypt() ohne Salt gibt bei jedem Aufruf was anderes aus und selbst wenn es sich die Daten irgendwo merken würde,was wäre bei einem Upgrade oder einer Migration? Dann wäre es einfacher sich die Daten selbst zu merken und das ist das, was Martin hier vorschlägt.
Siehe:
PHP-Code:
if ($cryptpw == crypt($pw$cryptpw)) {
  echo 
"Du bist drin!";

Funktioniert bei mir prima. <