Donnerstag, 21. Februar 2008

PHP- und HTML-Baustein: Kontaktformular (formmailer)

Gerade habe ich wieder eine Webseite fertiggestellt, in die ich ein Kontaktformular einzubauen hatte. Und wie immer dasselbe: Lösung aus dem letzten Projekt heraussuchen, überfliegen und Änderungen vornehmen. Entsprechend meinem Vorsatz, künftig solche Bausteine zu bereinigen und zu bearbeiten, sie dann anschließend als Baustein im Webworker-Archiv zu hinterlegen, habe ich eine Extrastunde investiert und das Skript überarbeitet. Alle Editierleichen mussten raus und der Code wurde auskommentiert. Nachfolgender Code ist das Ergebnis.

Das Thema taucht laufend in den Foren auf. Gefragt wird nach Konzept, Struktur und geeigneten formmailer-Skripten.

Nachfolgendes Skript wird in diejenige Seite eingebaut, in der das Kontaktformular erscheinen soll. Es verweist auf sich selbst, verarbeitet dort auch die übergebenen Daten und gibt Fehlermeldungen aus. Das Formular wird wiederholt, und im Falle eines Errors die fehlerhaften Daten voreingetragen. Vom Konzept her entspricht es den üblichen Empfehlungen auf entsprechende Foren-Fragen.

Das Skript ist bereits längere Zeit in mehreren Projekten im Einsatz. Es kann beliebig abgeändert und natürlich frei verwendet werden kann.


##### Ziel-email-Adresse, unbedingt ändern ######
$mailto = "irgendwer@irgendwas.de"; // ÄNDERN


##### Allgemeine Variablen vorbereiten
$formactionziel= $_SERVER["PHPSELF"];
$zeit=strftime("%c", time());
$mail_text="Anfrage vom $zeit \n \n";
$betreff= "Anfrage";
$from="From: Kontaktformular@".$_SERVER['SERVER_NAME'];
$meldung="";


######### Die HTML-Ausgabe beginnt
// es beginnt der gesamte HTML-Abschnitt, in welchem Formular und oder Meldungen erscheinen
echo "<div style='margin-left:2cm; font-family:Arial; font-size:10pt'>";

########## Abschnitt 1 ##########
// folgt ein Abschnitt, der nur greift, wenn bereits Daten übersandt wurden; die Daten werden verarbeitet, um sie entweder zur Speicherung oder, bei Fehlern im erneut aufzurufenden Formular voreinzutragen.

if (isset($_POST["submit"])) {

// übergebene Variablen ermitteln:
$felder="absendername strasse plz ort tel absenderemail anmerkung";
$felder=explode(" ", $felder);
unset($errors);
foreach($felder as $tmp) {

if(trim(stripslashes($_POST[$tmp]))=="asdf") $errors[]="$tmp = asdf? Was soll das!?";
// kleines Gimmick für den Fall, dass jemand rumspielt und asdf eingibt

$$tmp=trim(stripslashes($_POST[$tmp]));
}


// Sicherheits-Überprüfung der Daten aus Übervorsicht,
// eigentlich nicht nötig, sofern $mailto oben fest definiert ist

if ($mailto != "" and !preg_match("/^[^@]+@.+\.\D{2,5}$/", $mailto)) {
$errors[] = "die E-Mail-Adresse sieht nicht richtig aus<br />";
$absenderemail="!!??!!";
}

// Pflichtfelder checken ----------------------------------------------------------- evtl. ÄNDERN -----------------
// soweit eine der folgenden Felder KEIN Pflichtfeld ist, muss man
// die entsprechende Zeile löschen oder auskommentieren

if(empty($ort)) $errors[]="Ort fehlt<br />";
if(empty($plz)) $errors[]="Postleitzahl fehlt<br />";
if(empty($strasse)) $errors[]="Straße fehlt<br />";
if(empty($tel)) $errors[]="Telefonnummer fehlt<br />";
if(trim($anmerkung)=="asdf") $errors[]="Hast Du nichts Besseres zu tun?";


// Wenn keine Fehler da sind, kann die Post abgehen.
if (empty($errors)) {
$mail_text="
Anfrage
-------
Name: $absendername
Strasse: $strasse
Ort: $plz $ort
Telefon: $tel
Email: $absenderemail
Nachricht:
$anmerkung ";
// keine HTML-Zeilenumbrüche; die hier notierten Zeilenumbrüche erscheinen 1:1 im email-Text

// Refererdaten vorbereiten, um sie der email-Nachricht hinzufügen zu können
$referer=$_SERVER["HTTP_REFERER"];
$IP=$_SERVER['REMOTE_ADDR'];
$remotehost=$_SERVER['REMOTE_HOST'];

$refererdaten="
http_referer: $referer
IP=$IP
remote_host=$remotehost
";

// referer-Daten an den email-Text anhängen

$mail_text.="
--------------
Protokollierung interner Daten für Kontrollzwecke:
$refererdaten
";

// mail versenden
if (@mail($mailto, $betreff, $mail_text, $from)) {
$sent = true;
}else {
$errors[] = "keine Verbindung zum Mailserver - bitte nochmal versuchen<br />";
}

}
}

// Bestätigungsanzeige für den User

if($sent===true) {
echo "<p style='color:green; font-size:13pt'><b>Danke!</b><br />Nachricht erfolgreich versandt.</p>";

// hier könnte man auch abbrechen und link zurück auf die eigene Seite mit dem blanken Formula setzen,
// anderenfalls muss man zunächst die Formularinhalte wie folgt löschen
foreach($felder as $tmp) {
$$tmp="";
}
// Ende des Löschens der Formularinhalte
}

echo "Neue Nachricht: <br /><hr><br />";

###### Ende Abschnitt 1 ############

###### Abschnitt 2 #############
// Dieser Abschnitt schließt am Abschnitt 1 an, und greift nur, wenn dort ein Fehler bemerkt wurde
// sie bereitet im Falle einer Fehlermeldung die Fehlerhinweise vor
// und bereitet die übersandten Daten auf, um sie im Formula voreinzutragen

if (empty($sent)) {
if(isset($errors)) {
echo "<p>Hoppla. Fehler aufgetreten:</p><ul>";
foreach($errors as $f) {
echo "<li>".$f."</li>";
}
echo "</ul><br /><br />";

$action=$_SERVER["PHP_SELF"];

// folgendes wird in ähnlichen Skripten gern übersehen; wenn in Eingabefeldern ein Apostroph war, wurde das beim Übersenden mit slashes maskiert, und diese Slashes würden im Eingabefeld erscheinen. Diese müssen entfernt werden. Beim erfolgreichen Speichern in eine Datenbank dagegen übernimmt das php-Programm die Entfernung automatisch, so dass obige Routine nur notwendig ist, wenn die Variablen auf der Webseite wiedergegeben werden müssen

$absendername=htmlentities(stripslashes($absendername));
$absenderemail=htmlentities(stripslashes($absenderemail));
$strasse=htmlentities(stripslashes($strasse));
$anmerkung= htmlentities(stripslashes($anmerkung));
$ort=htmlentities(stripslashes($ort));


} // ende errors
}
####### Ende Abschnitt 2 ########

####### Abschnitt 3 #############
// ab hier der normale Content dieser Seite, der beim Erstaufruf erscheint, der Content besteht
// aus dem Formular, evtl. mit voreingetragenen Daten im Falle einer misslungenen Absendung
echo "
<form action='$formactionziel' method='post'>
<INPUT TYPE='TEXT' NAME='absendername' value='$absendername' SIZE='42'> Name, Vorname<br />
<INPUT TYPE='TEXT' NAME='strasse' value='$strasse' SIZE='42'> Straße und Hausnr.<br />
<INPUT TYPE='TEXT' NAME='plz' value='$plz' SIZE='6'> PLZ<br />
<INPUT TYPE='TEXT' NAME='ort' value='$ort' SIZE='42'> Ort<br />
<INPUT TYPE='TEXT' NAME='tel' value='$tel' SIZE='42'> Telefon<br />
<INPUT TYPE='TEXT' NAME='absenderemail' value='$absenderemail' SIZE='40'> E-Mail (optional)<br /><br />
Nachricht:<br />
<textarea name='anmerkung' cols='40' rows='10'>$anmerkung</textarea><br />
<br />
<INPUT TYPE='SUBMIT' name='submit' VALUE='Absenden'>
</form>
<br />
</div>";

