Hallo, lieber Forumbenutzer. Wir haben in letzter Zeit festgestellt, dass die Kommunikation via Slack viel schneller und zielführender ist als ein Beitrag im Forum. Aufgrund der neuen Möglichkeiten der Kommunikation ist das Forum ein wenig eingeschlafen und weniger Nutzer benutzen das Forum aktiv (trotzdem lohnt es sich evtl. hier nach Lösungen zu suchen oder seine Frage zu stellen).

Wir empfehlen, für deine Fragen/Probleme aktuell (zusätzlich) Slack zu nutzen. Dort sind viele kompetente Benutzer aktiv und beantworten jegliche Fragen, gerne auch von REDAXO-Anfängern! Slack wird von uns sehr intensiv und meistens "rund um die Uhr" benutzt :-)
Selbst einladen kannst Du dich hier: http://redaxo.org/slack/
blubb
Beiträge: 33
Registriert: 13. Jul 2005, 13:39
Wohnort: Hannover

Kontaktformular - valide, weitgehend barrierefrei

15. Jul 2005, 15:48

Hi Leute,

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
neues Modul erzeugen und in Artikel einbinden:

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";
}  
?>
ins Stylesheet kommt dann Folgendes rein (wobei input/textarea Klassen bekommen, da man im IE sonst nicht vernünftig darauf zugreifen kann):

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 */
Verbesserungen wären:
  • Schriftgößen umstellen auf em (Barrierefreiheit)
    Formconfig in Eingabebereich des Moduls, damit Nicht-Programmierer das besser editieren können (inzwischen umgesetzt, siehe Modulsammlung)
Mit wenigen Änderungen/Erweiterungen läßt sich das auch als "Seite weiterempfehlen"-Script nutzen.

Wer Verbessungsvorschläge hat, bitte posten.

Gruß
Thorsten
Zuletzt geändert von blubb am 8. Dez 2005, 20:38, insgesamt 3-mal geändert.

bibi
Beiträge: 94
Registriert: 9. Jul 2005, 04:26
Wohnort: Bielefeld

16. Jul 2005, 00:12

Hallo blubb,

ich würde das gerne testen -- ich bin mir nur nicht ganz klar, wie ich es einbinde ;)

Du sagst, dass es ein Modul ist, aber dort habe ich die zwei Felder Ein- und Ausgabe ... :cry:

Danke,
Carsten

blubb
Beiträge: 33
Registriert: 13. Jul 2005, 13:39
Wohnort: Hannover

16. Jul 2005, 00:16

Hallo Carsten,
bibi hat geschrieben: Du sagst, dass es ein Modul ist, aber dort habe ich die zwei Felder Ein- und Ausgabe ... :cry:
in die Ausgabe, die Eingabe bleibt leer.

Gruß
Thorsten

bibi
Beiträge: 94
Registriert: 9. Jul 2005, 04:26
Wohnort: Bielefeld

16. Jul 2005, 00:49

So,

getestet :D

Funktioniert super! Ohne Probleme!

Auch finde ich es echt gut, dass die E-Mail ohne JavaScript versendet wird. :) Da freut sich mein Lynx ;)

Grüße,
Carsten

Benutzeravatar
Markus.Staab
Entwickler
Beiträge: 9634
Registriert: 29. Jan 2005, 15:50
Wohnort: Aschaffenburg/Germany
Kontaktdaten: ICQ Website

16. Jul 2005, 15:30

Hi

@Thomas

Vielleicht solltest dieses "verbesserte" Formular in die RedaxoDemo mit aufgenommen werden, wenn der Author damit einverstanden ist??

Gruß.
Markus

blubb
Beiträge: 33
Registriert: 13. Jul 2005, 13:39
Wohnort: Hannover

16. Jul 2005, 15:55

Hi Markus,
kills hat geschrieben:Hi

@Thomas

Vielleicht solltest dieses "verbesserte" Formular in die RedaxoDemo mit aufgenommen werden, wenn der Author damit einverstanden ist??
Nur zu, es wäre mir eine Ehre, zur Verbesserung des Systems beitragen zu können! :D

Gruß
Thorsten

hoppel
Beiträge: 76
Registriert: 24. Aug 2004, 22:11

18. Jul 2005, 10:22

