Ist es wirklich nicht möglich das PHP-Script auszulesen, als Client?

... komplette Frage anzeigen

5 Antworten

Die meisten Leute denken, dass das nicht geht, es ist aber sogar sehr einfach:

Im Grunde genommen muss man nur den Server mit Anfragen überfordern, bis das PHP-Modul abstürzt, und dann liefert z. B. der Apache die angefragten PHP-Skripte im Klartext aus.

So einen Absturz kann man über eine Art DoS Angriff herbeiführen, oder indem man einen Fehler in Apache, PHP oder einem Drittmodul ausnutzt. Darüber kann man Speicherlecks verursachen, und wenn dann Apache zwar gerade mal noch so läuft, die Ressourcen für PHP aber nicht mehr reichen, wird Klartext ausgeliefert.

Das klingt jetzt etwas kompliziert, und - zugegeben - ein Zero-Day erleichtert die Sache schon massiv, aber erstens werden nicht alle Server zeitnah gepatcht, und zweitens sind mir momentan zwei Bugs bekannt, die durch Memory-Leaks das Verhalten aus deiner Frage verursachen. (Einmal zlib, einmal GD-Bibliothek)

Aus diesem Grunde bitte 2 Grundregeln beachten:

- Passwörter im PHP-Quelltext als "öffentlich einsehbar" behandeln, und deshalb NUR in gehashter und gesalzener Form abspeichern.

- Ist der vorherige Punkt nicht möglich, z. B. wegen SQL-Passwörtern, dann a) darauf achten, dass der SQL-Server NICHT von außen erreichbar ist und in der DMZ liegt, und b) NICHT das gleiche Passwort verwendet wird, wie für den Webspace-Account bzw. die Admin-Oberfläche

Ich weiß, das liest man nicht oft, aber PHP-Skripte bitte immer als öffentlich einsehbar behandeln. Zum Beispiel ist hin und wieder der Frontend-Quellcode von GF sichtbar, wenn hier zu viele Besucher die Server stürmen.

Das entspricht dann dem oben erwähnten Verhalten eines DoS-Angriffs und dadurch bekommt man sehr schön neben den intern verwendeten Passwort-Hash-Methoden alle IPs, Nutzernamen, Passwörter oder Tabellennamen der SQL-Server in Form von PHP-Quelltext aufgelistet. (Dieses Zeitfenster ist sehr klein, aber ich konnte das jetzt schon mehrfach beobachten ... meistens wird dann binnen Sekunden oder Minuten diese "Steht da jemand auf der Leitung?" Seite vorgeschaltet.)

Also anstatt ...

if ($pass == 'geheim') {
foo();
}

... solltest du vielleicht mindestens ...

$salt = 'foo bar ...';
$pepper = 'baz qux ...';

$hashed = '3421b6f9882 ...';

if (sha1($salt . $pass . $pepper) === $hashed) {
foo();
}

... in deinen Skripten zu stehen haben, bzw. gleich eine vernünftige Passwort-Hashing-Methode (wie password_hash()) verwenden! :)

Viel Spaß noch mit PHP! ;)

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Player4ever
21.02.2016, 00:45

Danke für deine Mühe hat sehr geholfen :)

1

Ajax hat eine Schnittstelle zu PHP, falls du das meinst. Dazu musst du Kenntnisse in Javascript aufbringen.

PHP ist IMMER serverseitig. Ansonsten würden nur Sicherheitslücken entstehen.

Zuallerletzt, Passwörter, bzw. "Logins", diese speicherst du entweder in einer Datenbank (MySqli), wo du die Daten zuvor hashen musst (s. PHP "crypt" Methode), bevor du sie speicherst, oder du hinterlässt es in einem PHP-Script (hashen nicht vergessen). Bei 2tens musst du darauf achten, dass niemand einen direkten Zugriff auf das Script hat. (htaccess davor setzen.)

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Player4ever
20.02.2016, 20:31

Sehr umfassend Danke :)

0

Wenn es zB Variablen in einer PHP Datei sind ist das "okay". Textdatei ist zB aber SHER schlecht!!

Antwort bewerten Vielen Dank für Deine Bewertung

Du greifst ja auf das Script zu wenn du es z.B. im Browser "aufrufst" :)

Der Apache Webserver schickt Dateien mit der Endung php durch den PHP-Parser und dieser interpretiert das Script und leitet alle Ausgaben an den Browser weiter.

Wenn das Passwort in einer Variable hinterlegt ist und diese Variable nicht mit echo oder print ausgegeben wird, kannst du das Passwort nicht sehen.

Schlecht ist es wenn der Parser, aus welchen Gründen auch immer, ausfällt und php Dateien nicht auswerten kann - dann werden php Scripte als Textdatei in dem Browser angezeigt.

Antwort bewerten Vielen Dank für Deine Bewertung

Nein, kann man von "aussen" unter normalen Umständen nicht sehen.

Antwort bewerten Vielen Dank für Deine Bewertung

Was möchtest Du wissen?