Dienstag, 5. Februar 2008

Von Hyperlinks, Trackbacks und Meinungsbildung - Verweise in der Online-Literatur

Kapitel 1) Worum geht es?

1.1) Gegenstand dieser Untersuchung ist die Frage, wie man bei Aufsätzen, die im Web veröffentlicht werden, auf andere Onlineliteratur verweisen kann oder soll.

Die Verweistechnik ist in der gedruckten Fachliteratur, also im Printbereich, von jeher eine übliche Technik. Die Verwendung von Hyperlinks in HTML-Seiten ist dieser Verweistechnik ähnlich, wenn sie auch bisher mehr dazu verwendet wird, pauschal auf andere interessante Seiten zu verweisen. Das Trackback-System in den Blogs stellt ebenfalls Instrument zur Verfügung, das in faszinierender Weise dem klassischen System ähnelt. Und in Wikipedia ufert die Verweistechnik über Hyperlinks, die im Text eingestreut sind, extrem aus.

Die Entwicklung gibt Anlass, sich generell Gedanken über Querverweise auf Webseiten zu machen. Hier liegt noch viel Potential, denn die heutige Meinungsbildung wird mittlerweile stark durch private Seitenbetreiber im Web bewirkt .

Mit den Verweisen in den Schulen hat der Aufsatz nichts zu tun. Einige Leser können sich also beruhigt zurücklehnen.

1.2) Zu den hier verwendeten Begriffen

Unter Verweise (auch „Fundstellen“ oder „Nachweise“) verstehe ich dabei Hinweise auf online veröffentlichte Aufsätze, Artikel, Beiträge, Forenbeiträge, Informationen oder sonstige Texte, in denen etwas bestimmtes gesagt wird.

Für diese Texte benutze ich hier die Bezeichnung “ Onlineliteratur“. Damit meine ich also nicht nur veröffentlichte Bücher, sondern alle möglichen Texte, sofern sie nur einigermaßen zitierbar sind. Typische Beispiele

  • Angabe von Fundstellen für Aussagen anderer oder für Zitate

  • Angabe von Fundstellen für Aufsätze, in denen vergleichbare Meinungen vorkommen

  • Angabe von Fundstellen für Definitionen und Erklärungen (Beispiel Wikipedia)

1.3) Vorgehensweise

Zu klären sind folgende Fragen:

  • Auf welche Art kann ich auf andere Aufsätze verweisen

  • Wie publiziere ich Aufsätze, damit Verweise auf bestimmte Stellen im Aufsatz möglich sind.


Kapitel 2) Mögliche Arten der Verweisung

2.1) Vergleich zum Printbereich

Die in gedruckten Büchern überlicherweise verwendeten Methoden sind:

a) Fußnoten: hochgestellte Ziffern an den betreffenden Textstellen und zugehörige Fußnoten, die sich entweder am Ende einer Seite oder am Ende des Kapitels oder Aufsatzes befinden.

b) Klammer-Verweise, bei denen die Verweise mitten im Text in Klammern eingeschoben sind.

Das Fußnotensystem ist bei Monografien und Zeitschriftenaufsätzen verbreitet.

Klammer-Verweise findet man typischerweise in Gerichtsurteilen und den meisten Handbüchern und Kommentaren. Die Technik der Klammer-Verweise macht den Text oft schwer leserlich, was aber mit anderen Aspekten abzuwägen ist.

2.2) Wie kann ich Verweise in einer Webseite einbauen?

2.2.1) Fußnoten

Für Internetuser sind Fußnoten auf Webseiten ungewohnt, z.T. gar nicht verständlich, da unbekannt.

Fußnoten stoßen in Webseiten aber auch auf technische Probleme. Dieses System setzt eine feste Seite voraus, an deren unterem Ende die Fußnoten aufgelistet sind. Ein HTML-Dokument ist aber ein durchgehendes Dokument ohne Seitenmaße, sozusagen eine beliebig lange Schriftrolle, die noch dazu in der Seite verbreitert werden kann.

Fußnoten bieten sich also nur an, wenn Artikel auf mehrere HTML-Seiten verteilt ist. Dann könnte man unter dem Text die Fußnoten einfügen.

