php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2008

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 11.02.2008, 14:27  
Erfahrener Benutzer
 
Benutzerbild von Toby
 
Registriert seit: 26.09.2007
Beiträge: 117
PHP-Kenntnisse:
Anfänger
Toby befindet sich auf einem aufstrebenden Ast
Toby eine Nachricht über MSN schicken
Standard 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
__________________
hofoa.ch
----------------------------
Toby ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 15.02.2008, 08:21  
Moderator
 
Benutzerbild von cycap
 
Registriert seit: 13.02.2008
Beiträge: 6.816
PHP-Kenntnisse:
Fortgeschritten
cycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nett
Standard

Wie die Session wird überschrieben? Hast du vielleicht einfach session_start() vergessen?
cycap ist offline  
Alt 15.02.2008, 15:21  
Neuer Benutzer
 
Registriert seit: 15.02.2008
Beiträge: 1
daschifahrer befindet sich auf einem aufstrebenden Ast
Standard

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
daschifahrer ist offline  
Alt 15.02.2008, 16:05  
Erfahrener Benutzer
 
Benutzerbild von Toby
 
Registriert seit: 26.09.2007
Beiträge: 117
PHP-Kenntnisse:
Anfänger
Toby befindet sich auf einem aufstrebenden Ast
Toby eine Nachricht über MSN schicken
Standard

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
__________________
hofoa.ch
----------------------------
Toby ist offline  
Alt 16.02.2008, 10:08  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Zitat:
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.
Zitat:
$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']); 
David ist offline  
Alt 16.02.2008, 10:26  
Erfahrener Benutzer
 
Benutzerbild von Toby
 
Registriert seit: 26.09.2007
Beiträge: 117
PHP-Kenntnisse:
Anfänger
Toby befindet sich auf einem aufstrebenden Ast
Toby eine Nachricht über MSN schicken
Standard

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
__________________
hofoa.ch
----------------------------
Toby ist offline  
Alt 16.02.2008, 15:14  
Erfahrener Benutzer
 
Benutzerbild von Toby
 
Registriert seit: 26.09.2007
Beiträge: 117
PHP-Kenntnisse:
Anfänger
Toby befindet sich auf einem aufstrebenden Ast
Toby eine Nachricht über MSN schicken
Standard

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 ^^'
__________________
hofoa.ch
----------------------------
Toby ist offline  
Alt 16.02.2008, 22:57  
Moderator
 
Benutzerbild von agrajag
 
Registriert seit: 02.10.2006
Beiträge: 3.820
PHP-Kenntnisse:
Fortgeschritten
agrajag wird schon bald berühmt werdenagrajag wird schon bald berühmt werden
Standard

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.
agrajag ist offline  
Alt 17.02.2008, 00:06  
Erfahrener Benutzer
 
Benutzerbild von Toby
 
Registriert seit: 26.09.2007
Beiträge: 117
PHP-Kenntnisse:
Anfänger
Toby befindet sich auf einem aufstrebenden Ast
Toby eine Nachricht über MSN schicken
Standard

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
__________________
hofoa.ch
----------------------------
Toby ist offline  
Alt 11.03.2008, 19:38  
Erfahrener Benutzer
 
Benutzerbild von Toby
 
Registriert seit: 26.09.2007
Beiträge: 117
PHP-Kenntnisse:
Anfänger
Toby befindet sich auf einem aufstrebenden Ast
Toby eine Nachricht über MSN schicken
Standard 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.
__________________
hofoa.ch
----------------------------

Geändert von Toby (11.03.2008 um 19:42 Uhr).
Toby ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Session Problem karina_02 PHP Tipps 2008 6 18.05.2008 22:37
Problem bei session Lifetime Cyberbob_at_tot PHP Tipps 2007 5 05.06.2007 17:47
Problem mit Session Charly Shop Sui PHP Tipps 2006 13 25.08.2006 17:08
Session Problem? danysahne333 PHP Tipps 2006 10 28.04.2006 11:29
Und noch ein Session Problem... Weyoun PHP Tipps 2006 9 27.02.2006 22:17
Session Problem dimitri PHP Tipps 2007 8 29.12.2005 15:53
Session wieder aufnehmen; Problem mit GET Jacks Rache PHP-Fortgeschrittene 9 12.08.2005 14:32
[Erledigt] Problem mit Session PHP Tipps 2005-2 1 06.08.2005 19:07
SESSION Problem mit Opera 7 [Gelöst] akratellio PHP Tipps 2005-2 4 14.07.2005 10:51
session problem PHP Tipps 2005 10 23.05.2005 12:41
Session Problem PHP Tipps 2005 4 16.05.2005 17:50
Session Problem PHP-Fortgeschrittene 3 18.02.2005 14:37
Session Problem beim Login PHP Tipps 2004-2 6 15.12.2004 09:37
[Erledigt] PHP Session Problem, dringend! PHP-Fortgeschrittene 17 21.10.2004 21:15
Session wird falsch wieder aufgenommen - Problem mit Session PHP Tipps 2004 2 16.10.2004 14:30

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
captcha ohne session, captcha session, captcha session problem, php captcha session, session captcha, php captcha ohne session, php captcha session problem, php session captcha, captcha mit session, captcha session wird nicht übergeben, captcha php session, captcha php ohne session, capcha session error, \captcha ohne session\, captcha ohne sessions, captcha session php, captcha ohne session php, captcha session error, session-captcha =f3te, session php problem captcha

Alle Zeitangaben in WEZ +1. Es ist jetzt 10:49 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum