PHP-Code entfernen mit RegEx

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • PHP-Code entfernen mit RegEx

    Hallo,
    ich möchte php-code aus einem Text entfernen, allerdings nur wenn er nicht
    PHP-Code:
    <? modulkontakt(var1, var2); ?> /* oder */ <? modulnews(); ?>
    lautet.
    Es geht darum in einem CMS-System keine php-skripts zu erlauben.
    Mein Ansatz bis jetzt:

    PHP-Code:
    $str preg_replace('/\<\?.*?\?\>/','PHP-Ne was soll das denn? PHP ist böse!',$str); 
    so gehts nicht:
    PHP-Code:
    $str preg_replace('/<.*(modul.*){0}.*>/','PHP-Ne was soll das  denn? PHP ist böse!',$str); 
    Für Hinweise oder Lösungen wäre ich dankbar!

  • #2
    warum suchst du nicht nach den erlaubten codes, verwendest dabei den modifier e und ersetzt den code dadurch durch das, was der code zurückliefern würde?

    danach kannst du dann einfach alle noch übrigen php-codes löschen
    Ich denke, also bin ich. - Einige sind trotzdem...

    Kommentar


    • #3
      Hallo,
      vielen Dank für deine Antwort. Wenn ich das richtig verstehe bewirkt der Modifier e, dass der Code erst interpretiert wird. Da mein System auf Dateien und Verzeichnissen aufgebaut ist, kann man hier schon ne Menge Blödsinn bewirken.

      Es befindet sich auch nicht nur Code im Text. Ich mach mal ein Beispiel:
      PHP-Code:
      <P><img src="nav/_page/pic-welcome.jpg"></P>
      <H1>Herzlich Willkommen auf unserer Seite</H1>
      <P><?php /*MODUL*/ modulnews(); ?> (So werden die Module aufgefufen) </P>
      was nicht sein darf:
      <? unlink($DOCUMENT_ROOT."/index.php"); ?>
      dies ist bis jetzt möglich

      Kommentar


      • #4
        Original geschrieben von tlausen
        Wenn ich das richtig verstehe bewirkt der Modifier e, dass der Code erst interpretiert wird.
        richtig
        Da mein System auf Dateien und Verzeichnissen aufgebaut ist, kann man hier schon ne Menge Blödsinn bewirken.
        aber du willst doch z. B. modulnews() ausführen lassen, da ist es doch egal, ob das durch einen regulären ausdruck geschiet oder irgendwie anders...

        Es befindet sich auch nicht nur Code im Text. Ich mach mal ein Beispiel:
        PHP-Code:
        <P><img src="nav/_page/pic-welcome.jpg"></P>
        <H1>Herzlich Willkommen auf unserer Seite</H1>
        <P><?php /*MODUL*/ modulnews(); ?> (So werden die Module aufgefufen) </P>
        was nicht sein darf:
        <? unlink($DOCUMENT_ROOT."/index.php"); ?>
        dies ist bis jetzt möglich
        und genau das sollst du ändern. wie habe ich geschrieben:
        Original geschrieben von mrhappiness
        warum suchst du nicht nach den erlaubten codes, verwendest dabei den modifier e und ersetzt den code dadurch durch das, was der code zurückliefern würde?

        danach kannst du dann einfach alle noch übrigen php-codes löschen
        lies es dir nochmal in ruhe durch *g*
        Ich denke, also bin ich. - Einige sind trotzdem...

        Kommentar


        • #5
          @misterhappiness

          Du bringst einen armen kleinen PHP-Coder ganz schön ins grübeln ;-)
          Ich glaube trotzedem nicht, dass das in meinem Fall so funktionieren wird, da ich den Code gar nicht ausführen möchte, sondern in eine Textdatei speichern. Diese Datei sollte dann aber auch schon "sauber" sein.
          Diese wird dann später einfach included.

          Hättest du sonst vieleicht ein klitzkleines kurzes Beispiel, wie Du das meinst?
          Zuletzt geändert von tlausen; 03.12.2004, 11:20.

          Kommentar


          • #6
            wenn du's nicht ausführen willst, dann mach es anders

            - suche nach erlaubten anweisung und speicher sie in einem array (preg_match_all hilft dir dabei)
            - ersetze jede erlaubte anweisung durch einen eindeutigen platzhalter,uniqid sollte dabei hilfreich sein
            - speichere dir (am besten vor dem erstzen *g*), welche erlaubte anweisung durch welchen eindeutigen platzhalter repräsentiert wird
            - ersetze alle noch übrigen anweisungen
            - ersetze die eindeutigen platzhalter durch die entsprechenden anweisungen

            PHP-Code:
            <p>Text</p>
            <?php modulnews(); ?>
            Hallo
            <?php unlink('index.php'); ?>
            Welt
            <?php modulkontakt('Hans''Meier'); ?>
            Feierabend
            wird dann zu
            PHP-Code:
            <p>Text</p>
            {ZFKVKFIFK/&)"D}
            Hallo
            <?php unlink('index.php'); ?>
            Welt
            {IZFASDGWOD=(Z"§HP}
            Feierabend
            dann zu
            Code:
            <p>Text</p>
            {ZFKVKFIFK/&)"D}
            Hallo
            Welt
            {IZFASDGWOD=(Z"§HP}
            Feierabend
            und dann zu
            PHP-Code:
            <p>Text</p>
            <?php modulnews(); ?>
            Hallo
            Welt
            <?php modulkontakt('Hans''Meier'); ?>
            Feierabend
            prinzip verstanden?
            Ich denke, also bin ich. - Einige sind trotzdem...

            Kommentar


            • #7
              Hallo,
              vielen Dank für den Tip, auf die Idee war ich auch schon gekommen, ich dachte mit RegEx geht das vieleicht bischen schneller.

              Trotzdem, ich werd das erstmal so versuchen.

              Kommentar


              • #8
                suchen und ersetzen machst du mit regulären ausdrücken, sonst steht irgendwo ein leerzeichen mehr oder weniger und es haut nicht hin...
                Ich denke, also bin ich. - Einige sind trotzdem...

                Kommentar


                • #9
                  Original geschrieben von mrhappiness
                  - suche nach erlaubten anweisung und speicher sie in einem array (preg_match_all hilft dir dabei)
                  - ersetze jede erlaubte anweisung durch einen eindeutigen platzhalter,uniqid sollte dabei hilfreich sein
                  ließe sich mit einem preg_replace /e erledigen ...
                  PHP-Code:
                  $erlaubt = array();
                  function 
                  erlaubt($string)
                  {
                    global 
                  $erlaubt;
                    
                  $zaehler count($erlaubt);
                    
                  $erlaubt[] = $string;
                    return 
                  '<!--erlaubt('$zaehler')-->';
                  }
                  $text preg_replace('/(erlaubt)/e''erlaubt("$1")'$text); 
                  und entsprechend
                  - ersetze die eindeutigen platzhalter durch die entsprechenden anweisungen
                  PHP-Code:
                  $text preg_replace('/<!--erlaubt\\((\\d+)\\)-->/Ue''$erlaubt[$1]'$text); 
                  mein Sport: mein Frühstück: meine Arbeit:

                  Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

                  Kommentar


                  • #10
                    Hallo,
                    soweit bin ich mitlerweile:

                    PHP-Code:
                    //Module finden
                    $found=preg_match_all('|\<\?php \/\*MODUL\*\/ modul(.*)[\(](.*)[^\(](.*)[\)]; \?\>|U'$str$ergebnis);

                    $erlaubteModule=$ergebnis[0]; 

                    //ersatznamen erstellen und ersetzen
                    $i=0;
                    foreach(
                    $erlaubteModule as $modul)
                    {
                       
                    $modulid[$i]=uniqid("modul");
                       
                    $str=str_replace($modul$modulid[$i], $str);
                       
                    $i++;
                    }

                    //php-code entfernen
                    $str preg_replace('/\<\?.*?\?\>/','***KEIN PHP!***',$str);
                    $i=0;

                    //Module wiederherstellen
                    foreach($erlaubteModule as $modul)
                    {
                       
                    $str=str_replace($modulid[$i], $modul$str);
                       
                    $i++;


                    Mein Problem ist jetzt, dass das der php-code trotz echo(); noch akzeptiert wird, das darf nicht sein. Wie muss ich den regulären Ausdruck noch ändern?

                    Mein BSP-Text:
                    PHP-Code:
                    <H1>Herzlich Willkommen</H1>
                    <P><?php /*MODUL*/ modulnews("hilfe"); echo(); ?></P>
                    <P> </P>

                    Kommentar

                    Lädt...
                    X