Möglich ist auch Verlinkung durch seiteninterne Anker. An der betreffenden Textstelle wird entweder eine Ziffer, noch besser ein kleines Textschnipsel eingefügt (Fußnote 1), dieser ist verlinkt mit der zugehörigen Fußnoten am Textende. Technisch wird dies realisiert durch einen Anker, der Hyperlink verweist also nicht auf eine andere Seite, sondern auf eine Stelle innerhalb derselben Seite.

Aber selbst das dürfte für die meisten Leser ungewohnt sein. Zum einen müssten sich die Leser überhaupt erst an das Fußnotensystem gewöhnen ("Fußnote 1" sagt vielen auch noch nichts). Zum anderen kommen auch heute noch viele User nicht mit den seiteninternen Verlinkungen klar. Manche verstehen es nicht, andere kennen das Prinzip, merken aber nicht, wenn sie innerhalb der Seite gesprungen sind (dazu gehöre auch ich).

Ein weiteres Problem bei verlinkten Fußnoten ist der Rücksprung. Der Leser merkte nicht, wie weit er mit dem Link nach unten gesprungen ist. Er muss zurückscrollen und die ursprüngliche Textstelle suchen.

Eine reverse Verlinkung der Fußnoten ist denkbar, aber ebenfalls ungewohnt, und umständlich zu realisieren.

2.2.2 ) Verweise

Klammerverweise im Fließtext sind am einfachsten und dürften aus meiner Sicht für Webseiten empfehlenswert sein.

Zwar sind sie gelegentlich schwer lesbar, aber da keine Platznot wie im Printbereich herrscht, können Zitate und/oder Fundstellen formatiert werden, z.B. durch Leerzeilen und Einrückung.

Beispiel:



Eine Verschlüsselung von Daten mit höchster Wichtigkeit ist erst bei einer Verschlüsselung ab dem dritten Grad sinnvoll

vergleiche "Aspekte der Kryptografie" von Gustav Ganz
http://www.gustav-ganz.de/aufsaetze/kryptografie.html

Dazu sind folgende Schritte notwendig ....



Kapitel 3) Verweisziele

3.1) Unbrauchbar sind Verweise auf eine domain als solche, also auf die Webpräsenz insgesamt. Pauschal verweisende Hyperlinks sind zwar im Web üblich, aber immer seltener. Die zunehmende Informationsflut zwingt dazu, die Verweise etwas genauer zu setzen.

Traditionell üblich und auch für Onlineliteratur empfehlenswert ist ein eingegrenzter Verweis auf den konkreten Abschnitt oder ein bestimmtes Kapitel. Denkbar sind:

3.1.1) bei kleinen Aufsätzen ein pauschaler Verweis auf die entsprechende HTML-Seite

3.1.2) bei zerlegten Aufsätzen, die auf mehrere HTML-Seiten verteilt ist, dürfte der pauschale Verweis auf die Seite ebenfalls kein Problem sein.

3.1.3) bei größeren Aufsätzen ergeben sich mehrere Ansätze:

a) Seitenanker, auf die verwiesen werden kann (seiteninterne Hyperlinks)

b) Gliederung des Textes mit Verweis auf Kapitel bzw. Abschnittnummer.


(z.B. auf "Kapitel 4", oder auf "Abschnitt IV", oder " Kapitel vierzehn", oder einfach " IV", oder, wie versuchsweise hier: "1.2.2.")


c) Verwendung von Randnummern, wie sie oft auch in der Fachliteratur verwendet wird

3.2) Zu den Seitenankern

Diese sind unsichtbar für den Leser. Der Leser muss auch nichts davon merken, der Anker sorgt nur dafür, dass ein Dritter von außen auf diese Stelle linken kann, und der Browser genau an diese Stelle hüpft. Die oben genannten Probleme für seiteninterne Links gelten hier nicht, denn es geht nicht um die Frage, ob man mit Ziffern auf die am Seitenrand stehenden Fußnoten linken soll, wobei bei den Fußnoten erst der Verweis auf einen anderen Aufsatz steht.

Hier geht es vielmehr darum, wie ein Schreibender die Stellen markieren kann, damit ein Dritter auf einen bestimmten Abschnitt verweisen oder linken kann.

Allerdings bleibt das Problem, wie Dritte solche Anker erkennen können.

