Enrico: preg_match liefert kein positives Ergebnis

Guten Abend,

ich versuche, die Seitenaufrufe unserer Homepage vor Manipulationen zu schützen und willkürliche Eingaben in der Adressleiste des Browsers durch Prüfung über reguläre Ausdrücke zu unterbinden.

Hierzu habe ich folgenden Code:

  
$Seiten = array ('/^Template.php?Auswahl=Home$/',  
                 '/^Template.php?Auswahl=Home?Aktion=Lesen&Seite=[19]{1,}$/',  
                 '/^Template.php?Auswahl=Home?Aktion=Eintragen$/',  
                 '/^ ... $/',  
                 ...);  
  
$Query_String = 'Template.php?' . $_SERVER ['QUERY_STRING'];  
  
$Erlaubnis = false;  
$i = 0;  
$j = count ($Seiten);  
  
while ($i < $j)  
{  
   if (preg_match ($Query_String, $Seiten [$i]) === true)  
   {  
      $Erlaubnis = true;  
  
      break;  
   }  
  
   $i++;  
}  
  
if (! $Erlaubnis)  
{  
   echo "Unerlaubter Zugriff!";  
}  

Das Flag $Ergebnis wird aber nie auf true gesetzt.

Das verstehe ich insofern nicht, als dass ich folgende Ausgabe im Browser habe, wenn ich mir die einzelnen Array-Elemente anzeigen lasse:

/^Template.php?Auswahl=Home$/
/^Template.php?Auswahl=Home?Aktion=Lesen&Seite=[19]{1,}$/
/^Template.php?Auswahl=Home?Aktion=Eintragen$/
...

Wenn ich mir die Variable $Query_String ausgeben lasse, dann erhalte ich aber stets Ausgaben, die konform zu den Array-Elementen sind, d.h. ich muss Übereinstimmungen haben.

Ist es in diesem Zusammenhang von Bedeutung, dass die Variable (?) "Seite" des zweiten Array-Elements in roter Schrift angezeigt wird?

Welchen Fehler habe ich gemacht, dass ich hier kein korrektes Ergebnis bekomme, d.h. das Flag $Ergebnis auf true gesetzt wird?

Vielen Dank für eure Hilfe.

Gruß
Enrico

  1. Hi,

    $Seiten = array ('/^Template.php?Auswahl=Home$/',

    Mach Dich schlau über die Sonderbedeutung von . und ? im Regulären Ausdruck.

    Du willst wohl kaum, daß TemplateXphAuswahl=Home gematcht wird ...

    '/^Template.php?Auswahl=Home?Aktion=Lesen&Seite=[19]{1,}$/',

    auch [ und ] haben eine Sonderbedeutung.

    (nebenbei: das 2. Fragezeichen in der Url ist auch verdächtig, sollte wohl eher ein & sein ...)

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
    1. Hallo Andreas,

      Danke für Deine rasche Antwort.

      Ok, eine Maskierung von Sonderzeichen hatte ich übersehen, ebenso den Fehler mit dem zweiten Fragezeichen.

      Meine Zeilen sehen jetzt folgendermassen aus:

        
      '/^Template\.php\?Auswahl=Home$/',  
      '/^Template\.php\?Auswahl=Home&Aktion=Lesen&Seite=\[19\]{1,}$/',  
      '/^Template\.php\?Auswahl=Home&Aktion=Eintragen$/',  
      ...  
      
      

      Habe ich damit alle Sonderzeichen korrekt maskiert?

      Mit nachfolgender Fehlermeldung komme ich aber nicht zurecht:

      Delimiter must not be alphanumeric or backslash

      Nachfolgendes Beispiel verwendet auch Delimiter, zumindest für den Anfang der Zeichenkette als Anfang der Suche:

        
      $string = "Dies ist ein Testausdruck";  
        
      if (preg_match ("/^Dies/", $string, $result))  
      {  
         print_r ($result);  
      }  
      
      

      Was muss ich noch korrigieren?

      Gruß
      Enrico

      1. Hi,

        '/^Template.php?Auswahl=Home&Aktion=Lesen&Seite=[19]{1,}$/',

        Template.php?Auswahl=Home&Aktion=Lesen&Seite=[19]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]

        wäre demnach zulässig, denn das {1,} (das man kürzer als + schreiben könnte), bezieht sich nur auf das Regex-Element direkt davor - und das ist in diesem Fall das (maskierte, also sonderbedeutungsfreie) Zeichen ]

        Habe ich damit alle Sonderzeichen korrekt maskiert?

        Sieht so aus.

        Mit nachfolgender Fehlermeldung komme ich aber nicht zurecht:
        Delimiter must not be alphanumeric or backslash

        Auf welchen Ausdruck beziehen sich diese? Im gezeigten Code sehe ich keine Regexe, die Buchstaben, Ziffern oder Backslash als Delimiter haben.

        Nachfolgendes Beispiel verwendet auch Delimiter, zumindest für den Anfang der Zeichenkette als Anfang der Suche:

        Du verwechselst "Delimiter" und "Anchor". Delimiter bezieht sich auf die Zeichen um den Regex (bei Dir die Slashes /).
        ^ und $ sind dagegen Anchor.

        Was muss ich noch korrigieren?

        Die Regexe mit den fehlerhaften Delimiters.

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
  2. Tach!

    ich versuche, die Seitenaufrufe unserer Homepage vor Manipulationen zu schützen und willkürliche Eingaben in der Adressleiste des Browsers durch Prüfung über reguläre Ausdrücke zu unterbinden.

    Welche Manipulationen befürchtest du und was passiert denn ungewolltes, wenn willkürliche Requests gestellt werden? (Requests beschränken sich nicht auf Adressleisten in Browsern.)

    dedlfix.

    1. Hallo dedlfix,

      ich will verhindern, dass in der Adressleiste angezeigte Parameter, wie "Lösche Eintrag Nr. 2", manipuliert werden können.

      Eine Anmeldung mit Kennung und Passwort wird natürlich auch noch eingebunden, das ist klar.

      Gruß
      Enrico

      1. Tach!

        ich will verhindern, dass in der Adressleiste angezeigte Parameter, wie "Lösche Eintrag Nr. 2", manipuliert werden können.

        Sowas kannst du nicht verhindern. Und aus Sicht des Webserver bekommst du lediglich Requests. Wie diese gestaltet oder verunstaltet sind, kann dir im Prinzip egal sein. Selbst die Reihenfolge ist in den meisten Fällen belanglos. Du kannst sowieso nicht feststellen, ob da jemand in seinem Browser was geändert hat, das zwar einem deiner gültigen Muster entspricht, er aber nicht hätte aufrufen dürfen, oder ob er einem von dir vorgegebenen Link gefolgt ist. (Löschen sollte man sowieso nicht über Links/GET sondern POST machen, weil sonst jeder Linkchecker, Prefetcher oder Suchmaschinen-Crawler ungewollte Löschaktionen vornehmen kann. POST wird üblicherweise nicht von gutwilligen Automaten ausgelöst.)

        Hauptsache du bekommst einerseits alle notwendigen Parameter und die damit verbundene Aktion ist andererseits für den aktuellen Benutzer gestattet. Es reicht völlig, wenn du eine Plausibilitätsprüfung und eine Berechtigungsprüfung einbaust. Diese beiden brauchst du sowieso, anderes ist in der Regel nicht notwendig.

        dedlfix.

        1. Hallo dedlfix,

          danke für die ausführliche Rückmeldung :-)

          Dann lasse ich diese Prüfung weg, wenn es zu viele Unbekannten gibt, die ich ohnehin nicht überwachen kann.

          Gruß
          Enrico