super. wenn das formular jetzt auch gesendet wird ohne dass das emailfeld ausgefüllt werden muss; noch besser. das ist ja noch einfach. aber falls der user das emailfeld ausfüllt, soll eine automatische email gesendet werden an diesen user, als danke sozusagen. und wenn er das emailfeld nicht ausfüllt soll das formular trotzdem gesendet werden.

gruss

blubb
Beiträge: 33
Registriert: 13. Jul 2005, 13:39
Wohnort: Hannover

18. Jul 2005, 14:20

Hi hoppel,

1. config-Bereich oben:

Code: Alles auswählen

$formular_info = "Bitte tragen Sie Ihre Daten in die folgenden Felder ein. Felder mit (*) müssen ausgefüllt werden.";
2. email-Prüfung:

Code: Alles auswählen

function checkEmail ($string) {
// $email mindestens a@a.aa
    if (($string != "") && (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
3. Formular:

Code: Alles auswählen

<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";
	if ($formular_info != "")
	{
		echo "<p>" . $formular_info . "</p>\n";
	}
?>

<label for="name"><strong><?php echo $formular_name; ?></strong> <strong>*</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_message; ?></strong> <strong>*</strong></label><br />
<textarea class="txt" id="message" name="message" title="<?php echo $formular_message; ?>" 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>
4. email versenden:

Code: Alles auswählen

mail($recipient,$subject,$mail_body,$header);

////// ab hier ergänzen    
    if ($email != "")
    {
	    //email abschicken
    	$recipient2=$email;
    	$subject2="Ihre Anfrage an xxx";
    	$header2="From: " . $empfaenger . "\n";
    	$mail_body2=" . $danke_meldung . "\n";
    	
    	mail($recipient2,$subject2,$mail_body2,$header2);
	}

////// Ergänzung Ende
 
	echo "<br /><br /><p class=\"center\"><strong>" . $danke_meldung . "</strong></p>\n";
}  
Gruß
Thorsten

hoppel
Beiträge: 76
Registriert: 24. Aug 2004, 22:11

19. Jul 2005, 18:02

@blubb erstmal danke für deine mühe. ich muss das jetzt erst mal alles austesten.

gruss

fsiebert1977
Beiträge: 168
Registriert: 9. Feb 2005, 20:51
Wohnort: Bad Nauheim
Kontaktdaten: Website

20. Sep 2005, 20:17

Hi Blubb,

bei mir will er keine Umlaute in Namen und Text. Kann man das ändern?

Vielen Dank für das tolle Modul :)
Gruß Florian
www.softloop.biz

Benutzeravatar
Thomas.Blum
Entwickler
Beiträge: 5063
Registriert: 24. Aug 2004, 22:11
Wohnort: Dresden
Kontaktdaten: Website

21. Sep 2005, 08:53

Hej,
kills hat geschrieben:Hi
@Thomas

Vielleicht solltest dieses "verbesserte" Formular in die RedaxoDemo mit aufgenommen werden, wenn der Author damit einverstanden ist??

werde es nach Absprache einbauen.

Thomas

Benutzeravatar
Thomas.Blum
Entwickler
Beiträge: 5063
Registriert: 24. Aug 2004, 22:11
Wohnort: Dresden
Kontaktdaten: Website

21. Sep 2005, 08:56

Vergessen zu schreiben.

@Thorsten
Bitte auch ins myRedaxo reinstellen.

Thomas

Benutzeravatar
Thomas.Blum
Entwickler
Beiträge: 5063
Registriert: 24. Aug 2004, 22:11
Wohnort: Dresden
Kontaktdaten: Website

21. Sep 2005, 20:52

Hej,

Anregungen:

das <strong> aus dem Modul rausnehmen. Sonst widersprichst du dich mit
Thorsten hat geschrieben:Layout komplett über CSS anpassbar
die <br />'s würde ich auch rausnehmen.

Die Fehler alle auf einmal anzeigen, nicht nacheinander.

Felder für Vorname, Plz, Ort, Bspl. für ne Liste...

vg Thomas

Benutzeravatar
Jan.Kristinus
Admin
Beiträge: 2165
Registriert: 24. Aug 2004, 22:11
Wohnort: Frankfurt
Kontaktdaten: ICQ Website

22. Sep 2005, 10:54

hi blubb,

so ein formular als modul, bei dem man über die eingabe in redaxo absendeadresse .. einsetzen kann.. faende ich superklasse..

nur mal so als wunsch :)

gruss