3.3). Zu der Kapitelnummerierung

Diese habe ich testweise hier versucht. Nicht ausreichend ist dabei eine Quelltextformatierung mit H1, H2 usw. Notwendig ist ein lesbarer Gliederungspunkt.

Ein interessanter Aspekt dabei ist, dass die Formatierung mit H1 etc. aus Gründen der Barrierearmut oder Barrierefreiheit erwünscht ist, zumindest optimal wäre. Sehbehinderte, die sich über Hilfsmittel am Quelltext orientieren, erhalten hier wertvolle Informationen über die Gliederung einer Seite. Allerdings fällt meines Erachtens dieser Aspekt weg, wenn die Gliederung sowieso im Text selbst erscheint.

Ein zusätzlicher Vorteil der Kapitelnummerierung ist, dass der Text auch auf eine andere Seite übertragen werden kann. Ob man trotzdem zusätzlich einen Anker beim entsprechenden Kapitel einbaut, ist Geschmackssache.

3.4). Zur Verwendung von Randnummern.

Diese werden in Büchern unabhängig von einer zusätzlichen Gliederung am Seitenrand fortlaufend durch den ganzen Text hindurch notiert, und zwar immer am Seitenrand NEBEN dem Text.

Diese vom Autor willkürlich gesetzten Randnummern kennzeichnen aufeinander folgende Gedanken oder Aspekte, unabhängig davon, ob sie sich innerhalb eines Absatzes befinden oder sich erst alle paar Absätze wiederholen. Hintergedanke ist dabei die Zitierbarkeit mit genauer Zielangabe.

Der Verweis des Dritten auf diese Textstelle sieht dann etwa so aus:


vgl. Siegfired Smoerebroet, "Kryptografie im email-Verkehr", Randnummer 24 www.bertram-boedecker.de/kryptografie.html


Solche Randnummern lassen sich aber bei HTML-Texten nur umständlich realisieren. Man müsste mit relativer oder absoluter Positionierung arbeiten.

3.5) Eine weitere Möglichkeit wäre eine Einbindung als PDF-Datei. Dort gibt es feste Seiten mit Seitenumbrüchen, idR auf DIN-A 4 abgestimmt. Dann ist der übliche Verweis auf die konkrete Seite möglich.

Zur Technik: Der teuere Original Adobe Acrobat Writer ist nicht notwendig; es genügt ein normaler Text, auch aus Word oder OpenOffice-Dateien.

OpenOffice, eigentlich "OpenOffice.org"



vgl. http://de.wikipedia.org/wiki/OpenOffice

ferner: http://www.user-archiv.de/openoffice.html



kann Texte ohne Umweg direkt als PDF speichern (Exportieren). Text aus MS-WORD-Dateien kann mit FreePDF oder anderen Freewaremethoden in PDF umgewandelt werden.

Ein in HTML-Form liegender Text, den man z.B. schon früher in einer Webseite verwendet hat, kann durch eine ganz simple Methode auf OpenOffice übertragen werden. Es genügt ein Markieren auf der Browseroberfläche (nicht im Quelltext!), Kopieren und Einfügen. Herrlich ist dabei der Effekt, dass die Formatierungen (Fettschrift, Einrückung etc) mitgenommen werden. Dann das Ganze abspeichern im PDF-Format (Exportieren)

Kapitel 4) Allgemeine Gedanken zu Verweisen

4.1) Meines Erachtens sollte es auch im Web üblich sein, die Namen der Autoren zu nennen, auch wenn man dies im Web nicht allzu oft erlebt. Dies war auch eines der Grundprinzipien des User-Archivs beim Einstellen von Fundstellen in das Linkarchiv. Wir haben es deshalb nie als Linkarchiv, sondern als Literaturarchiv bezeichnet. Der link führte auch nie pauschal auf eine Webpräsenz, sondern auf einen bestimmten Beitrag, der mit Titel und Autor bezeichnet wurde. Dass wird dabei nach Möglichkeit auch den Autor nannten (er hat ein eigenes Feld in der Datenbank) ist nach meiner Auffassung eine Sache des Respekts und der Achtung. Schade ist es immer, wenn wir hervorragende Aufsätze finden, die mit einem Nickname oder Kürzel unterzeichnet sind.

4.2) Weiter denke ich, dass sich die zusätzliche Angabe der URL (Webadresse) empfiehlt, auch wenn sie sicherlich nicht notwendig ist.

Auch dies war eine Überlegung bei der Ausgestaltung des User-Archivs. Wir haben deshalb im Laufe der Jahre die generierten Linklisten so umgestellt, dass sowohl der Titel, als auch die komplette Webadresse erscheint. Sollte die Liste versehentlich als Plaintext abgespeichert worden sein, ist sie immer noch hilfreich.

4.3) Meines Erachtens . ist es auch sinnvoll, die URL selbst , und nicht nur den Titel zu verlinken. Die Umwandlung in einen Link kann dann bei PHP-basierten Systemen automatisch durch das Skirpt erfolgen, etwa bei der Speicherung oder später bei der Auswertung.

4.4) Es ist überlegenswert und wünschenswert, von den in Mode kommenden englischen Abkürzungen wegzugehen und die klassischen, schon jeher verwendeten Abkürzungen zu verwenden. Diese sind außerhalb von Fachaufsätzen oder der wissenschaftlichen Literatur zwar nicht sehr bekannt, aber schnell eingeführt und leichter zu merken. Beispiele:

  • IMHO (in my honest opinion) = m.E. (meines Erachtens)

  • e.g. = z.B. (zum Beispiel)

Dass die englischen Ausdrücke verwendet werden, kann man niemand vorwerfen. Die Ausdrücke werden von IT-Profis in der englischen Literatur gelesen und verständlicherweise übernommen. Schließlich besteht ein Bedarf danach. Das Ganze hätte sich wahrscheinlich nicht so entwickelt, wenn die in der Fachliteratur traditionellen Abkürzungen allgemein bekannter gewesen wäre. Dann hätte man viel einfacher hierauf zurückgreifen können.

Nun, das lässt sich nachholen ;-) Und zum Cool-Sein reichts auch, schließlich ist Wissen und Bildung wieder in.

4.5). Weitere üblichen Abkürzungen bei Verweisen in der traditionellen Fachliteratur

  • vgl = vergleiche (entspricht "siehe")
  • mwN = mit weiteren Nachweisen (dort findet man weitere Fundstellen bzw. Verweise)

  • für viele = nur ein Verweis auf einen beispielhaft herausgesuchten Artikel mit dem Hinweis, dass es hierfür viele andere Fundstellen gibt, in denen dasselbe behauptet wird

4.6) Eine Übernahme weiterer Wendungen (gleichgültig, ob abgekürzt oder nicht) aus der wissenschaftlichen Literatur wäre auch in gewöhnlichen Diskussionen oder Aufsätzen zu stritten Themen wünschenswert, wahrscheinlich aber schwer durchsetzbar.

str = streitig; auch:"umstritten"

h.M. = herrschende Meinung

ü.M. = überwiegende Meinung

a.A. = anderer Ansicht

Beispiel:

