Ankündigung

Einklappen
Keine Ankündigung bisher.

Captcha - Session Problem

Einklappen

Neue Werbung 2019

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

  • Captcha - Session Problem

    Hallo wieder mal ^^

    Ich habe ein kleines Problemchen...

    Hab mir gedacht, mach ma selber einen kleinen Captcha und brauch den für mein Newsscript...

    Naja, jedoch funktioniert das nicht so ganz...

    Mein Captcha ist ganz einfach aufgebaut (besteht nur aus Zahlen) und wird in die Variable $int gespeichert. Diese wird dann in $_SESSION["int"] reingeschrieben und sollte so übergeben werden und kontrollieren, ob die alles stimmt....

    Nun wird jedoch meine Session bei jedem neuen aufruf der Seite, sowie blöderweise auch beim Submitten des Formulars überschrieben.

    Meine Frage ist jetzt, wie ich es schaffe, dass die Session erst überschrieben wird, nachdem überprüft wurde, ob alles okay ist.

    Hier mal einwenig Code für euch:

    PHP-Code:
    <?php

    error_reporting
    (E_ALL);    // Alle Errors anzeigen

    include("config.php");    // Definierte Konstanten für MySql Connect Includen
    include("vars.inc.php");

    $int rand(10000,100000);

    $_SESSION["int"] = $int;
    echo 
    $_SESSION["int"]."<br />\n";


    @
    $conn mysql_connect(MYSQL_HOSTMYSQL_USERMYSQL_PASS);    // MySql DB Connecten
    if (!$conn) {
        die(
    "Fehler:"mysql_error());                    // Wenn das nicht funktioniert hat; Script abbrechen und Fehler ausgeben
    }

    $sel_db mysql_select_db(MYSQL_DB);            // DB Auswählen
    if (!$sel_db) echo "Fehler: "mysql_error();    // Hats Gefunzt?

    $table "news";        // Tablename der DB hier angeben

    if(!mysql_query("SELECT * FROM $table ")) {        // Wenn $table noch nicht existiert, erstelle ihn:
        
    $sql "
            CREATE TABLE 
    $table
                (
                id        INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
                title    VARCHAR(60) NULL,
                date    DATETIME NOT NULL,
                msg        TEXT NULL
                )
        "
    ;
        
        
    mysql_query($sql) or die(mysql_error());    // Mach das oder stirb...
        
    echo $txt_edit."<pre>"$sql ."</pre>";    // Das wurde geändert.. oda eingefügt
    }
    else {
        
        if(isset(
    $_POST['submit'])) {    // Wenn das Formular abgeschickt wurde mache folgendes:
            
    $title        htmlspecialchars($_POST['title']);    // Post Variabeln umschreiben
            
    $msg        htmlspecialchars($_POST['msg']);
            
    $spamzahl    $_POST['spamzahl'];
            
            if(
    $title == "" ||  $msg == "") {            // Wenn ein Feld im Formular nicht ausgefühlt wurde (also title oder msg is leer)
                
    $errors[] = $txt_err."<br />\n";
            }
            
            if (
    $_SESSION["int"] != $spamzahl) {    // Geht nicht, weil die Zahl nie aktuell ist...
                
    $errors[] = $txt_err2;
            }
            
            if (empty(
    $errors)) {
                
    $sql "
                    INSERT INTO 
    $table
                        (title, date, msg)
                    VALUES
                        ('
    $title', now(), '$msg')
                "
    ;
            
                
    mysql_query($sql) or die($txt_fehler."<br />".mysql_error());    // Mach oder gib Fehler
                //echo $txt_news_eingef."<pre>". $sql ."</pre>;
                
    echo $txt_news_eingef."<br /><br />";
                include(
    "form.php");
                
                
    //unset($_SESSION["int"]);
            
    }
            else {
                
    // Errors Zeigen...
                
                
    foreach ($errors as $key) {
                    echo 
    $key;
                }
                
                echo 
    "<br />\n<br />\n\n";
                
                include(
    "form.php");
            }
            
            
    //unset($_SESSION["int"]);
        
        
    }
        else {    
    // Wenn das Formular nicht abgesendet wurde, zeigs an!
            
            //$_SESSION["int"] = $int;
            
            
    include("form.php");
        }
        
        
        
    // --------- News anzeigen: ------------------
        
        
    if (mysql_query("SELECT * FROM $table ")) {    // Überprüfen, ob etwas in den News steht.
            
    $sql "
                SELECT * FROM 
    $table
                ORDER BY date DESC
            "
    ;    // WHERE id='$id'
            
            
    $result mysql_query($sql);
            
            echo 
    $txt_news_anz// Text News anzeigen
            //while ($row = mysql_fetch_array($result)) {
            
    for ($id 0$id mysql_num_rows($result); $id++){
                while (
    $row mysql_fetch_array($result)) {
                    
    //$id = 0;
                    
    echo "
                        <div class='news_date'>
                            "
    .@$row[date]."
                        </div>
                        <div class='news_title'>
                            "
    .@$row[title]."<br />
                        </div>
                        <div class='news_anz'>
                            "
    .@$row[msg]."<br /><br />
                        </div>
                    "
    ;
                    
    //$id++    
                
    }
            }
            
            
    // Code zum anzeigen der News..
            
        
    }
        
    }        
    // Ende von Else (News einfügen)
    ?>
    Wenn ich sage er soll $_SESSION["int"] = $int; nur machen, wenn das Formular nicht übergeben wurde (Bei else, habs in einen Kommentar geschrieben), dann geht das zwar beim ersten Versuch (beim ersten ausfüllen des Formulars), jedoch wenn man einen Fehler macht und es nochmals ausfüllen muss, stimmt die Session wieder nicht.

    Das ganze könnt ihr hier ausprobieren, damit ihr mein Problem besser versteht...

    Danke für die Hilfe...
    Gruss Toby
    codestyle.ch
    ----------------------------


  • #2
    Wie die Session wird überschrieben? Hast du vielleicht einfach session_start() vergessen?

    Kommentar


    • #3
      ich hab jez nix gefunden aber es könnte sein das du auf die datei $_SESSION['$int'] zugreifen wolltest und dan nur ein = gemacht hast
      zum abfragen brauchste == also sonst wirds überschrieben

      mfg daschifahrer

      Kommentar


      • #4
        Nee, ich denke nich, dass es das ist...
        Es ist so:

        Bei jedem Aufruf der Seite wird die Session "int" definiert und überschreibt somit das, was vorher in dieser Session stand. Jedoch soll es nur überschreiben, wenn ich eine neue Zufallszahl brauche und nicht eine überprüfen muss, denn sobald ich überprüfe (also auf Submit klicke) lädt ja die Seite neu und die Session ist wieder eine andere, was heisst, dass die Zahl nie übereinstimmen wird...

        Wie mach ich jetzt dass, das das irgendwie stimmt??..

        Danke MFG Toby
        codestyle.ch
        ----------------------------

        Kommentar


        • #5
          Zitat von Toby Beitrag anzeigen
          denn sobald ich überprüfe (also auf Submit klicke) lädt ja die Seite neu und die Session ist wieder eine andere, was heisst, dass die Zahl nie übereinstimmen wird...
          Nein, die Session sollte schondie selbe sein, sonst macht das überhaupt keinen Sinn.
          $int = rand(10000,100000);

          $_SESSION["int"] = $int;
          echo $_SESSION["int"]."<br />\n";
          Das passiert jedes mal am Anf
          ang des Skripts, unkonditionell. Natürlich wird dann der Wert von $_SESSION['int'] jedes Mal mit einem neuen Wert überschrieben.
          PHP-Code:
          if (!isset($_SESSION['int']))
          {
            
          $_SESSION['int'] = rand(10000,100000);

          Und wenn Du den Wert nicht mehr brauchst oder beim nächsten http request einen neuen Wert haben willst, löscht Du einfach das Element
          PHP-Code:
          unset($_SESSION['int']); 

          Kommentar


          • #6
            Danke!! Das könnte funktionieren!
            Genau diese Überlegung habe ich nicht gemacht...
            Sowas brauchte ich ^^

            Ich probiers dann mal im Verlauf des Tages.

            Danke
            Gruss Toby
            codestyle.ch
            ----------------------------

            Kommentar


            • #7
              So, hab das Problem jetzt folgendermassen gelöst, falls es jemanden interessiert:

              Das Formular:
              PHP-Code:
              <?php

              // Generiere Captcha

              if (!isset($_SESSION["int"])) {
                  
              $int rand(10000,100000);
                  
                  
              $_SESSION["int"] = $int;
              }
              else {
                  
              $int $_SESSION["int"];
              }

              // Und jetzt noch das Formular, dass ich euch aber nicht zeigen muss (unnötig viel Code ^^)

              ?>
              Und die Verarbeitung des Formulars:

              PHP-Code:
              if(isset($_POST['submit'])) {    // Wenn das Formular abgeschickt wurde mache folgendes:
                      
              $title        htmlspecialchars($_POST['title']);    // Post Variabeln umschreiben
                      
              $msg        htmlspecialchars($_POST['msg']);
                      
              $spamzahl    $_POST['spamzahl'];
                      
                      if(
              $title == "" ||  $msg == "") {            // Wenn ein Feld im Formular nicht ausgefühlt wurde (also title oder msg is leer)
                          
              $errors[] = "<span class='err'>".$txt_err."</span><br />\n";
                      }
                      
                      if (!isset(
              $_SESSION["int"])) {
                          
              $errors[] = "<span class='err'>".$txt_err3."</span>";
                      }
                      elseif (
              $_SESSION["int"] != $spamzahl) {    // Geht nicht, weil die Zahl nie aktuell ist...
                          
              $errors[] = "<span class='err'>".$txt_err2."</span>";
                      }
                      
                      if (empty(
              $errors)) {
                          
              $sql "
                              INSERT INTO 
              $table
                                  (title, date, msg)
                              VALUES
                                  ('
              $title', now(), '$msg')
                          "
              ;
                      
                          
              mysql_query($sql) or die($txt_fehler."<br />".mysql_error());    // Mach oder gib Fehler
                          //echo $txt_news_eingef."<pre>". $sql ."</pre>;
                          
              echo $txt_news_eingef."<br /><br />";
                          include(
              "form.php");
                          
                          unset(
              $_SESSION["int"]);
                      }
                      else {
                          
              // Errors Zeigen...
                          
                          
              foreach ($errors as $key) {
                              echo 
              $key;
                          }
                          
                          echo 
              "<br />\n<br />\n\n";
                          
                          unset(
              $_SESSION["int"]);
                              
                          include(
              "form.php");
                      }
                  
                  }
                  else {    
              // Wenn das Formular nicht abgesendet wurde, zeigs an!
                      
                      //$_SESSION["int"] = $int;
                      
                      
              unset($_SESSION["int"]);
                      
                      include(
              "form.php");
                  } 
              Vielleicht hilft das auch sonst mal wem, der ein Captcha machen möchte...
              Möglicherweise werde ich es einmal noch mit Buchstaben erweitern.. wer weiss ^^

              Wer Verbesserungsvorschläge für das Script hat kann mir diese auch gerne hier rein schreiben, Danke!!

              Ansonsten ist das ganze hier zu betrachten und da zu downloaden ^^

              Danke für eure Hilfe
              Gruss Toby

              PSEDIT: Sry, für den Doppelpost ^^'
              codestyle.ch
              ----------------------------

              Kommentar


              • #8
                Ist ja schön und gut, dass du dir die Mühe machst - dabei lernt man ja auch einiges. Aber praktisch einsetzbar ist dein "Captcha" nicht. Warum? Weil es kein Captcha ist.

                Captcha heißt: Completely Automated Public Turing test to tell Computers and Humans Apart
                Beachte den Teil "to tell Computers and Humans Apart". Das macht dein "Captcha" nicht. Die "Spamzahl" ist für Computer genauso lesbar wie für Menschen. Würde es jemand drauf anlegen, dann hätte er in kürzester Zeit ein Script um dein "Captcha" zu umgehen: Seite aufrufe, Zahl die im Span-element mit der id "spamzahl" steht auslesen und dann den Post-Request mit der zahl abschicken....

                Sicher reicht dein Script um kleine Seiten (zunächst) vor automatisierten Spameinträgen zu schützen. Wirklich wirksam ist es allerdings nicht, dazu müsstest du dir etwas einfallen lassen um es dem Computer schwerer zu machen an die richtige Zahlen-Kobination zu kommen.
                Create your own quiz show.

                Kommentar


                • #9
                  Danke, dass ist mir klar ^^
                  Ich habe ja erstens keine Buchstaben verwendet und zweitens (was wichtiger ist) das ganze noch nicht in ein Image verwandelt, damit es der PC nicht auslesen kann!
                  Die ganze Sache ist auch mehr eine Programmierübung für mich und wird weiterentwickelt werden, sobald ich dies kann und will.

                  Trotzdem Danke für den Hinweis.
                  MFG Toby
                  codestyle.ch
                  ----------------------------

                  Kommentar


                  • #10
                    PHP Ver. 4.4.4 zu 5.1.6

                    Tut mir Leid, dass ich das Thema nochmals hoch hole...
                    Jedoch habe ich noch nProblem mit dem Script, dass ich gemacht hab...

                    Also es läuft eigentlich alles Prima offline... und Online dann nich mehr...
                    Hab dann gemerkt, dass ich Online eine PHP Version älter (4.4.4) installiert hab....

                    Weiss zufälligerweise jemand warum mein Script jetzt nicht mehr funktioniert??

                    Wäre euch sehr Dankbar wenn ihr mir sonst einfach nTipp oder nLink zu den erweiterungen zu PHP 5 geben könntet, dann find ichs vll. auch selbst heraus...
                    Hab jetzt Leider bei Google nix kluges gefunden..

                    Danke, Gruss Toby

                    EDIT: Habs hier eingesetzt und funktioniert eben nicht...
                    Ich hab den Code nicht fest verändert, so dass man es denk ich gut mit dem alten vergleichen kann.
                    codestyle.ch
                    ----------------------------

                    Kommentar

                    Lädt...
                    X