Seite 1 von 1

Formulare: Sicherheit? Allgemeiner Umgang? Tips?

Verfasst: 24.04.2012 11:38
von Wuppi
Hi

bevor man von einem Formular aus etwas in eine DB schreibt bzw. damit abfragen lässt, sollte man entsprechend dafür sorgen das der Eintrag auch nix böses enthält. Soweit klar.

Wie sicher sind den generell so Formulare? Ich arbeite an einem größeren Suchformular (METHOD=POST) - mit Checkboxen, Radiobuttons, Eingabefelder, Dropdowns.

Die Eingabefelder muss ich auf jedenfall auf gültige Eingabe prüfen (es sind nur zahlen erlaubt) bevor es in/an die DB geht. Klar.
Wie sieht es mit Checkboxen, Radiobuttons, Dropdowns aus?

Ich habe z. B. eine Feld mit Radiobuttons:
Raucher: ja, nein, gelegentlich
Value: ja, nein, gelegentlich
Das Datenbankfeld heißt userOption123 - taucht im Formular natürlich NICHT auf. Im Datenbankfeld steht aber: ja, nein, gelegentlich als möglicher Wert.

Ich hatte mal ein Formular im Web gefunden das ich Lokal abspeichern konnte. Bei "ACTION" die komplette URL reingetippert. Bissel was geändert, aufgerufen, erfolgreich abgeschickt. Ich werde mein Suchformular in ein wBB :( einbetten ... das wird ja sicher den referer/session prüfen (Formular ist nur als Registrierter User nutzbar). Somit sollte diese Lücke ja weg sein - aber das kann man sicher auch umgehen.

Wäre es daher somit besser als Value lieber "zahlen" zu nehmen, statt der orginal DB-Einträge?
1= ja
2= nein
3= gelegentlich
das per SWITCH CASE wieder auseinanderbröseln? (nur wie geht das mit checkboxen mit mehreren Werte?)

Dachte bei meiner ursprünglichen Variante eher an die Performance ;) ... wüsste aber jetzt nicht was daran unsicher wäre, es doch mit ja/nein etc. zu machen? Müsste den vorher nur prüfen lassen.

Das Formular ist ein Suchformular. Eine DB wird hier abgefragt und die Suchoptionen soll in einer anderen DB abgespeichert werden.

Gruß

Re: Formulare: Sicherheit? Allgemeiner Umgang? Tips?

Verfasst: 24.04.2012 13:20
von WileCoyote
Wuppi hat geschrieben:Ich werde mein Suchformular in ein wBB :( einbetten ... das wird ja sicher den referer/session prüfen (Formular ist nur als Registrierter User nutzbar). Somit sollte diese Lücke ja weg sein - aber das kann man sicher auch umgehen.
Wenn du eine Lösung für wBB anstrebst, solltest du all deine Fragen eher im wBB Support-Forum stellen. Das Forum hier ist ein Support-Forum für die Foren-Software phpBB.

Re: Formulare: Sicherheit? Allgemeiner Umgang? Tips?

Verfasst: 24.04.2012 14:19
von Pyramide
Ausnahmslos alle Daten, die über den Request reinkommen (egal ob Eingabefeld, Dropdown, Checkbox, Cookie, ...), sind als unsicher zu betrachten und entweder entsprechend zu escapen oder über ein mapping (wie dein ja=1,nein=2 Beispiel) auf gültige Werte abzubilden. Eine einfache Manipulation der übertragenen Werte ist bereits mit Tools wie Firebug oder die in neueren IE-Versionen eingebauten Entwicklertools möglich. Ansonsten kann man auch einfach komplett unter Umgehung des Browsers Requests mit beliebigen Inhalten erzeugen.

Idealerweise sollte man darüber hinaus noch weiter Prüfungen einbauen, z.B. ein Schutz gegen Cross-Site Request Forgery (XSRF).

Re: Formulare: Sicherheit? Allgemeiner Umgang? Tips?

Verfasst: 24.04.2012 15:18
von Wuppi
WileCoyote hat geschrieben:
Wuppi hat geschrieben:Ich werde mein Suchformular in ein wBB :( einbetten ... das wird ja sicher den referer/session prüfen (Formular ist nur als Registrierter User nutzbar). Somit sollte diese Lücke ja weg sein - aber das kann man sicher auch umgehen.
Wenn du eine Lösung für wBB anstrebst, solltest du all deine Fragen eher im wBB Support-Forum stellen. Das Forum hier ist ein Support-Forum für die Foren-Software phpBB.
genau wg. solcher Aussagen mag ich das wBB-Support-Forum nicht. Spricht man dort als ein "noch"-Lite-User ne Frage aus wo man evtl. auf ein 3er rauskommt, gibts nur solche Kommentare "falsches Forum", "Mein Konto - da dein 3er eintragen" usw. Ich habs da noch nicht einmal geschafft auf irgendwas eine vernünftige Antwort zu bekommen (das wBB genutzt wird, war leider nicht meine Entscheidung ...) ... Hier heißt es auch "Coding & Technik" - hier fragen genug Leute sachen die NIX mit phpBB zu tun haben (und das mit dem wBB war nur ne Randanmerkung, den letztendlich hat dieser Thread NIX mit wBB, phpBB usw. zu tun sondern mit mySQL/php/html). In nem phpBB-Unterforum hätte ich deinen Kommentar verstanden ;)
------------------------------------------------------------------------------------------------


Und wg. Antworten wie von Pyramide mag ich dieses Forum!
Danke!
Also nichts glauben was an das Script geschickt wird ;)