nach h.M. ist CSS bisher nicht dafür gedacht und vom Ansatz her nicht sonderlich geeignet, für Spaltenlayout zu sorgen. Trotzdem setzt sich das CSS-basierte Spaltenlayout immer mehr durch. Dies ist meines Erachtens auch sinnvoll, da es der Barriefreiheit dient (streitig; so wie hier: Alfons, www.alfons.de/barrierefrei.html, Betram, www.bertram.de/webdesign/csslayouts.html; a.A. Dora (www.dora.de/tabellen-vs-css.html m.w.N)

Als "Wünschenswert" habe ich dies bezeichnet, weil mittlerweile in vielen Web-Bereichen eine Meinungsbildung stattfindet, die im Grunde der wissenschafltichen Arbeit gleichsteht. Und zwar geht es nicht um Meinungen allgemein, sondern um die Entscheidung für bestimmte Techniken und Vorgehensweisen.

Dazu ist ein ständiger Austausch von Meinungen und Argumenten notwendig, immer mit dem Effekt, dass sich im Laufe der Zeit sinnvolle Lösungen ergeben, sich die "besseren" Argumente durchsetzen. Dies sollte allerdings möglichst schnell erfolgen, damit z.B. nicht noch mehr Webmaster an den Tücken von CSS-basierten Seitenlayout-Konzepte verzweifeln.

"Wahrscheinlich undurchsetzbar" habe ich dies genannt, weil dieser Verhaltenskodex viel Disziplin, Selbstüberprüfung, und fortgeschrittene Toleranz gegenüber anderen Meinungen kostet. Tolerenz, die man auch im wissenschafltichen bei Beginn des Studiums lernen muss.

Der Hinweis auf andere Ansichten, und das Heraussuchen von Fundstellen für das, was man in Erinnerung zu haben glaubt, zwingt aber die an einer Meinungsbildung Beteiligten zu einer fundierten Begründung, hilft anderen, sich an dieser Meinungsbildung fundiert zu beteiligen und bewirkt, dass während des gesamten Diskussionsprozesses schneller die Übersicht über Vor- und Nachteile bzw. Argumente und Gegenargumente entsteht, somit auch sich vorteilhaftere Meinungen früher herauskristallisieren.

Dies ist in wissenschaftlicher Literatur von jeher ein Muss und jemand, der sich an der wissenschaftlichen Meinungsbildung beteiligen will, ohne die Fundstellen und auch Gegenansichten zu erörtern, wird nicht sonderlich ernst genommen - bwz. deren Artikeln in Fachzeitschriften nur ungern veröffentlicht.


Nachtrag: Ein Aufsatz, auf den ich gerade gestoßen bin, zeigt sehr schön die Zitierweisen und die hier geschilderten Aspekte.


Urheberrechte bei Internetseiten, Michael Fülling
http://www.webwork-community.net/posting2550_33_0.html

Sonntag, 3. Februar 2008

Validierung von Formulardaten

Eine Aufgabe, die sich dem Webworker früher oder später stellt ist die Überprüfung von Formulareingaben, die der User sendet

a) wegen fehlender Eingaben, unlogischer Eingaben und offensichtlich fehlerhaften Eingaben (Buchstaben im Postleitzahlenfeld)

b) aus Gründen der Sicherheit

c) wegen SPAM-Schutz

Hier eine Hilfestellung für diejenigen, die sich das erste mal mit diesem Problem beschäftigen:

Merke: Grundsätzlich keine Überprüfung von Formulardaten durch Javascript oder AJAX ( so genannte "client-seitige Validierung"), auch nicht, wenn es nur eine Validierung der Gruppe a) geht. Gründe:

  • Javascript könnte deaktiviert sein, so dass sowieso eine Überprüfung durch das empfangende PHP-Skript notwendig ist. Ferner muss das empfangende PHP-Skript sowieso eine Sicherheitsvalidierung durchführen. Eventuelle Mehrbelastung des SERVERS bzw. des verarbeitenden Skripts kann vernachlässigt werden, ebenso die theoretische Zeitverzögerung beim Feedback.
  • Sofern es um Sicherheit geht, wird jeder Hacker das Javascript deaktivieren, so dass Javascript als Schutz völlig wertlos ist.
  • SPAM-Schutz ebenfalls sinnlos.
  • Da AJAX auf Javascript basiert, scheidet AJAX logischerweise ebenfalls aus.

