zurück zur Startseite
  


Zurück XHTMLforum > Webentwicklung (außer XHTML und CSS) > Serveradministration und serverseitige Scripte
Seite neu laden Kontaktformular von fox: Fehlermeldung schon im ersten Schritt

Antwort
 
LinkBack Themen-Optionen Ansicht
  #1 (permalink)  
Alt 06.07.2010, 21:04
Neuer Benutzer
neuer user
Thread-Ersteller
 
Registriert seit: 18.06.2010
Beiträge: 26
Sand10 befindet sich auf einem aufstrebenden Ast
Standard Kontaktformular von fox: Fehlermeldung schon im ersten Schritt

Hallo,

ich bin sooo frustriert, weil ich nicht weiterkomme. Und das bereits im ersten Schritt

Ich habe von php leider garkeine Ahnung!

Und zwar würde ich gerne das Kontaktformular von fox benutzen:

http://xhtmlforum.de/45301-kontaktfo...rierefrei.html

Die Beispieldatei "secureForm_example" funktioniert:

PHP-Code:
<?php

require_once 'secureForm.php';

$form_sent false

// Eine neue Instanz der Klasse wird erzeugt 
$form = new SecureForm(); 

// Für jedes Formfeld wird eine zufällige (CSS-)ID erzeugt und in den Variablen gespeichert 
$id_name $form->getID('name'); 
$id_email $form->getID('email'); 
$id_nachricht $form->getID('nachricht'); 

// Der Submit-Button muss nicht zwangsweise "anonymisiert" werden 
$id_submit $form->getID('submit'); 


