hier mal ein Vorschlag für ein Kontaktformular:
- mit XHTML-validem Code
ohne Javascript
tabellenfrei
Layout komplett über CSS anpassbar
von einer Blinden mit Screenreader getestet und für gut befunden
Schutz vor SQL-Injection und Cross-Site-Scripting
komplett im Modul gekapselt, also unabhängig von Core-Änderungen
Danke-, Fehlermeldungen und Formular-Beschriftung über Config-Bereich steuerbar
Nachtrag:
auf Nachrage von Carsten: Code ins Ausgabefeld einfügen
Nachtrag: habe in Redaxo 2.7, 3.0 und 3.1 getestet (jeweils die stable-Version, keine vom svn-Server!): funktioniert einwandfrei!
Nachtrag 08.12.2005: die neueste Version ist ab jetzt in der Modulsammlung zu finden: http://www.redaxo.de/165-Moduldetails.html?module_id=57
Code: Alles auswählen
<?php
// ============== Form config ==============
// Daten für die Ausgabe der Fehlermeldung,
// Überschrift, Legend, Beschreibung, Feldnamen, "Submit"-Button
$page_info = "";
$hack_meldung = "Leider konnten wir Ihre Anfrage nicht bearbeiten, weil das Formular nicht korrekt ausgefüllt ist. Bitte überprüfen Sie folgendes Eingabefeld:";
//Formular
$formular_legend = "";
$formular_info = "";
$formular_name = "Name";
$formular_email = "eMail";
$formular_meldung = "Ihre Nachricht";
$submit_value = "Senden";
$submit_titel = "Zum Absenden bitte nur 1x klicken";
// Danke-Seite
$danke_meldung = "Vielen Dank für Ihre Nachricht. Sie wurde soeben erfolgreich versendet. Wir werden uns in Kürze bei Ihnen melden.";
// Empfänger E-Mail
$empfaenger="info@xxx.com";
$email_titel="Anfrage an xxx";
// ============== Ende Form config ==============
// Daten aus Form config konvertieren
function clean_text($value = "")
{
$value = htmlentities($value);
return $value;
}
$page_info = clean_text($page_info);
$hack_meldung = clean_text($hack_meldung);
$formular_legend = clean_text($formular_legend);
$formular_name = clean_text($formular_name);
$formular_email = clean_text($formular_email);
$formular_meldung = clean_text($formular_meldung);
$submit_value = clean_text($submit_value);
$submit_titel = clean_text($submit_titel);
$danke_meldung = clean_text($danke_meldung);
// ============== Formularüberprüfung ==============
function cleanup ($string) {
// falls magic quotes on
if (get_magic_quotes_gpc())
{
$string = stripslashes($string);
}
$string = addslashes($string);
$string = strip_tags($string);
// "--","#";";","`","/" Ausfiltern von SQL-Statements
$string = str_replace(array("--","- -","#",";","`","/","<",">","{","}","[","]"),array("","","","","","","","","","","",""),$string);
// - mit Leerzeichen dazwischen (SQL-Kommentare!)
$string = preg_replace('#-\s+-#i',"",$string);
return $string;
} // end function cleanup
function checkName ($string) {
// $name am Anfang Buchstabe; keine Zahlen und Nicht-Wortzeichen; dann
// beliebig viele Buchstaben, Bindestriche, Leerzeichen und Punkte
if (preg_match("/^[^\W\d_]([^\W\d_]|[\-\'\s\.\ä\ö\ü\Ä\Ö\Ü\ß])*$/", stripslashes($string)))
{
return true; // OK
}
else
{
return false; // falsche Eingabe
}
} // end function checkName
function checkNumeric ($string) {
// nur Zahlenr
if (preg_match("/^\d*$/", stripslashes($string)))
{
return true; // OK
}
else
{
return false; // falsche Eingabe
}
} // end function checkNumeric
function checkEmail ($string) {
// $email mindestens a@a.aa
if (ereg("^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@([_a-zA-Z0-9-]+\.)+([a-zA-Z]{2,4})$", stripslashes($string)))
{
return true; // OK
}
else
{
return false; // falsche Eingabe
}
} // end function checkEmail
function checkMessage ($string) {
//
if (preg_match("/^[^\d_]([^\W]|[\-\'\s\"\.\!\?\;\,\:\€\%\(\)\+\=\@\*\ä\ö\ü\Ä\Ö\Ü\ß])*$/", stripslashes($string)))
{
return true; // OK
}
else
{
return false; // falsche Eingabe
}
} // end function checkMessage
$hack = false; // Bool'sche Variable zeigt an, ob
// ein Hackingversuch vorliegt
// Auslesen und Säubern der Daten aus $_POST
if (sizeof($_POST) == 0)
{
$name = "";
$email = "";
$message = "";
$submit = "";
}
else
{
$name = $_POST["name"];
$email = $_POST["email"];
$message = $_POST["message"];
$submit = $_POST["submit"];
$name = cleanup($name);
$email = cleanup($email);
$message = cleanup($message);
$submit = cleanup($submit);
// Verifizieren der Daten
if (checkName($name)!=1)
{
$hack = true; $feld = $formular_name;
}
if (checkEmail($email)!=1)
{
$hack = true; $feld = $formular_email;
}
if (checkMessage($message)!=1)
{
$hack = true; $feld = $formular_meldung;
}
} // end else
// ============== Ende Formularüberprüfung ==============
// beim ersten Aufruf oder unkorrekten Eingaben Formular ausgeben
if (($submit == "") OR (($submit == $submit_value) AND ($hack == true)))
{
// Bei inkorrekten Eingaben eine Fehlermeldung ausgeben:
if ($hack)
{
?>
<p><?php echo $hack_meldung; ?></p>
<ul>
<li><?php echo $feld; ?></li>
</ul>
<?php
} // end if ($hack)
else
{
if ($page_info != "")
{
echo "<p>" . $page_info . "</p>\n";
}
} // end else
?>
<div id="formwrap">
<div id="form">
<form id="kontakt" method="post" action="<?php echo $_SERVER['REQUEST_URI']; ?>">
<fieldset>
<?php
echo "<legend><strong>" . $formular_legend . "</strong></legend>\n";
?>
<label for="name"><strong><?php echo $formular_name; ?></strong></label><br />
<input class="inpt" type="text" id="name" name="name" size="38" title="<?php echo $formular_name; ?>" value="<?php echo stripslashes($name); ?>" tabindex="1" /><br /><br />
<label for="email"><strong><span lang="en"><?php echo $formular_email; ?></span></strong></label><br />
<input class="inpt" type="text" id="email" name="email" size="38" title="<?php echo $formular_email; ?>" value="<?php echo stripslashes($email); ?>" tabindex="2" /><br /><br />
<label for="message"><strong><?php echo $formular_meldung; ?></strong></label><br />
<textarea class="txt" id="message" name="message" title="<?php echo $formular_meldung; ?>" cols="36" rows="8" tabindex="3"><?php echo stripslashes($message); ?></textarea><br /><br />
<input type="submit" class="senden" name="submit" value="<?php echo $submit_value; ?>" title="<?php echo $submit_titel; ?>" tabindex="4" /><br />
</fieldset>
</form>
</div>
</div>
<?php
} // if (($submit == "") OR (($submit == $submit_value) AND ($hack == true)))
elseif (($submit == $submit_value) AND ($hack == false))
{
//email abschicken
$recipient=$empfaenger;
$subject=$email_titel;
$header="From: " . $email . "\n";
$mail_body ="Das Anfrage-Formular wurde am " . date("d.m.Y") . " um " . date("H:i") . "h ausgeführt.\n";
$mail_body.="Folgende Werte wurden eingetragen:\n\n";
$mail_body.="Name: " . $name . "\n";
$mail_body.="E-Mail: " . $email . "\n\n";
$mail_body.="Message:\n\n";
$mail_body.=$message . "\n\n ---- Ende der automatisch generierten eMail ----";
mail($recipient,$subject,$mail_body,$header);
echo "<br /><br /><p class=\"center\"><strong>" . $danke_meldung . "</strong></p>\n";
}
?>
Code: Alles auswählen
/* Start Forms */
#formwrap {
padding: 0px 0px 0px 0px;
margin: 0px 0px 0px 50px;
}
#form {
padding: 0px 0px 10px 0px;
margin: 0px 0px 0px 0px;
text-align: left;
}
/* Rahmenfarbe angeben für Opera */
fieldset {
border: 1px solid #fff;
padding: 0px 0px 0px 0px;
margin: 0px 0px 0px 0px;
}
legend {
border: 1px solid #fff;
}
Label {
font:11px/20px verdana, arial, helvetica, sans-serif;
padding:0px;
margin-left: 0px;
}
.inpt {
width: 350px;
border: 1px solid #999;
background-color: transparent;
color: #666666;
font-family: Verdana, Arial, Sans-Serif;
font-size: 11px;
padding: 1px 1px 1px 3px;
margin: 0px 0px 5px 0px;
word-spacing: 0.2em;
}
.txt {
width: 350px;
border: 1px solid #999;
background-color: transparent;
color: #666666;
font-family: Verdana, Arial, Sans-Serif;
font-size: 11px;
padding: 1px 1px 1px 3px;
margin: 0px 0px 5px 0px;
word-spacing: 0.2em;
}
input.inpt:focus, textarea.txt:focus {
color: #000;
font-family: Verdana, Arial, Sans-Serif;
}
.senden {
width: 150px;
font-weight: bold;
font-size: 11px;
margin: 15px 0px 0px 198px;
padding: 3px 0px 3px 0px;
background-color: #eee;
color: #333;
text-align: center;
border: solid 1px #999;
cursor: pointer;
}
label,
select,
input[type=checkbox],
input[type=radio],
input[type=button],
input[type=submit] {
cursor: pointer;
}
/* End Forms */
- Schriftgößen umstellen auf em (Barrierefreiheit)
Formconfig in Eingabebereich des Moduls, damit Nicht-Programmierer das besser editieren können (inzwischen umgesetzt, siehe Modulsammlung)
Wer Verbessungsvorschläge hat, bitte posten.
Gruß
Thorsten