Ergebnis 1 bis 20 von 53

Thema: [Vorstellung] tHE fAKE pAGE!

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Zitat Zitat von deadshox Beitrag anzeigen
    Hab das grad Probiert eval() in eine Funktion zu packen hat aber nicht Funktioniert. ;(
    Änder doch einfach deine dooutput() Funktion (ungetestet):
    PHP-Code:
    function dooutput($template){
        eval(
    'echo "'.$template.'";');

    Du könntest das ganze auch direkt in die gettemplate() Funktion packen:
    Änder doch einfach deine dooutput() Funktion (ungetestet):
    PHP-Code:
    function gettemplate($template,$endung="xhtml"){
        
    $template str_replace('"''\\"'implode('',file($template.'.'.$endung)));

            return eval(
    'return "'.$template.'";');

    In beiden Fällen bekommst du allerdings Probleme mit den variablen, weil sie innerhalb der Funktion nicht vorhanden sind (außer den Superglobalen). Da empfielt es sich, einfach alle Variablen für das Template mitzuübergeben (als Array) und dann extract() zu verwenden

    Zitat Zitat von deadshox Beitrag anzeigen
    Was meinst du mit Einstellungswert? Ueber einen Admin Panel?
    Ein Wert in deiner Konfigurationsdatei. Und wenn du ein Admin Panel hast, dann sollte man das da natürlich auch ändern können

  2. #2
    Warum zum Teufel benutzt du überhaupt eval(), um statischen Code auszuführen?


    Was Magic Quotes angeht: Stell' sie ab. Und zwar bei dir lokal (sofern du auf einem eigenen Rechner einen Testserver laufen hast). Man sollte Webanwendungen immer so entwickeln, als wolle man sie hinterher auf einem maximal unsicheren System laufen lassen - weil sie nämlich vielleicht irgendwann auf genau so einem laufen. Wenn du dich dann auf Magic Quotes und Safemode verläßt kann es sein, daß es eine böse Überraschung gibt.

    Abgesehen davon stellen Magic Quotes u.U. unschöne Dinge mit den Daten an, wenn man nicht aufpaßt. Es hat seine Gründe, warum sie bei PHP seit Ewigkeiten standardmäßig deaktiviert sind.

  3. #3
    Zitat Zitat von Manni Beitrag anzeigen
    In beiden Fällen bekommst du allerdings Probleme mit den variablen, weil sie innerhalb der Funktion nicht vorhanden sind (außer den Superglobalen). Da empfielt es sich, einfach alle Variablen für das Template mitzuübergeben (als Array) und dann extract() zu verwenden
    Naja also kann ich es auch gleich sein lassen da es ja noch Komplizierter wird.

    Zitat Zitat von Manni Beitrag anzeigen
    Ein Wert in deiner Konfigurationsdatei. Und wenn du ein Admin Panel hast, dann sollte man das da natürlich auch ändern können
    In meiner Konfigurationsdatei brauch ich auch bloß german, mit sagen wa mal english austauschen aber ich werd das ganze Sprach System noch einmal ueberarbeiten. ;]

    Zitat Zitat von Jesus_666 Beitrag anzeigen
    Warum zum Teufel benutzt du überhaupt eval(), um statischen Code auszuführen?
    Was soll ich sonst nutzen? War halt die einfachste Variante fuer ein Template System.

  4. #4
    Ist auch reichlich unsicher. Mit eval() kann man theoretisch unbegrenzten Schaden anrichten... Diese Funktion gilt im Allgemeinen als extrem unsauber und sollte nach Möglichkeit vermieden werden.


    Ich mache Templates für gewöhnlich so:
    1. Das Template selbst
    Genau wie bei dir einfach eine Datei mit Platzhaltern. Die haben bei mir ein anderes Format (üblicherweise %PLATZHALTER% oder {PLATZHALTER}), ansonsten ist es aber gleich. Das andere Format rate ich dir, damit du hinterher nicht groß escapen mußt. Alternativ kannst du auch einfach den zu ersetzenden Text in '' statt "" verpacken; damit werden Variablennamen nicht geparst (siehe unten).

    2. Der Code
    In PHP lade ich den Inhalt der Templatedatei in eine Variable und füge da per str_replace() meinen Kram ein.

    Ein simples Beispiel:
    template.htm
    Code:
    <h1>%ÜBERSCHRIFT%</h1>
    <p>Heute ist der %DATUM%.</p>
    <p>Noch ein Wert: $replace["me"].</b>
    template.php
    Code:
    <?php
      $template = file_get_contents('template.htm');
      $template = str_replace('%ÜBERSCHRIFT%', 'Beispiel', $template);
      $template = str_replace('%DATUM', date('d.m.Y'), $template);
    
      // Das funktioniert nicht, weil PHP den Variablennamen auflöst:
      $template = str_replace("$replace[\"me\"]", 'Hurra', $template);
    
      // Das funktioniert.
      $template = str_replace('$replace["me"]', 'Hurra', $template);
    
      echo $template;
    ?>

    Ach ja, du kannst den Kram natürlich auch automatisieren:
    Code:
    // Mal an deinem Setup-Template orientiert
    foreach ($lang as $key => $value)
    {
      $template = str_replace('$lang["'.$key.'"]', $lang[$value], $template);
    }

    Geändert von Jesus_666 (18.06.2007 um 21:15 Uhr)

  5. #5
    Zitat Zitat von Jesus_666 Beitrag anzeigen
    Ach ja, du kannst den Kram natürlich auch automatisieren:
    Code:
    // Mal an deinem Setup-Template orientiert
    foreach ($lang as $key => $value)
    {
      $template = str_replace('$lang["'.$key.'"]', $lang[$value], $template);
    }
    Allerdings könnte man dann auch gleich zwei Arrays verwenden und die eingebaute Array-Unterstützung von str_replace() nutzen. Ich kann mir gut vorstellen, dass das weitaus performanter ist:
    PHP-Code:
    $search = array('{{TITLE}}''{{NAME}}');
    $replace = array('Meine Homepage''drunken monkey');

    $template str_replace($search$replace$template); 
    Hab's allerdings jetzt nicht ausprobiert.
    Nachteil wäre vielleicht, dass das eine Array mit Schlüssel->Wert-Paaren übersichtlicher ist. Allerdings könnte man wahrscheinlich auch ohne große Performanceeinbußen das Array wie bei dir anlegen und dann automatisch in zwei Arrays aufteilen lassen.

  6. #6
    Hm irgendwie sagen mir eure Varianten nicht zu. ;(
    Ich sehe meine immer noch fuer am besten an da sie am einfachsten ist.

    @Jesus_666 bitte nen mir doch mal ein paar bsp. was man alles mit eval() boeses machen kann, sonst sehe ich keinen Sin drin es nicht mehr zu verwenden!

    Edit: Hab mal das Tutorial rausgesucht wo durch ich das so mache mit dem Template und da steht auch drin das das vBulletin das genauso macht. ;P

    Tutorial zum Template System.

    Geändert von deadshox (19.06.2007 um 08:50 Uhr)

  7. #7
    Zitat Zitat von deadshox Beitrag anzeigen
    [I]Edit: Hab mal das Tutorial rausgesucht wo durch ich das so mache mit dem Template und da steht auch drin das das vBulletin das genauso macht. ;P
    Es steht nicht "genauso", sondern "nach dem gleichen Prinzip", was ein erheblicher Unterschied macht. In dem Kontext heißt's ziemlich sicher, dass vBulletin auch Templates verwendet, und nicht eval().
    Ich kann mir's zwar im Gegensatz zu anderen hier nicht ansehen, aber mich würde es sehr stark wundern, wenn eine große Forensoftware wie vB auf sowas wie eval() setzen würde. o_O'

  8. #8
    Zitat Zitat von drunken monkey Beitrag anzeigen
    Es steht nicht "genauso", sondern "nach dem gleichen Prinzip", was ein erheblicher Unterschied macht. In dem Kontext heißt's ziemlich sicher, dass vBulletin auch Templates verwendet, und nicht eval().
    Ich kann mir's zwar im Gegensatz zu anderen hier nicht ansehen, aber mich würde es sehr stark wundern, wenn eine große Forensoftware wie vB auf sowas wie eval() setzen würde. o_O'
    vB Benutzt auch eval() aber nach meinem Wissen nicht für die Tamplates, die werden um einiges anders verarbeitet wenn ich mich recht entsinne. Denn ich hab bisher noch nix gesehen im vB wo Template und eval() zusammen genutzt werden.

    zu Templates selber kann cih nur sagen das ich meine Templates wie vB in einer Datenbank speichere und diese dann wenn benütigt auslese.
    Der rest geht dann wie bei Jeez über die Platzhalter die dann per str_replace() ersetzt werden. Find ich persönlich praktisch und auch sehr unkompliziert

  9. #9
    Hm ich habe mir gerade ein paar OpenSource CMSs angeschaut und festgestellt wenn ueberhaupt ein Template System genutzt wird wo PHP und HTML nicht gemischt sind dann geht es irgendwie ueber OOP.
    Also Lern ich jetzt erst mal OOP, wollte das schon lange mal machen und dann kann ich gleich das ganze Projekt so umstellen.

    Danke Trotzdem schon mal fuer eure Hilfe!

    So lange ich OOP Lern steht dieses Projekt hier erst mal still.

  10. #10
    Ich benutze ebenfalls eval() für meine Templates aus Performancegründen. Allerdings wird der komplettte Code von meiner Template-Engine generiert und es kann nirgendwo direkt PHP Code eingeschleust werden (Es sei denn, jemand verändert die gecachten Templatedateien, dann liegt allerdings beim System grundsätzlich was falsch )

    Die möglicherweise sicherere Alternative ist in der Tat, alles über Objekte und Methoden zu regeln, dann kann auch nirgendwo PHP-Code eingeschleust werden - aber soweit ich weiß, ist ist OOP in PHP recht langsam...

    Ein Beispiel für eine Sicherheitslücke in deinen Templates, wäre sowas:
    Code:
    \"; phpinfo(); //
    Allerdings ist das ungetestet und inwiefern man etwas schlimmes damit anstellen kann ist unklar

  11. #11
    Also phpinfo() Funktioniert wenn ich es direkt in eval() eingebe aber wie soll ich von außen da ran kommen? Ich benutze ja keine Variablen in eval().

  12. #12
    Das Problem ist, dass du nur Anführungszeichen escapest. Aus " wird also \". Wenn ich aber \" in einem String habe, wird \\" daraus. Damit ist nicht mehr das Anführungszeichen escaped, sondern der Slash - und der String ist zu Ende. Danach kann man beliebigen PHP Code ausführen.

    Schreibe ich zum Beispiel folgendes in das Template:
    Code:
    \"; phpinfo(); //
    Kommt in PHP folgendes raus:
    PHP-Code:
    $foo "\\"phpinfo(); //" 
    Und was das bewirkt, kann man sich ja denken

  13. #13
    Sooo *trommelwirbel*

    Hab nun meine Template Klasse Fertig.
    Hab mich sehr bemueht es euch recht zu machen und ich hoffe das ist mir auch gelungen und ihr habt nix daran auszusetzen. Fehler und Verbesserungsvorschlaege sind trotzdem erwuenscht. ;]
    Ich weiß es fehlt noch sowas wie "error" Handling, das kann ich ja Spaeter noch mit einbauen.

    Download

    Fuer die Windows Leute
    Fuer die Linux Leute

    Code

    template.php
    PHP-Code:
    <?php
    # Template Klasse! Selbstgemacht. WUHUHU!

    class template
    {
        var 
    $tpl;
        var 
    $tpls;

        function 
    get_tpl($file)
        {
            
    $this->tpl implode("", @file("$file"));
        }
        
        function 
    get_tpls($file)
        {
            
    $this->tpls implode("", @file("$file"));
        }
        
        function 
    replace($search$replace)
        {
            
    $this->tpl str_replace("$search""$replace""$this->tpl");
        }
        
        function 
    show_tpl()
        {
            echo 
    $this->tpl;
        }
    }
    ?>
    index.php
    PHP-Code:
    <?php
    # Template Test

    # Einbinden der Template Klasse
    include('template.php');

    # Erzeugung des Objektes
    $template = new template;

    # Laden der HTML seite
    $template->get_tpl('tpl_index.html');
    # Laden einer Zweiten HTML seite.
    $template->get_tpls('tpl_index2.html');

    # Variablen. o.O
    $title 'Möp';
    $content 'MöpMöp';
    $copyright 'Pöm';
    $subcontent 'PömMöp';

    # Austauschen der Platzhalter mit Variablen
    $template->replace('{title}'"$title");
    $template->replace('{content}'"$template->tpls"); #  Einbinden des Zweiten Templates
    $template->replace('{subcontent}'"$subcontent"); # Variable aus dem Zweiten Template, kann wie alle anderen eingebunden werden
    $template->replace('{copyright}'"$copyright");

    # Ausgabe des Fertigen Templates!
    $template->show_tpl();
    ?>
    Viel Spaß damit.

    Geändert von deadshox (26.06.2007 um 19:48 Uhr)

  14. #14
    Ich halte das

    PHP-Code:
    <?php
    # Variablen. o.O
    $title 'Möp';
    $content 'MöpMöp';
    $copyright 'Pöm';
    $subcontent 'PömMöp';

    # Austauschen der Platzhalter mit Variablen
    $template->replace('{title}'"$title");
    $template->replace('{content}'"$template->tpls"); #  Einbinden des Zweiten Templates
    $template->replace('{subcontent}'"$subcontent"); # Variable aus dem Zweiten Template, kann wie alle anderen eingebunden werden
    $template->replace('{copyright}'"$copyright");
    ?>
    irgendwie für zu umständlich. Ich würde die Phrases mit Ersetzung in einer externen Datei auslagern und die Phrases außerdem in ein Assoziativarray stecken. Dann kannst du das bequem einbinden und in einer Schleife ersetzen lassen. Vermindert den Arbeitsaufwand beim Hinzufügen von neuen Phrases.


    Edit: Japp, ich meinte es so, wie malu es ausgeführt hat. ^^

    Geändert von NPC Fighter (26.06.2007 um 20:23 Uhr)

  15. #15
    Vor allem können Variablen auch verwendet werden, wenn sie nicht von Anführungszeichen umgeben sind.
    PHP-Code:
    $template->replace('{copyright}'"$copyright"); // X
    $template->replace('{copyright}'$copyright); // O 

  16. #16
    Ich habe keinen direkten Exploit zur Hand, rate aber trotzdem von eval() ab. Ein Escapefehler mit str_replace() und der User kriegt uninterpretierten PHP-Code geliefert. Ein Escapefehler mit eval() und der Server führt Code des Angreifers aus. (Ja, man sollte immmer davon ausgehen, daß die Anwendung permanent angegriffen wird; alles andere ist Leichtsinn.)


    Nebenbei generierst du durch falsche Syntax links und rechts kaputte Konstanten. $lang[faker] ist nicht gleichbedeutend mit $lang['faker']!


    BTW, es ist möglich, fast beliebiges JavaScript zu injizieren. Die Eingaben für Faker und Gefakten werden nicht ausreichend gefiltert, um Skripte abzufangen. Momentan kriege ich nichts besseres als window.location = "http://evil.tld/" hin, aber über die Lücke wären potentiell fiese Angriffe möglich und ein besser mit JavaScript bewandter Angreifer könnte u.U. sogar XSS durchführen.


    Zitat Zitat
    Edit: Hab mal das Tutorial rausgesucht wo durch ich das so mache mit dem Template und da steht auch drin das das vBulletin das genauso macht. ;P
    Du weißt, daß das vBulletin eine ganze Weile lang unter Code-Injektionen zu leiden hatte? Derartige Angriffe funktionieren grundsätzlich nicht, wenn du eval() nicht verwendest (oder Dämlichkeiten machst wie hochgeldene Dateien zu includen).

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •