strip_tags, addslashes, stripslashes, htmlspecialchars? argh!

mailworm

Grünschnabel
hallo ihr,

langsam bin ich am verzweifeln und hoffe ihr könnt' mir helfen. ich weiß, es gibt seiten wie diese und php.net aber ich kann mir aus den einzelnen infos nichts für mein problem zusammenreimen.

es geht um die verarbeitung, anzeige und ausgabe von eingaben in formularen.

ich möchte ein formular haben, in dessen felder man nur a-z, 0-9, ä, ö, ü, ß, punkt, komma, doppelpunkt, slash, !, ?, (, ) und ' eingeben kann. html-tags sollen nicht erlaubt sein.

wenn die eingabe andere zeichen enthält, dann soll das formular wieder angezeigt werden. wenn die eingabe in ordnung ist, dann sollen die daten mit sql in einer datenbank gespeichert werden und zur bestätigung "normal" (nicht in einem formular) ausgegeben werden.

an welchen stellen muß ich welche betreffs genannten funktionen benutzen, damit die eingabe
1. den eigentlichen quelltext nicht zerstört
2. es beim speichern in der datenbank keinen fehler gibt
3. bei der anzeige der eingabe, ob im formular oder "normal" kein \ vor sonderzeichen angezeigt wird?

sorry, vielleicht ist das ganze sehr einfach und ich sehe einfach den wald vor lauter bäumen nicht.

vielen lieben dank vorab!

thomas
 
Generell konvertierst Du eingehende Formular-Variablen mit stripslashes().

Wenn Du danach den HTML-Code herausfiltern möctest, dann verwende strip_tags. Möchtest Du allerding den HTML-Code als solchen nicht ausführbar machen, dann verwende htmlentities.

Solltest Du doch irgendwann einmal HTML-Code zulassen, dann wende für die Anzeige des HTML-Codes in einem Formular-Textfeld / Textarea generell htmlentities auf den String an, der in den Value-Tag bzw. zwischen die Textarea-Tags geschrieben wird.

Um Strings sicher in der (MySql-)Datenbank zu speichern, wendest Du auf Strings die Funktion mysql_escape_string an und auf Ganzzahlen intval.

P.S.: Satzanfänge und Nomen (Substantive) werden groß geschrieben!

snuu
 
Danke, aber noch eine Frage

Vielen Dank für die schnelle Antwort! Eine Frage habe ich aber noch. Sind Formulare, die derartig aufgebaut sind in der Hinsicht sicher, als das niemand Schindluder damit treiben kann?

Also z.B. andere, als die von mir angedachten Daten aus der Datenbank auszulesen oder bei Emailformularen eine Email an jemand anderes als den von mir angedachten Empfänger zu versenden?

Danke nochmals vorab!

Thomas
 
Grundsätzlich sind alle an das Script übergebenen Variablen als unsicher anzusehen und sollten daher vor der Verwendung geprüft werden.

Wenn Du zum Beispiel ein HTML-Textfeld mit einer Zeichenbeschränkung von 20 Zeichen definierst, dann gibt es mehrere Möglichkeiten auch mehr als 20 Zeichen zu übermitteln.

Je nachdem, wie Du programmiert hast, entstehen mehr oder weniger sicherheitsrelevanter Lücken, die unter bestimmten Bedingungen Dinge bewirken können, mit denen Du sicherlich nicht gerechnet hast.

mfg, snuu
 
Wie sicher ich das Skript ab?

Sowas in der Art dachte ich mir schon. Was die Länge der Eingaben betrifft, kann ich ja strlen verwenden. Mir gehts insbesondere darum, sicherzustellen, dass niemand Daten ziehen kann, die nicht für jeden Besucher sichtbar sein sollen, bzw. mein Emailformular nicht zum "anonymen Mailen" benutzen kann..

Würde eine Überprüfung mit eregi reichen, die alles ablehnt, was Gefahr birgt? Und welche Zeichen lassen vermuten, dass es sich um eine Manipulation handelt, um an mehr als die von mir gewünschten Daten zu kommen?

Vielen Dank

Thomas
 
So pauschal lässt sich das nicht sagen.

Variablen in SQL-Anweisungen sollten mit mysql_escape_string, intval und doubleval abgesichert werden.

Alle Variablen sollten vor ihrer Verwendung initialisiert werden.

Niemals variable Dateien ohne Absicherung includen lassen.

Includedateien ausserhalb des zugänglichen Web-Verzeichnisses speichern oder durch eine .htaccess-Datei schützen.

usw.

Ob nun jemand an eine andere Mailadresse als Deine vorgegebene senden kann, kann ich hier und jetzt nicht sagen, weil ich Deinen Code nicht kenne.

snuu
 
Original geschrieben von snuu

Alle Variablen sollten vor ihrer Verwendung initialisiert werden.

Niemals variable Dateien ohne Absicherung includen lassen.

Includedateien ausserhalb des zugänglichen Web-Verzeichnisses speichern oder durch eine .htaccess-Datei schützen.

ich habe variablen bisher immer erst an der stelle im code aufgerufen, wo ich sie zuerst benötigte/ mit einem wert versah.

wie meinst du das mit den variablen dateien ohne absicherung? ich habe eine functions.php, die ich auf fast allen seiten verwende. in ihr stecken funktionen, die z.b. inhalte ausgeben, die auf allen seiten gleich sind.

wenn ich so eine includedatei in ein mit .htaccess geschütztes verzeichnis stecke, kommt dann nicht bei jedem includen die frage nach user und pass für das entsprechende verzeichnis?

lol.. deine tipps sind wirklich hilfreich (ehrlich!) und klären die einen fragen, werfen aber gleichzeitig neue auf :-).. es ist nicht so, dass ich noch nie nix mit php und sql zu tun hatte, nur habe ich mir bisher keine großen gedanken um die sicherheit meiner formularskripte gemacht..

bye thomas
 
wie meinst du das mit den variablen dateien ohne absicherung? ich habe eine functions.php, die ich auf fast allen seiten verwende. in ihr stecken funktionen, die z.b. inhalte ausgeben, die auf allen seiten gleich sind.
Verwende niemals include($variable);! Nutze stattdessen eine Switch-Anweisung, die in Abhängigkeit einer Variable eine bestimmte Datei includet. Oder Du legst einen Pfad fest, aus nur dem die Dateien includet werden können. Dennoch muss sichergestellt werden, dass man aus dem Pfad nicht ausbrechen kann (zum Beispiel durch die Verwendung von "../").

wenn ich so eine includedatei in ein mit .htaccess geschütztes verzeichnis stecke, kommt dann nicht bei jedem includen die frage nach user und pass für das entsprechende verzeichnis?
Nein, da PHP die Datei über das Filesystem includet.

-->
P.S.: Satzanfänge und Nomen (Substantive) werden groß geschrieben!


snuu
 
Original geschrieben von snuu
Verwende niemals include($variable);!

D.h. sicher und OK ist

include("functions.php");

während

$file = "functions.php";
include($file);

nie angewendet werden sollte.. Und wenn die include-file abhängig von einer Variablen ist, dann nur über den switch-weg lösen..

1000-Dank und sorry w/ der kleinschreibung, tippt sich flinker :-)

bye Thomas
 
Zurück