Alain: Use of uninitialized value in numeric gt (>) at...

Hallo,
ich habe eine frage bezüglich einer abfrage im $ENV{'CONTENT_LENGTH'}
was ist daran denn falsch
if ($ENV{'CONTENT_LENGTH'} > 100)
der server meldet
Use of uninitialized value in numeric gt (>) at...
welches zeichen wäre dann angebracht um die länge des strings zu messen bzw. zu zählen wie lange
der string ist?
Gruss
vom Alain

  1. Halihallo Alain

    ich habe eine frage bezüglich einer abfrage im $ENV{'CONTENT_LENGTH'}

    ... welches ausschliesslich bei POST gesetzt sein muss, nicht bei
    GET!

    was ist daran denn falsch
    if ($ENV{'CONTENT_LENGTH'} > 100)

    $ENV{'CONTENT_LENGTH'} ||= 0; # entweder gesetzt, oder nimmt Wert 0 an.
    if ($ENV{'CONTENT_LENGTH'} > 100) {...}

    Use of uninitialized value in numeric gt (>) at...

    Tja, $ENV{CONTENT_LENGTH} ist nicht definiert. GET-Formularmethode
    gewählt?

    welches zeichen wäre dann angebracht um die länge des strings zu messen bzw. zu zählen wie lange
    der string ist?

    Irrelevant, dich interessiert ja nicht die Länge von
    $ENV{CONTENT_LENGTH}, sondern dessen Wert, welcher die Länge des
    Inputstreams bei POST definiert.

    Verwende:

    perldoc CGI

    Viele Grüsse

    Philipp

    --
    M$: Patches - don't.
    1. hallo,

      $ENV{'CONTENT_LENGTH'} ||= 0; # entweder gesetzt, oder nimmt Wert 0 an.
      if ($ENV{'CONTENT_LENGTH'} > 100) {...}

      Use of uninitialized value in numeric gt (>) at...

      Tja, $ENV{CONTENT_LENGTH} ist nicht definiert. GET-Formularmethode
      gewählt?

      nö das formular sollte auf jedenfall mit POST gesendet werden.

      welches zeichen wäre dann angebracht um die länge des strings zu messen bzw. zu zählen wie lange
      der string ist?

      Irrelevant, dich interessiert ja nicht die Länge von
      $ENV{CONTENT_LENGTH}, sondern dessen Wert, welcher die Länge des
      Inputstreams bei POST definiert.

      Verwende:

      perldoc CGI

      das habe ich und sogar mit use strict;
      Ich habs jetzt so geschrieben:
      my $len  = $ENV{'CONTENT_LENGTH'} || '101';
      if (($len > 100) or ($ENV{'REQUEST_METHOD'} eq "GET"))
      {
      die("401 error 3\n");
      }

      Gruss vom Alain

      1. Halihallo Alain

        Verwende:
        perldoc CGI

        das habe ich und sogar mit use strict;

        Und was greifst du noch auf $ENV{} zurück? - CGI soll genau dies
        unterbinden.

        Ich habs jetzt so geschrieben:
        my $len  = $ENV{'CONTENT_LENGTH'} || '101';
        if (($len > 100) or ($ENV{'REQUEST_METHOD'} eq "GET"))
        {
        die("401 error 3\n");
        }

        Sinnvoller wäre:

        nichts! - Kein $len, kein gar nix

        if (
              $ENV{'REQUEST_METHOD'} eq 'GET' ||
              !exists($ENV{CONTENT_LENGTH}) ||
              $ENV{CONTENT_LENGTH}>100
           ) {
           die("401 error 3\n");
        }

        Entwder ist FormMethod eq 'GET' => Fehler, oder
        CONTENT_LENGTH nicht definiert  => Fehler, oder
        wenn definiert, wenn > 100      => Fehler! sonst
        OK, weiter im Text... Sehr restriktiv deine Abfrage, kein Input
        grösser als 100 Zeichen erlaubt?

        Viele Grüsse

        Philipp

        --
        M$: Patches - don't.
        1. hallo Philipp,

          Und was greifst du noch auf $ENV{} zurück? - CGI soll genau dies
          unterbinden.

          auf den $ENV{'HTTP_REFERER'}

          Sinnvoller wäre:

          nichts! - Kein $len, kein gar nix

          if (
                $ENV{'REQUEST_METHOD'} eq 'GET' ||
                !exists($ENV{CONTENT_LENGTH}) ||

          !$ENV{CONTENT_LENGTH} geht doch auch ?!

          $ENV{CONTENT_LENGTH}>100
             ) {
             die("401 error 3\n");
          }
          OK, weiter im Text... Sehr restriktiv deine Abfrage, kein Input
          grösser als 100 Zeichen erlaubt?

          nö kleiner als 100 zeichen erlaubt.Es handelt sich um ein login script mit
          begrentzten zeichen für username und passwort.
          Grüsse vom
          Alain

          1. Und was greifst du noch auf $ENV{} zurück? - CGI soll genau dies
            unterbinden.

            auf den $ENV{'HTTP_REFERER'}

            http://www.oreilly.de/catalog/perlmodger/manpage/cgi.htm#FETCHING_ENVIRONMENT_VARIABLES

            !$ENV{CONTENT_LENGTH} geht doch auch ?!

            Das prüft, bzw. ist wahr, wenn der Wert:

            * undefiniert
            * 0
            * ein Leerstring

            ist.

            Ein Vergleich mit einem undefinierten Wert führt aber zu der von dir erhaltenen Fehlermeldung.

            nö kleiner als 100 zeichen erlaubt.Es handelt sich um ein login script mit
            begrentzten zeichen für username und passwort.

            warum prüfst du dann nicht die Länge dieser beiden Variabeln?

            Struppi.

            1. Halihallo Struppi

              !$ENV{CONTENT_LENGTH} geht doch auch ?!
              Ein Vergleich mit einem undefinierten Wert führt aber zu der von dir erhaltenen Fehlermeldung.

              Ach ja, da wäre dann ja noch

              if (!defined($ENV{CONTENT_LENGTH})) {...}

              das entspricht dann eher meinem exists() Vorschlag (nicht ganz, s.
              perldoc -f exists). Danke für die Korrektur, habe ich schlicht
              überlesen :-)

              Viele Grüsse

              Philipp

              --
              M$: Patches - don't.
            2. hi,

              !$ENV{CONTENT_LENGTH} geht doch auch ?!

              Das prüft, bzw. ist wahr, wenn der Wert:

              * undefiniert
              * 0
              * ein Leerstring

              ist.

              Ein Vergleich mit einem undefinierten Wert führt aber zu der von dir erhaltenen Fehlermeldung.

              aha ok.

              warum prüfst du dann nicht die Länge dieser beiden Variabeln?

              weil ich den ganzen string ... messen will und nicht nur user+pass
              und zu Philipp ...danke für die infos.

              Grüsse vom
              Alain

              1. warum prüfst du dann nicht die Länge dieser beiden Variabeln?

                weil ich den ganzen string ... messen will und nicht nur user+pass
                und zu Philipp ...danke für die infos.

                Wie immer ist deine Argumentation den umständlicheren Weg zu wählen frappierend überzeugend.

                Letztlich werden die daten ja so oder so übertragen und da, ich geh mal davon aus das du die evtl. anderen Werte nicht nutzt oder sonstwie abfragst, die anderen Werte auch nie auftauchen ist doch eigentlich dein interesse zu erfahren was der User in name + pass eingeben und wo er ein Fehler gemacht größer.

                zumal, (da bin ich aber nicht sicher) was ist wenn Sonderzeichen eingebenen wurden und diese URL codiert wurden?
                dann könnte (vermute ich jetzt) die Länge des übertragenen Strings größer sein, aber die Anzahl der eingebenen Zeichen ist eigentlich gültig.

                Struppi.

                1. hi,

                  warum prüfst du dann nicht die Länge dieser beiden Variabeln?

                  weil ich den ganzen string ... messen will und nicht nur user+pass
                  Wie immer ist deine Argumentation den umständlicheren Weg zu wählen frappierend überzeugend.

                  Letztlich werden die daten ja so oder so übertragen und da, ich geh mal davon aus das du die evtl. anderen Werte nicht nutzt oder sonstwie abfragst, die anderen Werte auch nie auftauchen ist doch eigentlich dein interesse zu erfahren was der User in name + pass eingeben und wo er ein Fehler gemacht größer.

                  weil ich es so will,dass der benutzer nur mein formular benutzt und nicht irgend ein selbstgebasteltes formular.
                  In meinem formular ist es nur möglich einen string von max. 100 zeichen zu schreiben,mit allen anderen inputs welches vom formular noch mitgeschickt wird.

                  zumal, (da bin ich aber nicht sicher) was ist wenn Sonderzeichen eingebenen wurden und diese URL codiert wurden?
                  dann könnte (vermute ich jetzt) die Länge des übertragenen Strings größer sein, aber die Anzahl der eingebenen Zeichen ist eigentlich gültig.

                  das glaub ich nicht.
                  Grüsse vom Alain

                  1. weil ich es so will,dass der benutzer nur mein formular benutzt und nicht irgend ein selbstgebasteltes formular.
                    In meinem formular ist es nur möglich einen string von max. 100 zeichen zu schreiben,mit allen anderen inputs welches vom formular noch mitgeschickt wird.

                    Naja, das ist ja auch ok, aber du kannst nicht damit verhindern dass es jemand versucht.

                    zumal, (da bin ich aber nicht sicher) was ist wenn Sonderzeichen eingebenen wurden und diese URL codiert wurden?
                    dann könnte (vermute ich jetzt) die Länge des übertragenen Strings größer sein, aber die Anzahl der eingebenen Zeichen ist eigentlich gültig.

                    das glaub ich nicht.

                    Du weisst aber, das alle Sonderzeichen kodiert werden? In der Form %HH? d.h. statt einem Zeichen werden 3 übertragen und kommen so bei deinem Skript an.

                    Struppi.

                    1. hi,

                      Du weisst aber, das alle Sonderzeichen kodiert werden? In der Form %HH? d.h. statt einem Zeichen werden 3 übertragen und kommen so bei deinem Skript an.

                      nö das wusste ich nicht 8-/
                      Also es kann durchaus sein,dass da ein @ als zeichen mitgeschickt wird,da
                      sich auch benutzer mit ihrer email anmelden.
                      Heisst das nun das dafür nun 3 zeichen mehr geschickt werden?
                      Grüsse vom
                      Alain

                      1. hi,

                        Du weisst aber, das alle Sonderzeichen kodiert werden? In der Form %HH? d.h. statt einem Zeichen werden 3 übertragen und kommen so bei deinem Skript an.

                        Du hast recht es war mehr als doppelt soviel als ich das formular nur mit "@" füllte.
                        Danke für den hinweis.
                        Ich habe übrigens im formular den user+pass max. lenght auch definiert.
                        Grüsse
                        vom
                        Alain

                  2. zumal, (da bin ich aber nicht sicher) was ist wenn Sonderzeichen eingebenen wurden und diese URL codiert wurden?
                    dann könnte (vermute ich jetzt) die Länge des übertragenen Strings größer sein, aber die Anzahl der eingebenen Zeichen ist eigentlich gültig.

                    das glaub ich nicht.

                    nur um das klar zu stellen, es ist aber so.
                    zusätzlich wird natürlich noch der Wert des Submitbuttons übertragen und bei mir zumindest sind in CONTENT_LENGTH auch noch die Namen der Felder enthalten. Du kannst natürlich die Eingabe auf A-Za-z beschränken und die Namen dazu addieren, dann ist es ok, macht aber immer noch keinen Sinn. Eher noch die Auswertung von HTTP_REFERER.

                    Struppi.

          2. Halihallo Alain

            if (
                  $ENV{'REQUEST_METHOD'} eq 'GET' ||
                  !exists($ENV{CONTENT_LENGTH}) ||

            !$ENV{CONTENT_LENGTH} geht doch auch ?!

            Ja. Bei komplexen Datenstrukturen gibt es beim Abfragen eines nicht
            existenten Schlüssels eine autovivication, falls der Schlüssel wiederum auf eine Hash- oder Arrayref zeigen würde. Ich dachte, dass
            sich dies mit exists verhindern lässt, was ich gerade versucht habe
            und nicht bestätigen konnte.

            http://tlc.perlarchive.com/articles/perl/ug0002.shtml

            use Data::Dumper;
            $t = {};
            if ($t->{t}->{z}) {}
            print Dumper($t);

            $t ist nun { t=>{} }, nicht {}.

            ich war dem Irrtum unterlegen, dass ein if (exists $t->{t}->{z})
            diese autovivication unterbindet, das war aber ein Irrtum.
            In deinem einfachen Beispiel hätte es jedoch sowieso keinen Einfluss
            gehabt. Ich wollte nur der formhalber die 100% korrekte
            Vorgehensweise verwenden. Und trotz Irrtum ist exists die korrekte
            Vorgehensweise, denn du willst ja wissen, ob der Schlüssel existiert
            und nicht der Wert, der darin steht (wenn ein Wert existiert, ist
            dieser aufgrund des CGI-Standards immer definiert und sei es
            nur '0'). Folglich halte ich 'exists' für korrekter, obgleich nicht
            besser :-)

            Fazit: In deinem Beispiel ist if (!ENV{...}) gleichermassen
            vertretbar, wie if (!exists $ENV{...}). Bei komplexen Datenstrukturen
            muss man sich hier schon ein zwei Gedanken dazu machen, denn die
            autovivication impliziert Speicherverschwendung und bei schlechter
            Programmierung sogar sehr viel...

            Nun ja, teilweise denke ich zu wenig, teilweise auch viel zu weit :-)

            OK, weiter im Text... Sehr restriktiv deine Abfrage, kein Input
            grösser als 100 Zeichen erlaubt?

            nö kleiner als 100 zeichen erlaubt.Es handelt sich um ein login script mit
            begrentzten zeichen für username und passwort.

            Hm. OK :-)

            Da ich

            if ((length $cgi->param('usr_name')) + (length $cgi->param('usr_pwd'))<100) {
            ...
            }

            zwar für die korrektere (und CGI angepasste) Methode halte, ist deine
            Lösung für das Web-Umfeld und der restriktiven Aufgabenstellung
            sicher die performantere.

            Du hast einfach ein zwei Probleme:
             - das Script lässt sich nicht per Shell verwenden, was sonst mit
               CGI funktioniert.
             - das Script kann nie über GET verwendet werden (was ja in der
               Aufgabenstellung so durchaus gewollt sein scheint)

            was ja aber egal ist. Insofern halte ich deine Lösung für sehr gut.

            Viele Grüsse

            Philipp

            --
            M$: Patches - don't.