PHP Variablen



  • hallo

    ist es möglich eine variable die unten im html code verwendet wird, irgendwie oben auch auszugeben? also ungefähr so:

    html_code Guten Tag!
    html_code Sie sind der <?php echo $counter . "." ?> besucher.
    html_code ....
    html_code ....
    html_code ....
    php_code $counter <---- hier steht erst counter...
    

    klar könnte man counter oberhalb der ausgabe benutzen, es geht hier ja auch nur um ein beispiel um darzustellen was ich meine. es ist so das die variable die ich unten stehen habe, dort unten auch verwendet werden muss. allerdings würde ich nun gerne den wert auch oben in der html seite ausgeben...

    kann man das irgendiwe realisieren?



  • Hallo,

    dies ist nicht möglich, PHP verarbeitet Quellcode in der Reihenfolge des Stehens, folglich von oben und unten. Du wirst deinen Quellcode wohl so umformulieren müssen, dass du die Variable bereits im oberen Teil deines Skriptes formulierst und mit ihr arbeitest. Dies sollte jedoch eigentlich keine größere Schwierigkeit darstellen. Was genau möchtest du denn machen?



  • Das geht in keiner Sprache. Jede Variable muss vor ihrer Ausgabe definiert worden sein. In PHP zwar geschieht das zwar direkt beim Aufruf der Variable, in jeder anderen Sprache, z.B. Javascript, C/C++, Java, würde das ein Fehler darstellen und nicht funktionieren.

    PHP würde bei diesem Beispiel für $counter einfach einen leeren String ausgeben im HTML Code. In C/C++, Java, etc. wäre an dieser Stelle ein Programmfehler, weil man vorher etwas wie

    integer counter = 5;

    hätte schreiben müssen, damit das Programm die Variable kennt. PHP macht diesen Schritt immer direkt beim Aufruf der Variable, falls sie vorher nicht bekannt war!



  • ... wobei gesagt sein sollte, das dieses Verhalten - also die Nutzung einer nicht deklarierten Variable - streng genommen auch in PHP ein Fehler ist. Er wird nur nicht so hoch bewertet und mit einer (meiner Meinung nach völlig untergewichteten) Notice geahndet. Zudem öffnet er zahlreichen Angriffsmustern wie z.B. Code Injection und SQL Injection, aber auch Fingerprinting allgemein Tür und Tor!

    Die implizite Deklaration in PHP sollte auf keinen Fall von einem ernsthaften Skript genutzt und wie ein kritischer Fehler vom Programmierer/Skripter behandelt und revidiert werden!



  • in jeder anderen Sprache, z.B. Javascript, C/C++, Java, würde das ein Fehler darstellen und nicht funktionieren.

    hast du grundsätzlich sicher recht. zumal in C++ oder hald eben in jeder programmiersprache der code zeilenweise verarbeitet wird. kann jetzt nur für C++ reden da ich aus dieser welt komme. Dort kann man hald auch schön mit zeigern und funktionen arbeiten und werte dann ausgeben wenn der benutzer es möchte oder eben der programmierer.

    soll jetzt nicht heissen das dass in PHP nicht geht aber das muster ist nunmal schon etwas anderes als wie bei C++ 🙂

    anyway, vielen dank für die info. dann muss ich schauen wie ich es genauer mache.



  • árn[y]ék schrieb:

    Die implizite Deklaration in PHP sollte auf keinen Fall von einem ernsthaften Skript genutzt und wie ein kritischer Fehler vom Programmierer/Skripter behandelt und revidiert werden!

    Seh ich auch so. Das ist einer der Punkte, warum PHP als unsaubere Sprache gilt. Allerdings ist es auch nicht sinnig, wenn man in PHP jede Variable nun vorab auch extra deklariert. Das wäre nicht nur unnötiger Code, sondern würde höchstwahrscheinlich zu einem schlechteren Code führen als ohne Deklaration, da PHP schwach typisiert ist und man eben einer String Variable auch einen integer Wert oder gar Array zuweisen kann. Das würde wohl nur verwirren.

    @kartengamer
    Wie meinst du das mit den Zeigern und Werte dann ausgeben, wenn der Nutzer es möchte? HAst du ein kurzes Beispiel? Kann mir grad nicht richtig was darunter vorstellen. Hat das was mit Polymorphie zu tun?



  • deetee schrieb:

    Allerdings ist es auch nicht sinnig, wenn man in PHP jede Variable nun vorab auch extra deklariert. Das wäre nicht nur unnötiger Code, sondern würde höchstwahrscheinlich zu einem schlechteren Code führen als ohne Deklaration, da PHP schwach typisiert ist und man eben einer String Variable auch einen integer Wert oder gar Array zuweisen kann. Das würde wohl nur verwirren.

    Oh doch, es ist sogar sehr sinnig! 😉

    Jede einzelne Stelle, an der eine nicht deklarierte Variable verwendet wird, ist ein Einfallstor für Angriffe und Fehlfunktionen! Du kannst dich nicht darauf verlassen, dass RegisterGlobals ausgeschaltet ist, und genau so wenig kannst du dich darauf verlassen, dass jemand nicht auf die Idee komme, Parametermanipulation zu betreiben, nur weil du denkst, der Code wäre "schöner", wenn du nicht auf rudimentäre Dinge prüfst!

    Ein PHP Skript, dass auch nur die Verwendung einer einzigen nicht deklarierten Variable zulässt, verlässt sich indirekt auf "Security by Obscurity", nicht jedoch auf effektives Verhindern von Angriffen. Genau so gut könntest du sagen, ein Gästebuch brauche die Benutzereingaben nicht auf Gültigkeit prüfen, da der daraus in PHP resultierende Code "unschöner" oder komplizierter sei! Die Folge? Cross Site Scripting, im besten Falle!

    Eine Variablendeklaration - und wenn sie nur mit null initialisiert - ist unabdingbare Voraussetzung für sicheren Code!

    Was nun das angesprochene "Verwirren" betrifft, kann ich dir absolut nicht beipflichten. Im Gegenteil. Durch eine Deklaration weiß derjenige, der den Code später ließt - und seist du es selbst Monate später! -, wo die Variable herkommt! So kommt die Frage "wo kommt denn diese Variable nun her?" erst gar nicht auf und langwierige Such- und Refactoringvorgänge können umgangen respektive ungemein beschleunigt werden!
    Die schwache Typisierung stellt dabei auch kein Problem dar. Auch hier denke ich, ist vielmehr genaue das Gegenteil von "Verwirrung" der Fall: Wenn ich eine Variable deklariere, kann ich sofort betonen, welchen Datentyp ich für sie angedacht habe:

    $variable1 = 0;   // Variable soll integer sein
    $variable2 = 0.0; // Variable soll float sein
    $variable3 = '';  // Variable soll string sein
    $variable4 = array(); // Variable soll array sein
    // usw. ...
    $variableN = null; // Generische Variable, Objektinstanz o.ä.
    

    Sicherlich kann einer Variablen dann immer noch ein Wert eines anderen Datentyps zugewiesen werden, aber durch die Notation weiß der Leser sofort, welchen Typ wir beim Deklarieren angedacht hatten! Und das Problem der Code Injection haben wir durch die zusätzliche Schreibarbeit auch noch beseitigt!

    Du siehst:
    Die Deklaration einer Variablen vor ihrer Verwendung ist wirklich obligatorisch! Schon alleine auf Grund der Sicherheit. Und bei richtiger Verwendung führt es auf keinem Fall zu "schlechterem" Code, sondern macht ihn im Gegenteil um einiges klarer und verständlicher! Das sind im Groben drei Pro-Punkte (Sicherheit, verständlicherer Code, vereinfachte Fehlersuche) gegen einen einzigen Nachteil (mehr Code). 😉



  • hi [y],

    ich nenn dich einfach mal y, dein Name ist nicht schreibbar!

    Wir sind zwar unterschiedlicher Meinung, allerdings sind wir für das gleiche Ziel: sauberer und sicherer PHP Code.

    Du siehst das sehr eng mit dem Sicherheitsrisiko register_globals ON, denn wenn ein manipulierter URL String schon soweit durch das Skript gekommen ist, dass auch noch der richtige Variablenname gefunden wurde für einen Angriff, dann ist die Programmierung ansich schon nicht sicher genug und zwar in wichtigeren und relevanteren Punkten als die des rg ON Risikos.

    Ein PHP Skript, dass auch nur die Verwendung einer einzigen nicht deklarierten Variable zulässt,

    mich würde es wundern, wenn du mir ein PHP Programm nennen kannst, welches nach deinen strengen Maßstäben programmiert ist. Sind es denn deine eigenen?

    Also PHP ist wie es ist, und man sollte diesen Aspekt zu seinem Vorteil nutzen und weniger streng eben programmieren, wie es andere Sprachen einem vorschreiben. Denn wenn man die relevanten Sicherheitsmechanismen in PHP einsetzt, dann hat man auch dieses Problem im Griff.



  • deetee schrieb:

    ich nenn dich einfach mal y, dein Name ist nicht schreibbar

    Immer doch 😉

    deetee schrieb:

    Du siehst das sehr eng mit dem Sicherheitsrisiko register_globals ON, denn wenn ein manipulierter URL String schon soweit durch das Skript gekommen ist, dass auch noch der richtige Variablenname gefunden wurde für einen Angriff, dann ist die Programmierung ansich schon nicht sicher genug und zwar in wichtigeren und relevanteren Punkten als die des rg ON Risikos.

    Diesen Teil deines Posts verstehe ich nicht ganz. Ist Register Globals aktiviert, so wird die Variable direkt in den globalen Namespace übernommen. Eine URL wie ./index.php?argument=badcode führt somit zur Registration der Variablen $argument mit dem Inhalt 'badcode'. Wenn du die Variable $argument nun in deinem Skript nutzt, ohne sie vorher deklariert zu haben, enthält sie den Standardwert 'badcode', welcher im Skript verwendet wird. Das erzähle ich nun nicht, weil ich glaubte, du würdest das nicht wissen; aber in dem beschriebenen Fall ist die Verwendung der nicht initialisierten Variablen $argument schlichtweg grob fahrlässig. In dem Moment, in dem ein Angreifer dies ausnutzt, ist dein Code konterminiert; das ist Fakt! Und ein Angreifer kann durchaus in den Besitz deines Quellcodes kommen. Einerseits, da viele Projekte in PHP Open Source sind, andererseits, z.B. durch eine im kritischen Fall nur Sekundenbruchteile andauernde Fehlkonfiguration des Webservers.

    Sicher kann man - so wie es z.B. phpBB macht - einfach alle von Register Globals registrierten Variablen wieder unset()en. Das wären dann die von dir angesprochenen "anderen Maßnahmen", an denen es mangelte.

    deetee schrieb:

    mich würde es wundern, wenn du mir ein PHP Programm nennen kannst, welches nach deinen strengen Maßstäben programmiert ist. Sind es denn deine eigenen?

    Meine Eigenen, in der Tat. Ich bin bisher ehrlich gesagt noch nie in die Situation gekommen, eine Variable nicht vor ihrer Verwendung deklarieren zu müssen; und sei es nur, um ihr einen Startwert zuzuweisen, sinngemäß wie folgt:

    $pageCount = ceil($entryCount / $entriesPerPage);
    

    deetee schrieb:

    Also PHP ist wie es ist, und man sollte diesen Aspekt zu seinem Vorteil nutzen und weniger streng eben programmieren, wie es andere Sprachen einem vorschreiben.

    Ich empfinde es nicht als Nachteil, ein wenig auf die subjektive Sauberkeit und somit die Deklaration von Variablen zu achten; siehe meinen obigen Beitrag.
    Und ich empfinde es nicht als Vorteil, Variablen zu verwenden, die offenkundig aus dem "Nichts" erscheinen. Es ist ja nicht so, als würde ich den Code einige Monate später vielleicht einmal nicht mehr so klar vor Augen haben, dass ich sofort weiß, wo welche Variable erstmalig benutzt wird. Und es ist ja auch nicht so, als würde ich ausschließlich selbst meinen Code sehen.

    Deine Einstellung halte ich nicht für sonderlich pragmatisch, aber jedem das Seine 😉

    deetee schrieb:

    Denn wenn man die relevanten Sicherheitsmechanismen in PHP einsetzt, dann hat man auch dieses Problem im Griff.

    Gut, dann bin ich zu paranoid für PHP. Warum wohl? 🙄 😃


Anmelden zum Antworten