Nur an welcher Stelle escaped (usw.) man?

Code: Alles auswählen

if (isset($_REQUEST['status'])) { // status = array (status[]) von ner Checkbox-Abfrage
	$status = $_REQUEST['status']; 
	$sqlBzStatus = "userOption90 IN("; // teil des hierfür relevanten SQL-Strings
	for ($i=0; $i<count($status); $i++) // ich muss das Array separieren damit ich in einer spalte mehrere sachen suchen kann ( IN() )
		{
			$sqlBezStatus .= "'" . $status[$i] . "'";
			if ($i<count($status)-1)
				{ $sqlBzStatus .=","; } // SQL => setzt Kommas in: IN('schoen','toll','katastrophe')
		} 
	$sqlBzStatus .=")";
	$sqlString[]= $sqlBzStatus; // $sqlString[] ist das Array wo alle Such-Schnippsel reinkommen.
} 
Wo würde ich also Escapen? Ich würde jetzt Spontan die 2. Zeile sagen: $status = irgendeineEscapeFunktion($_REQUEST['status']); ... geht das bei nem array gut?

Von dieser Art hab ich paar Abfragen ...
Kürzer gehts bei den Radios: da frag ich direkt ab was in $_REQUEST steht - wenn da "ja" drin steht, such ich in der DB nach sämtlichen zahlen größer 1 (es stehen nicht nur zahlen drin und 0)

Code: Alles auswählen

if (isset($_REQUEST['ki'])) { 
	// JA
	if ($_REQUEST['ki'] == "ja") {
		$sqlString[] = "userOption69 != '0'";
	} else { ......}
}
wo hier? Soll ich das $_REQUEST gleich am Anfang in eine andere variable schicken? $blabla = escapeFunktion($_REQUEST['blabla']);

Vielen Dank!

Re: Formulare: Sicherheit? Allgemeiner Umgang? Tips?

Verfasst: 24.04.2012 16:06
von gn#36
Im Prinzip ist egal wann du die Gültigkeitsprüfung machst. Ich würde sie immer direkt als erstes durchführen, dann steht sie immer an der selben Stelle und man vergisst sie nicht so schnell. Das escapen von Strings für die Eintragung in die Datenbank würde ich unmittelbar vor dem Eintragen in die Datenbank durchführen da man ja recht häufig vorher noch die Strings ändert. Hierbei sollte man die Daten so restriktiv wie möglich betrachten (d.h. z.B. wenn ein Geburtsdatum der Form "TT.MM.YYYY" einzugeben war ist das Ergebnis zwar ein String, ein "a" ist aber trotzdem ein verbotenes Zeichen) und lieber mit Whitelists als mit Blacklists arbeiten (zweitere kann man möglicherweise umgehen).

Wenn möglich sollte man mit prepared Statements arbeiten, dann werden die Daten nicht "manuell" in die SQL Abfrage eingefügt sondern separat übergeben und die Chance einer SQL Injection ist quasi null (abgesehen von Sicherheitslücken in der Datenbanksoftware selbst). Hier muss man dann nur noch auf die Anzeige der Daten achten, die ja vermutlich früher oder später passiert ([php:htmlentities] z.B.)

In meinen Augen bringt es aber nichts, den Wert, den du in die Datenbank einträgst künstlich zu verschleiern. Wenn du ein Mapping durchführst (was auf jeden Fall sinnvoll ist), dann würde ich persönlich das Mapping auch direkt im Formular als übergebenen Wert verwenden. Zum einen ist dann die Überprüfung einfacher und schneller (integer in einem bestimmten Wertebereich statt einer Auswahl verschiedene Strings), zum anderen ist es bei der Übertragung in die DB weniger Arbeit.

Wenn du tatsächlich mal einen begrenzten Bereich an Strings hast, die gültig sind kannst du das zeit- und platzsparend mittels eines Arrays mit allen gültigen Werten und der Funktion [php:in_array] prüfen.

Re: Formulare: Sicherheit? Allgemeiner Umgang? Tips?

Verfasst: 29.04.2012 18:23
von Wuppi
Hi

kann man ARRAYS nicht escapen?

Checkbox mit 5 Optionen speichert in test[].

Jetzt lese ich mit
$_REQUEST['test'] ein

Code: Alles auswählen

$test= mysql_real_escape_string($_REQUEST['test']);

schmeißt mir ne Fehlermeldung raus

Habe dann das gefunden:

Code: Alles auswählen

$test= array_map('mysql_real_escape_string', $_REQUEST['test']);
Tut das? Werde da nicht recht schlau aus array_map.

Gruß

Re: Formulare: Sicherheit? Allgemeiner Umgang? Tips?

Verfasst: 29.04.2012 20:49
von gn#36
Ja, [php:array_map] führt eine Funktion auf jedem Array Element aus.