marc: Wie filtere ich diese Variable?

Moin

in einem Script ist es nötig, zu überprüfen, ob eine Variable nur aus Kleinbuchstaben besteht und nicht über 15 Zeichen lang ist. Die Längenüberprüfung funktioniert über strlen() und arbeitet, aber dieser Codeteil will nicht so recht:

if(!eregi("[a-z]",$inhalt)) {
die("Hacking attempt");
}

  • Was ist an der Syntax des eregi-Arguments falsch?
  • Ich glaube, man kann die Längenüberprüfung auch in eregi mit einbauen, nur wie?
  • Gesamthintergrund dieses Codes ist eine Überprüfung, ob eine fürs include benutzte Variable keine externen URLs erhält. Laut PHP.net ist die Option allow_url_fopen nur einzustellen, wenn man direkt Serveradmin ist ("Note:  This setting can only be set in php.ini due to security reasons."). Gehe ich vielleicht das Problem falsch an?
  1. Hallo marc,

    Eigentlich ist es ueberfluessig, hier einen regulaeren Ausdruck zu benutzen, das Script wird nur unnoetig verlangsamt.
    Uberpruefe einfach ob strtolower($inhalt) == $inhalt && strlen($inhalt) == 15. Wenn Du es unbedingt mit einem regulaeren Ausdruck machen musst, nimm lieber preg_match() mit dem Ausdruck [1]{15}$. Vergiss dabei die Delimiter nicht, im Klartext preg_match("/[2]{15}$/", $inhalt).

    Was das eigentliche Problem der Ueberpruefung betrifft, wuesste ich nicht, wie die Beschraenkung auf 15 Kleinbuchstaben da  weiterhilft. Du koenntest aber z.B ueberpruefen, ob deine Variable kein 'http://, ftp://' oder sowas enthaelt. Oder aber du kannst die Includedatei daraufhin ueberpruefen, dass sie in einer Ini-Datei (Stichwort parse_ini_file()) oder was aehnlichem steht, oder aber aus einem bestimmten Verzeichnis geladen wird.

    Gruß,

    Dieter


    1. a-z ↩︎

    2. a-z ↩︎

    1. Hi,

      Hallo marc,

      Eigentlich ist es ueberfluessig, hier einen regulaeren Ausdruck zu benutzen, das Script wird nur unnoetig verlangsamt.
      Uberpruefe einfach ob strtolower($inhalt) == $inhalt && strlen($inhalt) == 15.

      Für $inhalt = "123456789012345" ist strtolower($inhalt) == $inhalt wahr und  strlen($inhalt) == 15 wahr - aber der String enthält nicht einen Buchstaben, obwohl er nur Buchstaben enthalten sollte.

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      Schreinerei Waechter
      Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
      1. Hallo MudGuard,

        Stimmt, das habe ich voellig uebersehen, man koennte also noch ueberpruefen, ob $inhalt + 0 == $inhalt ist passiert, aber irgendwann wird's laecherlich. Dann also doch preg_match().

        Gruß,

        Dieter

        1. Hi,

          Stimmt, das habe ich voellig uebersehen, man koennte also noch ueberpruefen, ob $inhalt + 0 == $inhalt ist passiert, aber irgendwann wird's laecherlich.

          Das hilft auch nicht - es sollen ja nur Buchstaben sein. Der Test mit der Addition von 0 unterscheidet aber nur Zahlen von nicht-Zahlen.
          Aber nicht reine Buchstabenfolgen von Nicht-reinen-Buchstabenfolgen.

          "a23456789012345"

          cu,
          Andreas

          --
          Warum nennt sich Andreas hier MudGuard?
          Schreinerei Waechter
          Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
          1. Hallo MudGuard,

            Wieder Recht behalten... Beim naechsten Mal werde ich es mit Nachdenken probieren, vielleicht ist meine Seele ja so noch zu retten ;-)

            Gruß,

            Dieter

        2. hi,

          Stimmt, das habe ich voellig uebersehen, man koennte also noch ueberpruefen, ob $inhalt + 0 == $inhalt ist passiert, aber irgendwann wird's laecherlich.

          außerdem "hilft" es nicht.

          $string = '1234abcd';
          echo $wert = $string + 0;
          echo "<br>\n";
          echo ($wert == $string);

          ausgabe:

          1234
          1

          (wobei die 1 natürlich einem true entspricht.)

          ist ja auch logisch:

          $wert enthält, auf grund der addition von 0, einen integer - impliziter type cast von '1234abdc' zu 1234, um überhaupt eine addition damit ausführen zu können.

          und beim vergleich $wert == $string wird jetzt $string auch noch implizit in einen integer gecasted - um den vergleich mit dem integer $wert durchführen zu können.

          und nein, umdrehen - ($string == $wert) - ändert daran auch nichts.

          Dann also doch preg_match().

          ja, nehmen wir die ausfahrt, bevor wir uns noch weiter verfahren ;-)

          gruß,
          wahsaga

          --
          /voodoo.css:
          #GeorgeWBush { position:absolute; bottom:-6ft; }
          1. Hallo wahsaga,

            Dann also doch preg_match().

            ja, nehmen wir die ausfahrt, bevor wir uns noch weiter verfahren ;-)

            Ach weisst du, manchmal stellt man sich schon ganz schoen bloed an. Ich habe gestern abend mit Vinzenz zusammen gesessen und ein Script geschrieben. An irgendeinem Punkt haben wir so ziemlich alle daemlichen Fehler gemacht, die man so machen kann. Genau die Sorte von Fehlern, wo wir hier im Forum sofort die Oberlehrerkeule ausgepackt haetten ;-).

            Gruß,

            Dieter