jan
Yakamara Media GmbH & Co. KG | Kaiserstrasse 69 | 60329 Frankfurt
Tel.: 069-900.20.60.30
http://www.yakamara.de/

blubb
Beiträge: 33
Registriert: 13. Jul 2005, 13:39
Wohnort: Hannover

Kontaktformular - valide, weitgehend barrierefrei [Update]

23. Sep 2005, 13:32

Hi Jan,
jan hat geschrieben:so ein formular als modul, bei dem man über die eingabe in redaxo absendeadresse .. einsetzen kann.. faende ich superklasse..
Eingabe:

Code: Alles auswählen

Bitte die entsprechenden Felder ausfüllen, da sonst das Kontaktformular nicht funktionsfähig ist.
<br>
Bezeichner Namensfeld:
<br><input type=text size=10 class=inp100 name=VALUE[1] value="REX_VALUE[1]"><br><br>
Bezeichner EMail-feld:
<br><input type=text size=10 class=inp100 name=VALUE[2] value="REX_VALUE[2]"><br><br>
Bezeichner Text-/Nachrichtenfeld:
<br><input type=text size=10 class=inp100 name=VALUE[3] value="REX_VALUE[3]"><br><br>
Aufschrift auf Senden-Button:
<br><input type=text size=10 class=inp100 name=VALUE[4] value="REX_VALUE[4]"><br><br>
Meldung bei nicht korrekt ausgefülltem Formular:
<br><textarea name=VALUE[5] cols=80 rows=2 class=inp100>REX_VALUE[5]</textarea><br><br>
Meldung bei erfolgreicher Versendung des Formulars:
<br><textarea name=VALUE[6] cols=80 rows=2 class=inp100>REX_VALUE[6]</textarea><br><br>
EMail an die das Formular versendet werden soll:
<br><input type=text size=10 class=inp100 name=VALUE[7] value="REX_VALUE[7]"><br><br>
EMail an die das Formular als Kopie versendet werden soll:
<br><input type=text size=10 class=inp100 name=VALUE[8] value="REX_VALUE[8]"><br><br>
Titel der EMail:
<br><input type=text size=10 class=inp100 name=VALUE[9] value="REX_VALUE[9]"><br><br>
Ausgabe:

Code: Alles auswählen

<?php
	
// ============== Form config ==============
// Daten für die Ausgabe der Fehlermeldung, 
// Überschrift, Legend, Beschreibung, Feldnamen, "Submit"-Button

	$page_info = "";
	$hack_message = "REX_VALUE[5]";

	//Formular
	$form_header = "";
	$form_legend = "";
	$form_info = "";

	$form_name = "REX_VALUE[1]";
	$form_firma = "";
	$form_email = "REX_VALUE[2]";
	$form_message = "REX_VALUE[3]";
	$submit_value = "REX_VALUE[4]";
	$submit_titel = "Zum Absenden bitte nur 1x klicken";
	
	// Danke-Seite
	$thanks_message = "REX_VALUE[6]";
	
	// Empfänger E-Mail
	$empfaenger="REX_VALUE[7]";
        $empfaengerBC="REX_VALUE[8]";
	$email_titel="REX_VALUE[9]";
	
// ============== Ende Form config ==============

// Daten aus Form config konvertieren
    function clean_text($value = "") 
    {
        $value = htmlentities($value);
        return $value;
	}

    $page_info = clean_text($page_info);
	//$hack_message = clean_text($hack_message);
	$form_legend = clean_text($form_legend);
	//$form_name = clean_text($form_name);
	//$form_email = clean_text($form_email);
	$form_firma = clean_text($form_firma);
	$form_message = clean_text($form_message);
	$submit_value = clean_text($submit_value);
	//$submit_titel = clean_text($submit_titel);
	//$thanks_message = clean_text($thanks_message);
	
// ============== 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) {
// $email mindestens a@a.aa
    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 = "";
        $firma = "";
        $email = "";
        $message = "";
        $submit = "";
    }
    else
    {
		$name = $_POST["name"];		
    	$email = $_POST["email"];
    	$firma = $_POST["firma"];
    	$message = $_POST["message"];
    	$submit = $_POST["submit"];
    	
    	$name = cleanup($name);
    	$email = cleanup($email);
    	$firma = cleanup($firma);
    	$message = cleanup($message);
    	$submit = cleanup($submit);
	
    	// Verifizieren der Daten

    	if (checkName($name)!=1)
		{
			$hack = true; $feld = $form_name;
		}

		if (checkEmail($email)!=1)
		{
			$hack = true; $feld = $form_email;
		}

		if (checkMessage($message)!=1)
		{
			$hack = true; $feld = $form_message;
		}
		
	} // end else

