Wie sicher ist PHP?

  • PHP

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von sandiro.

    Wie sicher ist PHP?

    Seid dem ich bei einer Seite ein Bericht gelesen habe, wo Stande, dass PHP gar nicht so Sicher ist in Themen wie Passwortabfrage, würde ich gerne Fragen, wie es überhaubt möglich ist, eine Variable aus meinem PHP Code auszulesen, wie z.B mein Passwort? ?(
    Ich habe damit nicht vor eine Bank zuhacken, oder sowas, mir selbst ist sehr Interessant. :)
    Hallo Geeorg,

    Geeorg schrieb:


    Ich habe damit nicht vor eine Bank zuhacken, oder sowas, mir selbst ist sehr Interessant. :)


    Also erstmal glaubt keiner, dass du eine Bank hacken willst und wenn dann glaubt keiner, dass du es schaffst, da Banken etwas mehr auf Sicherheit achten müssen als private Webseiten ;)

    Nun zum Kern deiner Frage:

    PHP Code kann nicht ausgelesen werden. PHP ist Serverseitig, dass heißt du klickst z.B. auf einen Button in einem Formular und anschließend wird eine Anfrage zum Server geschickt. Dort wird dann PHP ausgeführt und erstellt dann eine fertige HTML/CSS/Javascript Seite die dann zurück an den Benutzer geht. D.h. wenn du deine Passwortabfrage Hardcodest:

    PHP-Quellcode

    1. ​if(?userinput=="meinpasswort123"){...}
    dann sollte es eigentlich unmöglich sein dies Herauszufinden.

    Bei Variablen ist das ein klein wenig anders dazu aber gleich...

    Was der haupt Risikofaktor bei PHP Formularen ist: Javascript.
    Javascript kann sehr böse sein und Hacker nutzen so gut wie immer Javascript für ihre Werke.
    Das Problem ist, wenn du ein Formular wie eine Passwort Anfrage hast, kann das erste mal der Benutzer etwas Freies eingeben.
    Wenn du dies also nicht richtig sicherst und im schlimmsten Fall sogar blanko in SQL speicherst und anschließend ausgibst, kann der Benutzer auch Javascript Code eingeben, was dann beim Client bei dem es angezeigt wird wiederum ausgeführt wird. Dies ist aber nur eine Lücke und es gibt einige Sachen auf die man achten sollte.

    Nun zu den Variablen, wenn der User es geschafft haben sollte einfach so Javascript Code auszuführen wie oben beschrieben, dann kann er theoretisch auch eine Ajax anfrage schicken. Damit kann er PHP Anfragen schicken, ohne dass die Seite neugeladen wird. Dies bedeutet: WENN er den Variablen Namen kennt (was sehr unwahrscheinlich ist, es sei den du hast ein sehr einfachen genommen oder präsentierst es auf der Webseite selbst), kann er sie ausgeben lassen.

    Ich hoffe ich habe jetzt hier keine Fakten vertauscht oder übersehen, aber eigentlich sollte es so stimmen. Bei Fehlern kann man mich gerne Korrigieren :)

    LG Kingdave19
    Danke, für dein Ausführlichen Beitrag. Nur diesem Teil verstehe ich nicht so ganz :

    Nun zu den Variablen, wenn der User es geschafft haben sollte einfach so Javascript Code auszuführen wie oben beschrieben, dann kann er theoretisch auch eine Ajax anfrage schicken. Damit kann er PHP Anfragen schicken, ohne dass die Seite neugeladen wird. Dies bedeutet: WENN er den Variablen Namen kennt (was sehr unwahrscheinlich ist, es sei den du hast ein sehr einfachen genommen oder präsentierst es auf der Webseite selbst), kann er sie ausgeben lassen.

    Ich habe für ein Freund, eine Seite aufgebaut, bzw. umgeschrieben, nach seinen Wünschen. Und dort war auch etwas mit Passwortabfrage, dadurch kenne ich die Variablen.
    Und das heißt, wie ich es jetzt verstanden habe, falls ich denn Namen der Variable kenne, kenne ich dann auch Passwort? Ohne in den die .php zu gehen? 8|
    Was gerne vergessen wird: PHP ist der Abschaum der sich manchmal Programmiersprache nennt.

    PHP-Quellcode

    1. if(?userinput=="meinpasswort123"){...}

    Das kann ganz schnell in die Hose gehen, wenn die Strings als Zahlen interpretiert werden können.
    Ich habs jetzt nicht ganz hinbekommen, aber guckst Du hier:

    PHP-Quellcode

    1. 20 == "20 Ziegen" : True
    2. "20" == "20 Ziegen" : False
    3. "2e+1" == "20" : True
    4. "20.0" == "20" : True
    5. "2e+1" == "20 Ziegen" : False
    6. "20.0" == "20 Ziegen" : False
    Wenn da mal versehentlich irgendwo ein Integer daherkommt, kann das unvorhersehbare Konsequenzen haben. Und mich würde nicht wundern, wenn man irgendwo einstellen kann, dass GET-Parameter automatisch zu Integer konvertiert werden, wenn möglich. Deshalb Strings immer mit === vergleichen.
    Vielleicht stattdessen strcmp verwenden? Kann ja nur 0, < 0 oder > 0 zurückgeben:

    PHP-Quellcode

    1. if(strcmp($_GET["Password"], "20 Ziegen") == 0) { ...

    NOPE!
    Ruft man die Seite über http://example.com/foo.php?Password[]=Wat, dann ist $_GET["Password"] ein Array. Und was macht strcmp, wenn man ein Array bei einem Parameter angibt? Genau! NULL zurückgeben. Und was ist NULL == 0? Genau! True.
    Deshalb IMMER mit === vergleichen.


    Edit:
    Bei dem Zitat ging es um Javascript.
    Du gibst bei dir im Browser das Passwort ein, das heißt, man kann es mit Javascript auslesen. Wenn der Angreifer Javascript in deinen Browser gebracht hat, kann er dieses Passwort auslesen und an seinen eigenen Server schicken. Davon bekommt der User nichts mit.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Geeorg schrieb:

    ​dass PHP gar nicht so Sicher ist in Themen wie Passwortabfrage

    PHP ist nicht sicherer oder unsicherer wie andere Sprachen(macht nur ne menge Rotz). Wie sicher die Seite / das System letztendlich ist liegt in deiner Hand als Administrator. Wenn du z.B. deine Passwörter für den Login im Klartext abspeicherst, oder deine Seite für SQL Injections oder XSS angreifbar machst ist nicht die Schuld von PHP, sondern die des Programmierers. Durch solche Fehler kann es dann eventuell möglich sein, dass der Angreifer an Daten kommt, die er nicht kennen sollte, wie auch das Passwort für den Login.
    Hi,

    kurz für dich das Ganze mal grob umrissen:

    PHP - serverseitige Verarbeitung und Ausführung
    PHP is nur so sicher wie der Programmierer den Code schreibt. Klar kann man ranzigen Code schreiben wenn man einfach zu faul ist, es richtig zu machen - aber dann sollte man das ja auch nicht der verwendeten Sprache in die Schuhe schieben.
    PHP is ja eine Sprache, die am Server ausgeführt wird - darauf hat der User vor dem Bildschirm keinen Einfluss. Am Server wird das Skript dann ausgeführt, ohne dass man nirgendwas davon mitbekommt. Das einzige was der User davon zu sehen bekommt, ist, wenn das PHP-Skript Ausgaben explizit erzeugt, wenn also z.B. mit echo "Hallo Welt"; Text ausgegeben wird. Den siehst du dann im Browser. Gibt noch andere Wege, wie und warum etwas angezeigt wird, z.B. wenn der content-type anders gesetzt ist (text/html oder plain), wird der PHP-Code nicht vom Interpreter verarbeitet sondern einfach als Text ausgegeben - oder wenn dein Skript Fehler und Errors erzeugt, und serverseitig vergessen worden ist, die Fehlerausgabe zu unterdrücken.

    JavaScript - clientseitige Verarbeitung
    Naja und wie oben schon erwähnt anders als bei JavaScript - das wird clientseitig (also an deinem Computer) ausgeführt und kann teils manipuliert werden. Deswegen soll man Benutzereingaben auch nicht mit JavaScript validieren - als rudimentäre Lösung in Ordnung, um den User vorab hinzuweisen, dass (Beispiel) die Eingabe in Textfeld XY keine gültige E-Mail oder Telefonnummer ist, aber das muss dann zwangsläufig am Server sowieso nochmal geprüft werden und natürlich entsprechend maskiert, wenn eine Ausgabe der Benutzereingaben erfolgen soll oder die Daten in eine DB geschrieben werden.

    Was is mit HTML & CSS?
    Zu dem Ganzen Kram gehört ja vor allem HTML und CSS. Aber das sind auch keine Programmiersprachen, HTML ist eine Seitenbeschreibungssprache und CSS ist eine Gestaltungssprache. HTML ist zur strukturierung deines Inhalts, und CSS ist dazu da, um die einzelnen HTML-Teile mit Design aufzuhübschen. Beide Sprachen sind statisch und werden so ausgegeben wie sie geschrieben werden - da wird nix weiter verarbeitet oder sonstwas. Sicherheitstechnisch vollkommen unbedenklick, da kann man keine Fehler machen.

    Benutzereingaben
    Wie ich schon sagte, PHP ist so sicher wie man es halt einsetzt. Viele haben mit Benutzereingaben Schwierigkeiten, wenn der User z.B. ein Formular ausfüllt, auf "Absenden" klickt und die Daten an das PHP-Skript weitergereicht und verarbeitet werden. Wenn man die Eingaben hier ungefiltert einfach ausgibt, kann die Seite ganz leicht ganz böse gehacked oder fremder PHP-Code ausgeführt werden - spätestens dann bist du am Arsch. Für sowas gibt's spezielle Funktionen, die dann die ganzen Zeichen maskieren, escapen oder umwandeln - aber wenn man die nicht nutzt, is man natürlich selbst Schuld, ganz klar.

    Dateiberechtigungen
    Zum Thema Sicherheit sei noch zu erwähnen, dass die Dateiberechtigungen stimmen müssen. Also nicht spaßhalber alles auf 777 setzen, sonst kann die Datei ja von jedem einfach bearbeitet werden. Und Passwörter die dann dort drin stehen, sind für jeden sichtbar.

    macht nur ne menge Rotz

    Ja, teilweise schon. Aber jede Sprache hat so ihre Macken. Ich sag jetzt z.B. mal VB, wo die Syntax einer Bedingung identisch ist wie bei einer Zuweisung (if A = B Then ... und Dim Var As String = "value" ... unmöglich eigentlich^^ Entweder du lebst damit, oder du lässt es. Aber je mehr Sprachen man kann, desto schneller wird klar, dass es nicht DIE Programmier-/Skriptsprache gibt, sondern jede Ihre Vor- und Nachteile hat - und meist ja auch der Einsatzzweck von Sprache zu Sprache ein anderer ist.

    Fazit: Die einzige Sicherheitslücke ist meistens der Administrator - wenn er z.B. schlechten Code schreibt der Ausnahmen nicht abfängt oder Benutzereingaben nicht validiert. Man muss auf mehrere Dinge achten - Fehlerausgabe im Live-Betrieb muss unterdrückt werden, Eingaben validieren und maskieren, sich vor SQL-Injections schützen, den Server sicher konfigurieren, Dateiberechtigungen richtig setzen und vieles vieles mehr. Ja das ist wirklich eine Menge, ich kann nicht alles aufzählen was man fehlkonfigurieren kann. Und es gibt eben äußerst viel, das man falsch machen kann. Deswegen würde ich auch niemandem empfehlen, einen Root-Server zu mieten - besser ist meist eine managed-Lösung. Man muss zwar darauf vertrauen, dass der Anbieter in Sachen Sicherheit bereits alles nötige unternommen hat, aber bei seriösen Anbietern ist dem in der Regel so. Mit einem guten Hoster und sicher konfigurierten Servereinstellungen fehlt dann schonmal ein großer Teil, um den du dich kümmern musst - das is angenehm, denn man kann nicht auf jedem Gebiet Experte sein.

    Link :thumbup:
    Hello World

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Link“ ()

    @sandiro
    Nur wenn register_globals in der php.ini aktiviert ist (sollte es eigentlich nicht sein). Wenn eine Seite dann z.B. über die URL seite.com/index.php?test=abc aufgerufen wird, erhält eine Variable im Skript die "test" heißt den Wert "abc".


    Link :thumbup:
    Hello World