Lösung: Überprüfung durch das empfangende PHP-Skript (so genannte server-seitige Validierung, weil die Überprüfung erst nach Empfang auf dem eigenen Server mittels PHP-Skript erfolgt.

  • Das Skript sorgt bei Fehlern für einen Wiederaufruf des HTML-Formulars, dies so oft, bis die Eingaben korrekt sind. Erst dann werden die Daten in vorgesehener Weise weiter verarbeitet. Diese Kombination von von Überprüfung und Neugenerierung des Formulars nennt man auch "Affenformular".

  • Bei dem Wiederaufruf des Formulars (denkbar wäre auch eine eigene Seite mit dem gleichen Formular) werden üblicherweise die übersandten Daten in den Feldern voreingetragen. Ferner wird man einen deutlichen Hinweis auf die Fehler in die Seite einbauen.
Die Funktionsweise des "Affenformular" ist in WIKIPEDIA etwas ausführlicher beschrieben, was allerdings bei der technischen Umsetzung nur ansatzweise Hilfen gibt: http://de.wikipedia.org/wiki/Affenformular

Eine ausführliche und empfehlenswerte Anleitung für die technische Realisierung gibt das Kapitel 27.2 in der FAQ der PHP-Newsgroup de.comp.lang.php "Von HTML zu PHP: Schreibe Formularverarbeitungen in Normalform": http://www.php-faq.de/q/q-stil-normalform.html
Zu dem Thema sind weitere Anleitungen im Netz erhältlich; das Problem ist relativ gut dokumentiert. Anfragen oder Suche in Foren sind wenig sinnvoll.

Was die Sicherheitsprüfung betrifft, empfiehlt sich als erstes die Lektüre des Kapitels "12. Sicheres Programmieren in PHP" http://www.php-faq.de/ch/ch-security.html
ferner das Kapitel über HTML-Formulare: http://www.php-faq.de/ch/ch-webvariablen.html

Die Suche nach weiteren Lösungen ist etwas schwieriger, da entsprechende Anleitungen in der Datenflut untergehen. Vor der Google-Suche kann man die Suche im User-Archiv (www.user-archiv.de) starten, da dort entsprechende Links handverlesen sind.

Was den SPAM betrifft, werden verschiedene Lösungen diskutiert. Das Spamming hat tatsächliche einige Seitenbetreiber dazu gebracht, ihre HTML-Formulare z.B. für Kommentare oder Linkvorschläge völlig zu streichen. Als Suchbegriffe für die Websuche empfehle ich "Spam", "Kommentar-Spam", "Trackback-Spam"

Folgende Ansätze werden häufig verwendet:

  1. Es wird eine Grafik eingeblendet, die Buchstaben und Zahlen enthält, die der User in einem zusätzlichen Feld eingibt (Stichwort "Captchas")
  2. Es werden typische bzw. bekannte SPAM-Absender-Adressen durch entsprechende Einträge in der htaccess-Datei oder im Verarbeitungsskript abgewehrt (Stichwort IP-Blocker)

Ein etwas gründlicherer Aufsatz über Abwehrmaßnahmen findet man auf testticker.de. Es handelt sich um einen Aufsatz von Achim Wagenkecht, erschienen in der Zeitschrift aus Internet Professionell Ausgabe 6/2006: "Know-how: Kommentar-Spam verhindern Weblog ohne Spam"
http://www.testticker.de/praxis/security/article20060514002.aspx

Captchas, zufallsgenerierte Zeichenfolgen, die schwer lesbar sind und deshalb von Maschinen nicht einfach ausgelesen werden können, sind umstritten, weil die Roboter immer intelligenter werden. Sie sind außerdem nicht barrierefrei: Die üblichen Hilfsmittel für Sehbehinderte können diese Barriere nicht überwinden.
Siehe zu Captchas auch: http://de.wikipedia.org/wiki/Captcha. Bei der Google-Suche sollte man den Begriff captchas verwenden.

Interessant für Webseitenbetreiber ist, dass es Skripte oder Codesnippets für die automatische Generierung von solchen Zufallsgrafiken gibt. Häufig wird das PHP-Skript CaptchaImageMaker genannt, das kostenlos herunter geladen werden kann. Hier die Anlaufstelle:
http://notepad.emaillink.de/2007/09/18/captchaimagemaker-schuetzt-vor-spam/

Eine Suche in den zahlreichen Skriptarchiven (statt über Google) nach Code-Snippets ist empfehlenswert. Auflistung von Skriptarchiven:
http://www.user-archiv.de/skript-archive.html

Einer von vielen Aufsätzen, hier auf "Dr. Web": Sichere Formulare - Teil 3: Pseudo-grafisches CAPTCHA mit PHP
http://www.drweb.de/webmaster/sichere-formulare-captcha.shtml

Eine weitere interessante Variante ist die Verwendung eines Schein-Feldes:

Ein zusätzliches Feld im Formular, das über CSS (display:none) ausgeblendet wird. Der normale User sieht dieses Feld nicht und weil es deshalb nicht ausgefüllt ist, wird es inhaltslos versandt. Im Falle eines Spamversuches liest ein Programm den Quelltext und das HTML-Feld aus und füllt zur Sicherheit auch dieses Feld mit aus. Der anschließende validierende Code bemerkt, dass diese Feld befüllt ist und bricht ab (gefunden über einen Hinweis von R. Hupfauf, http://www.hupfauf.net/)