// ============== Ende Formularüberprüfung ==============

?>

<?php
// 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_message; ?></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>" . $form_legend . "</strong></legend>\n";


?>

<label for="name"><strong><?php echo $form_name; ?></strong></label><br />
<input class="inpt" type="text" id="name" name="name" size="38" title="<?php echo $form_name; ?>" value="<?php echo stripslashes($name); ?>" tabindex="1" /><br /><br />

<label for="email"><strong><span lang="en"><?php echo $form_email; ?></span></strong></label><br />
<input class="inpt" type="text" id="email" name="email" size="38" title="<?php echo $form_email; ?>" value="<?php echo stripslashes($email); ?>" tabindex="2" /><br /><br />

<label for="message"><strong><?php echo $form_message; ?></strong></label><br />
<textarea class="txt" id="message" name="message" title="<?php echo $form_message; ?>" 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);
    if ($empfaengerBC!=""){
      $recipient=$empfaengerBC;
      mail($recipient,$subject,$mail_body,$header);
    }
	echo "<br /><br /><p class="center"><strong>" . $thanks_message . "</strong></p>\n";
}  

?>
@tbaddade
- strong rausnehmen kann man ja machen, ich widerspreche mir allerdings nicht, da man über CSS "label strong" font-weight wieder auf "normal" setzen kann.
- die br's habe ich bewußt da drin, da das floaten wie bei einfach-für-alle beschrieben nicht in allen Browsern ohne Zicken funktioniert.
- zudem ist das Formular in dieser Form von einer Blinden getestet und für gut befunden (habe das so im Frontend des barrierefreien CMS Papoo eingebaut, wo ich hin- und wieder mal etwas beisteuere)
- du kannst das ruhig einbauen, bin einverstanden

@fsiebert1977
- Umlaute in Namen und Text sollten eigentlich funktionieren, anpassbar ist das in den regulären Ausdrücken für die Prüfung der Formularfelder

Gruß
Thorsten
Zuletzt geändert von blubb am 8. Dez 2005, 00:29, insgesamt 1-mal geändert.

Benutzeravatar
Markus.Staab
Entwickler
Beiträge: 9634
Registriert: 29. Jan 2005, 15:50
Wohnort: Aschaffenburg/Germany
Kontaktdaten: ICQ Website

23. Sep 2005, 13:50

Hi Thorsten,

wenn du jetzt das ganze noch mit einer Ordentlichen Beschreibung in die Modulsammlung stellst, dann bin ich sogar wunschlos glücklich. ;)

Gruß,
Markus

Benutzeravatar
Thomas.Blum
Entwickler
Beiträge: 5063
Registriert: 24. Aug 2004, 22:11
Wohnort: Dresden
Kontaktdaten: Website