// Die CSS-Datei wurde vom Browser angefordert und wird abgeschickt 
if (isset ($_GET['getCSS'])) { 
    
header ("Content-Type: text/css"); 
    
$form->generateCSS(); 
    exit; 


// Es wird nun geprüft, ob der Submit-Knopf gedrückt und das Formular abgesendet wird. 
// Die Formularfelder sind mit den verschiedenen IDs als Namen gespeichert. 
if (!empty ($_POST[$id_submit])) { 
    
$form_sent true
     
    
// Zuerst überprüfen wir, ob alle gewünschten Felder ausgefüllt sind 
    
if (!empty ($_POST[$id_name]) && !empty ($_POST[$id_email]) && !empty ($_POST[$id_nachricht])) { 
         
        
// Danach wird geprüft, ob das versteckte Feld ausgefüllt wurde. 
        // Sollte das der Fall sein haben wir es höchstwahrscheinlich mit einem Spambot zu tun 
        // Hier könnten auch weitere Aktionen unternommen werden, z.B. loggen und/oder sperren der IP des Bots, o.ä. 
        
if (!empty ($_POST[$form->getSecretID()])) { 
            
session_destroy (); 
            echo 
'Spambot erkannt.'
            exit; 
        } 
         
        
// Nun können wir die E-Mail versenden 
        
$name $_POST[$id_name]; 
        
$email $_POST[$id_email]; 
        
$nachricht $_POST[$id_nachricht]; 
         
        
// E-Mail verschicken...  
         
        
session_destroy (); 
        exit; 
    } 
     
    
// Falls nicht alle Felder ausgefüllt sind sollte die Session-ID sowie die geheimen IDs erneuert werden, 
    // um mögliche Brut-Force-Angriffe von Bots aus dem Weg zu gehen. 
    // WICHTIG: Vor dem erneuern dürfen die Header noch nicht gesendet werden! 
    
$form->regenerateIDs(); 


/* Nun wird das Formular erzeugt: 
Eventuell wird es auch in Templates eingebunden o.ä. 
Vorher sollten normalerweise der HTML-Kopf, etc. kommen 
Wichtig ist, dass die Session-ID übergeben wird! 
Alternativ kann diese auch mit einem versteckten Feld und POST übergeben werden, 
PHP erkennt diese automatisch. 
Außerdem dürfen die beiden Stylesheets nicht fehlen! 

Das erste Stylesheet ist die Vorgabe für die normalen Felder. 
Da diese Angabe *vor* den anderen kommt, gilt diese. 
Bei den versteckten Feldern wird zusätzlich ein !important hingehängt, damit werden die Felder unsicht- und -hörbar.*/ 

echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Kontaktformular mit Spamschutz</title>
    <style type="text/css">
    /*<[!CDATA[*/
        body { 
            color: #555;
            font: 0.8em \'Lucida Grande\', Verdana, Tahoma, sans-serif;
        }
        fieldset {
            border: 1px dotted #A6A6A6;
            padding: 10px;
            margin: 5px;
            margin-bottom: 20px;
        }
        fieldset legend {
            font-weight: bold;
        }
        
        /* Dieser Abschnitt ist fuer das Skript wichtig */
        .form input, .form textarea { 
            position: static !important; 
            display: block !important; 
            speak: normal !important; 
        }
    /*]]>*/
    </style>
    <!-- Hier nicht die Session-ID vergessen -->
    <link rel="stylesheet" type="text/css" href="secureForm_example.php?getCSS&amp;' 
SID '" media="all" /> 
</head>

<body>

<fieldset>
    <legend>Kontaktformular</legend>

    <!-- Auch hier ist die Session-ID wichtig, um die IDs spaeter wieder den Feldern zuzuordnen -->
    <form action="secureForm_example.php?' 
SID '" method="POST" class="form">'

// Nun werden die einzelnen Eingabefelder ausgegeben. 
// Dabei wird gleich überprüft, ob das Formular bereits abgesendet wurde und ob Felder fehlen. 
echo '
    <label>Dein Name' 
. ((($form_sent && empty ($_POST[$id_name]))) ? ' (fehlt)' '') . ':</label> <input type="text" id="' $id_name '" name="' $id_name '" value ="' . ((!empty ($_POST[$id_name])) ? htmlspecialchars ($_POST[$id_name]) : '') . '" /><br /> 
    <label>Deine E-Mail-Adresse' 
. ((($form_sent && empty ($_POST[$id_mail]))) ? ' (fehlt)' '') . ':</label> <input type="text" id="' $id_email '" name="'  .$id_email '" value="' . ((!empty ($_POST[$id_email])) ? htmlspecialchars ($_POST[$id_email]) : '') . '" /><br /> 
    <label>Deine Nachricht' 
. ((($form_sent && empty ($_POST[$id_nachricht]))) ? ' (fehlt)' '') . ':</label><br /> 
    <textarea name="' 
$id_nachricht '" id="' $id_nachricht '">' . ((!empty ($_POST[$id_nachricht])) ? htmlspecialchars ($_POST[$id_nachricht]) : '') . '</textarea><br />
    <input type="text" name="' 
$form->getSecretID() . '" id="' $form->getSecretID() . '" value="" />' // Auch das versteckte Feld bekommt seinen Platz 
    
'
    <input type="submit" name="' 
$id_submit '" id="' $id_submit '" value="Formular absenden" />
    
    </form>

</fieldset>

</body>
</html>'


// Fertig. :) 
// Man könnte das versteckte Feld noch an zufälligen Positionen erscheinen lassen, um es den Spambots nicht zu leicht zu machen.
secureForm.php:

PHP-Code:
<?php

/**
 * No more SPAM: Secure your form...
 * 
 * INSTALL:
 * You *must* include a css-definition for the form fields like this:
 * input, textarea { position: static !important; display: block !important; speak: normal !important; }
 * 
 * This is very important, otherwise the user wont see ANY fields!
 * You also have to include the class-generated css-definitions in your document.
 *
 * @author Steffen Manzer, noecho.de <noecho.smanzer@gmail.com>
 * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
 * @see http://xhtmlforum.de/51007-bitte-austesten-formular-spamschutz.html
 *
 */
class SecureForm



{
    
    private
        
$secret        null,
        
$keys        = array (),
        
$confusing    = array ();
    
    
    
    public function 
__construct () {
        
// make sure that the session id will not be saved in cookies
        
@ini_set('session.use_cookies'0);
        @
ini_set('session.use_only_cookies'0);
    
    
session_start();    
        
        if (!empty (
$_SESSION['secret'])) {
            
$this->secret $_SESSION['secret'];
        } else {
            
$this->secret $this->generateID();
        }
        
        if (!empty (
$_SESSION['keys'])) {
            
$this->keys $_SESSION['keys'];
        }
        
        if (!empty (
$_SESSION['confusing'])) {
            
$this->confusing $_SESSION['confusing'];
        }
        
        
// dont cache this or you'll be shot!
        
if (!headers_sent ()) {
            
header('Cache-Control: no-cache, must-revalidate');
            
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
        }
    }
    
    
/**
     * Save keys in Session
     *
     */
    
public function __destruct ()
    {
        
$_SESSION['secret'] = $this->secret;
        
$_SESSION['keys'] = $this->keys;
        
$_SESSION['confusing'] = $this->confusing;
    }
    
    
/**
     * Generate a random ID
     *
     * @return string
     */
    
protected function generateID ()
    {
        return 
substr (chr (rand (97122)) . sha1 (uniqid ()), 0rand (58));
    }

    
/**
     * Add new field
     *
     * @param $label label for the field
     * @return string $key
     */
    
public function getID ($label)
    {
        if (empty (
$this->keys[$label])) {
            
$this->keys[$label] = $this->generateID();
        }
        return 
$this->keys[$label];
    }
    
    
/**
     * return the secret key
     *
     * @return unknown
     */
    
public function getSecretID ()
    {
        return 
$this->secret;
    }
    
    
/**
     * Generate new Session-ID and new keys
     * WARNING: This function must be called before any output.
     * The headers may not be sent yet!
     *
     * @return bool
     */
    
public function regenerateIDs ()
    {
        if (
headers_sent ()) return false;
        @
session_regenerate_id (true);
        
$this->secret $this->generateID();
        foreach (
$this->keys as $key => $value) {
            
$this->keys[$key] = $this->generateID();
        }
        
$this->confusing = array ();
        return 
true;
    }
    
    
/**
     * Generate the css necessary for the forms
     *
     * @param $return return the generated css or output it directly
     * @return mixed string|null
     */
    
public function generateCSS ($return false)
    {
        
$content '@media all{';
        
        
$ids array_values ($this->keys);
        if (empty (
$this->confusing)) {
            for (
$i 0$i < (rand(815)); $i++) {
                
$id $this->generateID();
                
$ids[] = $id;
                
$this->confusing[] = $id;
            }
        } else {
            
$ids $ids $this->confusing;
        }

        
sort ($ids);    
        
$num count($ids);
        
$pos array_rand ($ids);
        
        
$displayed false;
        for (
$i 0$i $num$i++) {
            
            
// hidden field
            
if (($pos == $i) && (!$displayed)) {
                
$content .= '#' $this->secret ' {';
                
$content .= "position:absolute !important;left:-99999px;speak:none !important;display:none !important;}";
                
$displayed true;
                
$i--;
            
            
// any other form field
            
} elseif (in_array ($ids[$i], $this->keys)) {
                
$content .= '#' $ids[$i] . " {";
                
$content .= "position:absolute;left:-99999px;speak:none;display:none;}";
        
            
// random, confusing field
            
} else {
                
$r = (rand (01) == 1);
                
$content .= '#' $ids[$i] . " {";
                
$content .= "position:absolute" . ($r ' !important' '') . ";left:-99999px;speak: none" . ($r ' !important' '') . ";display: none" . ($r ' !important' '') . ';}';
            }
        }
        
$content .= '}';
        if (
$return) {
            return 
$content;
        } else {
            echo 
$content;
        }
    }
}

Aaaaber, schon meine erste Anpassung funktioniert nicht!
Und zwar habe ich die secureForm_example.php in meine index.php kopiert.
Dateiverweuise habe ich natürlich angepasst.

Leider bekomme ich die Fehlermeldung:

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /var/www/vhosts/eyes-on-fire.de/httpdocs/test/kontakt/index.php:1) in /var/www/vhosts/eyes-on-fire.de/httpdocs/test/kontakt/secureForm.php on line 36



Hier ist der Link:
Kontaktformular mit Spamschutz


Und hier ist meine index.php:

PHP-Code:
<?php

require_once 'secureForm.php';

$form_sent false

// Eine neue Instanz der Klasse wird erzeugt 
$form = new SecureForm(); 

// Für jedes Formfeld wird eine zufällige (CSS-)ID erzeugt und in den Variablen gespeichert 
$id_name $form->getID('name'); 
$id_email $form->getID('email'); 
$id_nachricht $form->getID('nachricht'); 

// Der Submit-Button muss nicht zwangsweise "anonymisiert" werden 
$id_submit $form->getID('submit'); 


// Die CSS-Datei wurde vom Browser angefordert und wird abgeschickt 
if (isset ($_GET['getCSS'])) { 
    
header ("Content-Type: text/css"); 
    
$form->generateCSS(); 
    exit; 


// Es wird nun geprüft, ob der Submit-Knopf gedrückt und das Formular abgesendet wird. 
// Die Formularfelder sind mit den verschiedenen IDs als Namen gespeichert. 
if (!empty ($_POST[$id_submit])) { 
    
$form_sent true
     
    
// Zuerst überprüfen wir, ob alle gewünschten Felder ausgefüllt sind 
    
if (!empty ($_POST[$id_name]) && !empty ($_POST[$id_email]) && !empty ($_POST[$id_nachricht])) { 
         
        
// Danach wird geprüft, ob das versteckte Feld ausgefüllt wurde. 
        // Sollte das der Fall sein haben wir es höchstwahrscheinlich mit einem Spambot zu tun 
        // Hier könnten auch weitere Aktionen unternommen werden, z.B. loggen und/oder sperren der IP des Bots, o.ä. 
        
if (!empty ($_POST[$form->getSecretID()])) { 
            
session_destroy (); 
            echo 
'Spambot erkannt.'
            exit; 
        } 
         
        
// Nun können wir die E-Mail versenden 
        
$name $_POST[$id_name]; 
        
$email $_POST[$id_email]; 
        
$nachricht $_POST[$id_nachricht]; 
         
        
// E-Mail verschicken...  
         
        
session_destroy (); 
        exit; 
    } 
     
    
// Falls nicht alle Felder ausgefüllt sind sollte die Session-ID sowie die geheimen IDs erneuert werden, 
    // um mögliche Brut-Force-Angriffe von Bots aus dem Weg zu gehen. 
    // WICHTIG: Vor dem erneuern dürfen die Header noch nicht gesendet werden! 
    
$form->regenerateIDs(); 


/* Nun wird das Formular erzeugt: 
Eventuell wird es auch in Templates eingebunden o.ä. 
Vorher sollten normalerweise der HTML-Kopf, etc. kommen 
Wichtig ist, dass die Session-ID übergeben wird! 
Alternativ kann diese auch mit einem versteckten Feld und POST übergeben werden, 
PHP erkennt diese automatisch. 
Außerdem dürfen die beiden Stylesheets nicht fehlen! 

Das erste Stylesheet ist die Vorgabe für die normalen Felder. 
Da diese Angabe *vor* den anderen kommt, gilt diese. 
Bei den versteckten Feldern wird zusätzlich ein !important hingehängt, damit werden die Felder unsicht- und -hörbar.*/ 

echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Kontaktformular mit Spamschutz</title>
    <style type="text/css">
    /*<[!CDATA[*/
        body { 
            color: #555;
            font: 0.8em \'Lucida Grande\', Verdana, Tahoma, sans-serif;
        }
        fieldset {
            border: 1px dotted #A6A6A6;
            padding: 10px;
            margin: 5px;
            margin-bottom: 20px;
        }
        fieldset legend {
            font-weight: bold;
        }
        
        /* Dieser Abschnitt ist fuer das Skript wichtig */
        .form input, .form textarea { 
            position: static !important; 
            display: block !important; 
            speak: normal !important; 
        }
    /*]]>*/
    </style>
    <!-- Hier nicht die Session-ID vergessen -->
    <link rel="stylesheet" type="text/css" href="index.php?getCSS&amp;' 
SID '" media="all" /> 
</head>

<body>

<fieldset>
    <legend>Kontaktformular</legend>

    <!-- Auch hier ist die Session-ID wichtig, um die IDs spaeter wieder den Feldern zuzuordnen -->
    <form action="index.php?' 
SID '" method="POST" class="form">'

// Nun werden die einzelnen Eingabefelder ausgegeben. 
// Dabei wird gleich überprüft, ob das Formular bereits abgesendet wurde und ob Felder fehlen. 
echo '
    <label>Dein Name' 
. ((($form_sent && empty ($_POST[$id_name]))) ? ' (fehlt)' '') . ':</label> <input type="text" id="' $id_name '" name="' $id_name '" value ="' . ((!empty ($_POST[$id_name])) ? htmlspecialchars ($_POST[$id_name]) : '') . '" /><br /> 
    <label>Deine E-Mail-Adresse' 
. ((($form_sent && empty ($_POST[$id_mail]))) ? ' (fehlt)' '') . ':</label> <input type="text" id="' $id_email '" name="'  .$id_email '" value="' . ((!empty ($_POST[$id_email])) ? htmlspecialchars ($_POST[$id_email]) : '') . '" /><br /> 
    <label>Deine Nachricht' 
. ((($form_sent && empty ($_POST[$id_nachricht]))) ? ' (fehlt)' '') . ':</label><br /> 
    <textarea name="' 
$id_nachricht '" id="' $id_nachricht '">' . ((!empty ($_POST[$id_nachricht])) ? htmlspecialchars ($_POST[$id_nachricht]) : '') . '</textarea><br />
    <input type="text" name="' 
$form->getSecretID() . '" id="' $form->getSecretID() . '" value="" />' // Auch das versteckte Feld bekommt seinen Platz 
    
'
    <input type="submit" name="' 
$id_submit '" id="' $id_submit '" value="Formular absenden" />
    
    </form>

</fieldset>

</body>
</html>'


// Fertig. :) 
// Man könnte das versteckte Feld noch an zufälligen Positionen erscheinen lassen, um es den Spambots nicht zu leicht zu machen.

Das kann doch alles nicht wahr sein?!?!

BITTE BITTE helft mir!

Vielen Dank und liebe Grüße
Eure Nadine





Hier ist meine Datei.
Mit Zitat antworten
Sponsored Links
  #2 (permalink)  
Alt 06.07.2010, 21:28
Benutzerbild von fox
fox fox ist offline
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 11.09.2006
Beiträge: 1.011
fox sorgt für eine eindrucksvolle Atmosphärefox sorgt für eine eindrucksvolle Atmosphäre
Standard

Das hört sich verdammt danach an, als wäre deine Datei in UTF-8 + BOM (Byte-Order-Mark) gespeichert. Das macht der Windows-Editor gerne mal...
Mit Notepad+, Notepad2, etc. kannst du das wieder entfernen.

Siehe auch: http://toscho.de/2009/bom-entfernen/
Mit Zitat antworten
Sponsored Links
  #3 (permalink)  
Alt 06.07.2010, 21:31
Benutzerbild von David
auch, ja!
XHTMLforum-Kenner
 
Registriert seit: 08.11.2007
Beiträge: 2.630
David ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer AnblickDavid ist ein wunderbarer Anblick
Standard

Die Fehlermeldung besagt, dass bevor die Funktion session_start() aufgerufen wurde, bereits eine Ausgabe an den Browser gesendet wurde.

Eine HTTP-Antwort beginnt damit, dass der Header gesendet wird und anschließend die eigentlichen Daten. D.h. sobald im PHP-Script eine Ausgabe geschiet (z.B. per echo) können keine Header mehr gesendet werden.

Die Funktion session_start() versucht standardmäßig ein Session-Cookie zu setzen, was eine Headerinformation ist.

Also muss session_start() immer aufgerufen werden, bevor irgendwas anderes an den Browser rausgeht.
__________________
github | http://dnaber.de
Mit Zitat antworten
  #4 (permalink)  
Alt 07.07.2010, 08:43
Neuer Benutzer
neuer user
Thread-Ersteller
 
Registriert seit: 18.06.2010
Beiträge: 26
Sand10 befindet sich auf einem aufstrebenden Ast
Standard

Wahnsinn!
Fox, du hast recht! Ich danke dir!

Mit Hilfe deines Links hat das super geklappt!

Danke auch Dir David!



Wow.. weiter gehts zum zweiten Schritt... *kaffehol*
Mit Zitat antworten
Antwort

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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 aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Modernes Webdesign mit CSS - Workshop-Buch mit Schritt für Schritt Anleitungen Webstandard Ressourcen 0 04.07.2011 12:46
Kontaktformular Fehler ... root-2k (X)HTML 3 22.11.2010 20:05
Kontaktformular von fox - Anpassungen Sand10 Serveradministration und serverseitige Scripte 4 08.07.2010 12:26
kontaktformular mit captcha fehler talkuvit Serveradministration und serverseitige Scripte 30 08.06.2010 18:52
PHP Kontaktformular und verschiedene Browser HTMLLernender (X)HTML 1 22.01.2010 11:08


Alle Zeitangaben in WEZ +2. Es ist jetzt 06:59 Uhr.