Ankündigung

Einklappen
Keine Ankündigung bisher.

Spamschutz - captcha, Zufallszahl verbirgt Fehler

Einklappen

Neue Werbung 2019

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

  • Spamschutz - captcha, Zufallszahl verbirgt Fehler

    Hi, ich habe gerade erst mit PHP angefangen bin also noch ein N00B in dem Bereich, aber ich hoffe ihr helft mir bei meinem Problem.
    Ich bin gerade dabei einen SPAM-Schutz zu programmieren, aber es klappt einfach nicht.
    Ich wollte es erstmal an einem einfachen Projekt versuchen, wo man seine HP eintragen darf
    So ich habe 3 Dateien. 1. formular.php 2. index.php und 3. captcha.php

    formular.php nur das Formular:

    PHP-Code:
    <form action="index.php" method="post">    
            <font color="#FF0000">*</font>
            URL: <input type="text" name="url" value="http://">    

            <font color="#FF0000">*</font>
            URLname: <input type="text" name="hpname" />

            <font color="#FF0000">*</font>
            Name: <input type="text" name="name" />

            Bannerlink: <input type="text" name="banner" />

            <font color="#FF0000">*</font>
            Beschreibung: <input type="text" name="beschreibung" />

            <?php
            
    // Spamschutz
            
    echo("
    <img src=\"captcha.php?wert=\""
    .$wert."\" />

    "
    );
            echo(
    "<input type=\"hidden\" name=\"wert\" value=\"".$wert."\" />");
            echo(
    "<font color=\"#FF0000\">* </font>
            <input type=\"text\" name=\"spam\" maxlength=\"4\" />
    "
    );
            
    ?> 
            Spamschutz: geben Sie bitte die Zahlenfolge ein 

            

    <input type="submit" name="submit">    
            <input type="reset" value="Inhalt löschen" />                    
    </form>
    index.php
    PHP-Code:
    if((empty($_POST['name'])) OR (("http://") == ($_POST['url'])) OR (empty($_POST['url']))
        OR (empty(
    $_POST['hpname'])) OR (empty($_POST['beschreibung'])) OR ($_POST['wert'] != $_POST['spam'])) 
    {
        echo (
    "Bitte füllen Sie alle Pflichtfelder aus!
    "
    );
        include(
    "formular.php");
        }
        
        else {

        
    MySQL Ausgabe ect.

        } 
    Und zum Schluss die captcha.php

    PHP-Code:
    <?php
        
    // Zufallswert erstellen
        
    srand();
        
    $wert rand(10009999);
        
    // Erstellen eine 40 mal 100 px großen Bildes
        
    $bild imagecreate(100,40);
        
    // Farben definieren
        
    $schwarz imagecolorallocate($bild,0,0,0);
        
    $weiss imagecolorallocate($bild,255,255,255);
        
    // Schrift einfügen
        
    imagestring($bild,20,20,10,$wert,$weiss);
        
    // Störlinien setzen
        
    imageline($bild,0,30,100,15,$weiss);
        
    imageline($bild,0,10,100,30,$weiss);
        
    imageline($bild,30,0,85,40,$weiss);
        
    // Type im Header definieren und Bild ausgeben
        
    header("Content-Type: image/jpeg");
        
    imagejpeg($bild);
        
    // Bild löschen
        
    imagedestroy($bild);
    ?>
    So die Problemstellen sind:
    PHP-Code:
    echo("<img src=\"captcha.php?wert=\"".$wert."\" />"); 
    PHP-Code:
    echo("<input type=\"hidden\" name=\"wert\" value=\"".$wert."\" />"); 
    PHP-Code:
    if($_POST['wert'] != $_POST['spam']) 
    PHP-Code:
    include("formular.php"); 

    Zu Anfang scheint alles OK zu sein, aber die Bedingung ist immer Falsch, sodass einem immer wieder das Formular vor die Nase gehalten wird und da sind 2 Notizen mit dem Inhalt „Undefined variable: wert“. Liegt es daran, dass ich die Zufallszahl im captcha.php erstellt habe?
    Anstatt des includen könnte man ja auch eine Weiterleitung zum Formular anordnen oder!?
    Trotzdem komme ich nicht mehr zu eigentlichen Seite (index.php)
    PS: Habe die Suchfunktion genutzt, aber nicht wirklich das passende gefunden.
    Hoffe Ihr könnt mir helfen, schon mal vielen Dank im Voraus für Eure Bemühungen.

    Gruß Steusi

  • #2
    Willkommen im Forum!

    Wenn du die Variable $wert nicht in der Datei oder vorherigen include()s definierst, kannst du sie natürlich auch nicht verwenden.

    Um Informationen über Seiten hinweg zu tragen, kannst du Sessions verwenden.
    http://de.php.net/session
    Dazu einfach am Beginn jeder Datei, die Zugriff auf verteilte Variablen haben sollen, ein session_start() stellen. Vor diesem Befehl darf nichts (kein HTML, kein PHP-echo oder PHP-print) an den Browser gesendet worden sein. Falls doch, wird dir "header already sent" über den Weg laufen. In der Fehlermeldung steht, wo bereits eine Ausgabe erfolgt ist (Datei:Zeile). Danach kannst du lesend und schreibend mittels $_SESSION['schluessel'] = 'wert'; auf die Session zugreifen.
    Mehr dazu im Handbuch, siehe Link.

    Ich weiß jetzt nicht, was bei dir in $wert stehen soll, aber denk dran, dass das, was in einem Captcha-Bild steht, niemals an den Browser geschickt werden darf, also auch nicht "versteckt" im HTML-Quelltext als <img src> wert=Lösung

    Schön übrigens, dass du dein Error-Reporting freiwillig oder unfreiwillig auf E_ALL gesetzt hast, Hinweise/Notices sind sehr wichtig bei der Entwicklung, ignoriere sie nie, es sei denn du weißt was du tust.

    Kommentar


    • #3
      Zunächst mal, so wie ich das sehe rufst du dein Captcha-Img mit dem Parameter auf der dort angezeigt wird. Genau diesen Fragst du dann ab, das ist von daher relativ sinnfrei weil man hier ja einfach im Quelltext nachschaun kann was der korrekte Wert ist.

      Aber gut, davon abgesehen sagt die Fehlermeldung doch schon relativ viel aus: "Undefined variable: wert"

      Der Knackpunkt ist einfach das du zwar in captcha.php die Variable $wert definierst, diese aber in deiner formular.php verwendest. Somit ist $wert nur für captcha.php definiert.

      Eine mögliche Lösung wäre z.B. include

      // edit, zu langsam

      Kommentar


      • #4
        @ Zergling woher weis du das ich error_reporting(E_ALL) eingegeben habe, habe ich doch nirgents geschrieben oder?
        Na egal ich danke Euch jedenfalls werde mir das mit $_SESSION mal angucken!

        @ mAy^daY, nein im Quelltext wird der Inhalt nicht angegeben, da steht ein leerer String

        Kommentar


        • #5
          Ich bin von dieser Zeile ausgegangen:
          PHP-Code:

          // ...
          echo("<input type=\"hidden\" name=\"wert\" value=\"".$wert."\" />"); 
          // ... 
          Das hier $wert nichts enthält, wurde ja bereits gesagt. Google einfach mal nach Captcha Tutorials, da findest du ne Menge hilfreiches, bzw. wenn du dich mit Sessions auseinandergesetzt hast kommst du bestimmt auch ohne Tutorial drauf.

          Kommentar


          • #6
            Zitat von Steusi
            @ Zergling woher weis du das ich error_reporting(E_ALL) eingegeben habe, habe ich doch nirgents geschrieben oder?
            Na egal ich danke Euch jedenfalls werde mir das mit $_SESSION mal angucken!
            Zitat von Steusi
            und da sind 2 Notizen mit dem Inhalt „Undefined variable: wert“
            Notices sind das niedrigste Fehlerlevel, um sie zu sehen ist üblicherweise E_ALL eingestellt.

            Kommentar


            • #7
              @ mAy^daY, da hast du recht die habe ich jetzt gelöscht, auch bei
              PHP-Code:
              <?php echo("<img src=\"captcha.php?wert=\"".$wert."\" />");
              habe ich $wert entfernt, dann es geht auch anders ohne das!

              @ Zergling, sehr clever!

              Ich habe eine Zufallsvariable erstellt und möchte sie in 2 Dateien verwenden.
              Die Variable brauch bei meinem Formular.php gar nicht vorkommen, aber unter index.php!
              Die Variable ist in captcha.php deklariert, soll aber auch unter index.php zu Verfügung stehen. Wie bewältige ich das Problem?
              Includen hat nicht funktioniert, da 2 verschiedene Zufallszahlen erstellt wurden, kann man nicht nur die erstellte Variable includen? Dann könnte man unter index.php so was wie include(„captcha.php?$wert“); schreiben, aber das ist in so einer Ähnlichen Art nicht möglich oder?
              Mit $_SESSION soll es möglich sein, ich verstehe aber nicht wie?
              Kann mir einer kurz erklären, wie ich die Variable abspeichere, versende und weiter verwenden kann. Das wäre nett.

              session_start();
              $_SESSION[‚wert’] = $wert;

              <form action="index.php?wert" method="post">
              </form>

              Transparente URL Parameter waren noch komplizierter.
              Oder wie soll das alles funktionieren ich steig da nicht hinter, das muss ich mal im tutorial lernen!

              Kommentar


              • #8
                Ich hab dir bereits erklärt wie es geht und unter dem Session-Link wird es auch erklärt. Lesen musst du aber schon selbst.

                Kommentar


                • #9
                  Habe bei Captcha.php

                  PHP-Code:
                  session_start();
                  $_SESSION['wert'] = $wert
                  Und beim anderen:
                  PHP-Code:
                  $wert $_SESSION['wert']; 
                  nimmt er aber nicht.

                  Kommentar


                  • #10
                    Bei letzterem fehlt session_start(), was steht denn in $wert selbst?
                    var_dump($wert, $_SESSION);

                    Kommentar


                    • #11
                      Gut also session_start(); fehlt nicht, wenn ich es rein schreibe kommt die Notice, das es schon vorhanden ist und ignoriert wird.

                      var_dump($wert, $_SESSION);
                      ergab folgende Ausgabe:

                      int(281 array(1) { ["wert"]=> int(281 }

                      Halt der String der im Bild zu sehen ist.

                      So ich habe nur noch 2 Datein und ich poste mal das wichtigste:

                      captcha.php
                      PHP-Code:
                      <?php
                          srand
                      ();
                          
                      $wert rand(10009999);
                          
                      // Erstellen eine 40 mal 98 px großen Bildes
                          
                      $bild imagecreate(98,40);
                          
                      // Farben definieren
                          
                      $schwarz imagecolorallocate($bild,0,0,0);
                          
                      $weiss imagecolorallocate($bild,255,255,255);
                          
                      $grun imagecolorallocate($bild,102,255,153);
                          
                      // Schrift einfügen
                          
                      imagestring($bild,20,20,10,$wert,$grun);
                          
                      // Störlinien setzen
                          
                      imageline($bild,0,30,100,15,$weiss);
                          
                      imageline($bild,0,10,100,30,$weiss);
                          
                      imageline($bild,30,0,85,40,$weiss);
                          
                      // Type im Header definieren und Bild ausgeben
                          
                      header("Content-Type: image/jpeg");
                          
                      imagejpeg($bild);
                          
                      // Bild löschen
                          
                      imagedestroy($bild);
                              
                          
                      session_start();
                          
                      $_SESSION['wert'] = $wert;
                      ?>
                      So auf der anderen ist das Formular, wo das Captcha ausgeführt wird.

                      PHP-Code:

                      <?php
                                  
                      // Spamschutz
                                  
                      echo("<img src=\"site/captcha.php?$wert\" id=\"captcha\" />");
                                  echo(
                      "<a href=\"#\" onclick=\"javascript:location.reload.document.getElementById('captcha').src = 'site/captcha.php?wert'\"><img src=\"design/refresh.gif\" alt=\"Bild aktualisieren\"/></a>
                      "
                      );
                                  echo(
                      "<input type=\"text\" name=\"spam\" maxlength=\"4\" size=\"13\"/>"); 
                              
                      ?>
                      Und später wird es dann noch verglichen, ob Eingabe mit dem Capcha übereinstimmt.
                      PHP-Code:
                      if (($_SESSION['wert'] != $spam)) {
                              echo (
                      "Bitte überprüfen Sie Ihre Eingabe beim Spamschutz.
                      "
                      );
                          } 
                      So, offline funktioniert alles wunderbar ohne Fehler. Nun habe ich es hochgeladen und FEHLER. Das Bild (captcha) wird nicht aktuallisiert!
                      Es wird nur das erste zufällig erzeugte Bild angezeigt, welches sich nie mehr ändert, WARUM?

                      Mit aktuallisiert mein ich die komplette Seite (sprich F5 drücken o.ä.) nicht das ihr denkt ich meine den JS_Link! [/php]

                      Kommentar


                      • #12
                        Hallo,

                        ich nehe an, dass dir hier dein Browser einen Streich spielt. Übergebe mal deinem Captcha-Bild-Aufruf einen zufallswert als Parameter in der URL, bzw. sende beim Ausliefern des Captcha-Bildes die no-cache-Header ("Pragma: no-cache", ...).
                        Viele Grüße,
                        Dr.E.

                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                        1. Think about software design [B]before[/B] you start to write code!
                        2. Discuss and review it together with [B]experts[/B]!
                        3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
                        4. Write [I][B]clean and reusable[/B][/I] software only!
                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                        Kommentar


                        • #13
                          no-cache-Header???

                          Du meinst ich soll mal versuchen einen Festen Wert zu senden, statt des zufallswertes per Bild?

                          Also wenn ich das Formular abschicke bekomme ich die Notice:
                          Undefined variable: _SESSION in /usr/export/www/vhosts/funnetwork/hosting/steusi/Mysite/site/Impressum.php on line 196
                          PHP-Code:
                          <?php if (($_SESSION['wert'] != $spam)) {
                          Also habe ich da einen SESSION fehler, aber wo??
                          Browerfehler kann man ausschließen. Wenn ich bei Firefox oder IE, das Formular absende dann erscheint ein neues Bild, bei Opera hingegen nicht.

                          Kommentar

                          Lädt...
                          X