Re: Kontaktformular - valide, weitgehend barrierefrei [Updat

23. Sep 2005, 15:10

blubb hat geschrieben: @tbaddade
- strong rausnehmen kann man ja machen, ich widerspreche mir allerdings nicht, da man über CSS "label strong" font-weight wieder auf "normal" setzen kann.
Das ist richtig, aber da verstehe ich nicht warum du strong reinmachst. Warum etwas zurücksetzen, wenn man es nicht vorhanden sein braucht.

Über

label {font-weight:bold;}

erreichst du das gleiche


Thomas

Benutzeravatar
alex2911
Beiträge: 567
Registriert: 20. Jul 2005, 04:13
Wohnort: Österreich
Kontaktdaten: Website

26. Sep 2005, 04:40

Angelehnt an dieses Modul ist von mir ein Newsletter-Formular dazu gekommen. Zu finden im Downloadbereich unter Module ( http://www.redaxo.de/17-0-module.html )

fsiebert1977
Beiträge: 168
Registriert: 9. Feb 2005, 20:51
Wohnort: Bad Nauheim
Kontaktdaten: Website

10. Okt 2005, 15:05

Hi Thorsten,

kenne mich mit regulären Ausdrücken leider noch nicht aus. Ich sehe zwar, dass da in dem String nach Ä's, Ü's und anderen Sonderzeichen gesucht wird, aber ich weiss nicht, ob ich die einfach da rauslöschen kann. Wenn, dann muss ich wahrscheinlich auch den Slash vorher mit rauslöschen, oder? Ich hab jetzt erstmal einfach die Überprüfung von Name und Text ganz abgeschaltet, habe aber das Problem, dass Sonderzeichen in ganz verkorkster Form in der E-Mail ankommen. Die sind wahrscheinlich url-codiert, oder? Wie könnte ich das zurückwandeln? Vielen Dank für deine Hilfe.
Gruß Florian
www.softloop.biz

blubb
Beiträge: 33
Registriert: 13. Jul 2005, 13:39
Wohnort: Hannover

21. Nov 2005, 18:09

Hi Florian,

war etwas länger nicht hier, daher erst jetzt meine Antwort.
fsiebert1977 hat geschrieben:Ich sehe zwar, dass da in dem String nach Ä's, Ü's und anderen Sonderzeichen gesucht wird, aber ich weiss nicht, ob ich die einfach da rauslöschen kann.
im hinteren Teil des regulären Ausdrucks stehen die erlaubten Zeichen
fsiebert1977 hat geschrieben:Ich hab jetzt erstmal einfach die Überprüfung von Name und Text ganz abgeschaltet
das ist eine Sicherheitslücke
fsiebert1977 hat geschrieben:Die sind wahrscheinlich url-codiert, oder?
nicht, das ich wüßte.

Ich versuche mal, das nachzuvollziehen.

Nachtrag: habe das Formular mit Umlauten befüllt und sowohl in Redaxo 2.7, als auch in Version 3.0 getestet (jeweils die stable-Version, keine vom svn-Server!): funktioniert einwandfrei! Keine Ahnung, wie die Fehler mit den Umlauten bei Dir zustande kommen.

Gruß
Thorsten

fsiebert1977
Beiträge: 168
Registriert: 9. Feb 2005, 20:51
Wohnort: Bad Nauheim
Kontaktdaten: Website

22. Nov 2005, 21:45

Hi Thorsten,

das mit den Umlauten war ein Codepage-Problem. Ich habe alles auf UTF-8 umgestellt, jetzt funktioniert es einwandfrei.

Eine Frage: wie kann man mit einem Mail-Formular was hacken, wenn die Felder nicht überprüft werden? Das würde mich interessieren.

Danke für deine Hilfe.
Gruß Florian
www.softloop.biz

blubb
Beiträge: 33
Registriert: 13. Jul 2005, 13:39
Wohnort: Hannover

22. Nov 2005, 21:55

Hi Florian,
fsiebert1977 hat geschrieben:Eine Frage: wie kann man mit einem Mail-Formular was hacken, wenn die Felder nicht überprüft werden? Das würde mich interessieren.
Stichworte: SQL-Injection und Cross-Site-Scripting (XSS) (Erklärung würde hier zu weit führen, Sicherheit von Webseiten/Formularen ist ein Thema für sich -> Google)

kurz: in die Felder kann ja statt Name oder email-Adresse usw. auch bösartiger Code eingefügt werden, im schlimmsten Fall ist Deine Datenbank dann gelöscht; es lohnt sich also schon, sich damit auseinander zu setzen.

Gruß
Thorsten

fsiebert1977
Beiträge: 168
Registriert: 9. Feb 2005, 20:51
Wohnort: Bad Nauheim
Kontaktdaten: Website

23. Nov 2005, 00:34

Aber es wird doch gar keine SQL-Abfrage durchgeführt, oder? Könnte man ohne die Feldüberprüfung einfach SQL-Statements in das Formular eintragen und diese würden ausgeführt?
Gruß Florian
www.softloop.biz

blubb
Beiträge: 33
Registriert: 13. Jul 2005, 13:39
Wohnort: Hannover

23. Nov 2005, 01:03

fsiebert1977 hat geschrieben:Aber es wird doch gar keine SQL-Abfrage durchgeführt, oder? Könnte man ohne die Feldüberprüfung einfach SQL-Statements in das Formular eintragen und diese würden ausgeführt?
jau!

fsiebert1977
Beiträge: 168
Registriert: 9. Feb 2005, 20:51
Wohnort: Bad Nauheim
Kontaktdaten: Website

23. Nov 2005, 10:38

blubb hat geschrieben:jau!
Oh!
Gruß Florian
www.softloop.biz

Zurück zu „Allgemeines [R2]“