Einfache Idee zur Umsetzung Gumbo's Sicherheitsfokus's: Validieren, Filtern ...

c-bob

Grünschnabel
Bezüglich Gumbo's Tut zur Sicherheit von Usereingaben mittels Formularen, hab ich mir mal eine kleine Funktion geschrieben, welche in die entsprechenden PHP-Dateien zu Anfang includiert wird.
Dabei werden verschiedene Sicherheitsrelevante Umschreibungen der übergebenen Daten gemacht, welche hoffentlich im Großen und Ganzen recht viele Angriffsversuche abwehren sollten.
Die relevanten Zeilen sind dann allerdings noch an die eigenen Bedürfnisse anzupassen, da ja u.U. Zeilenumbrüche etc. gewünscht sind.

Nachdem das Script dann abgearbeitet wurde, sind die übergebenen Variablen dann als globale Variablen zu nutzen.

Hier mal der Code:
PHP:
function secure_formdata($formdata){
	$formdata=strip_tags($formdata);
	$formdata=htmlspecialchars($formdata,ENT_QUOTES,"UTF-8");
	$formdata=str_replace(array("\r", "\n","--"), '', $formdata); 
	$formdata=addcslashes($formdata, '%_=*?;');
return $formdata;
}

// Anstelle von einfachen "extracts"
//extract($HTTP_GET_VARS);
//extract($HTTP_POST_VARS);

foreach ($HTTP_POST_VARS as $key => $value){
	$$key=secure_formdata(strval($value));
}

foreach ($HTTP_GET_VARS as $key => $value){
	$$key=secure_formdata(strval($value));
}

Falls ich ein paar schwerwiegende oder auch einfache Dinge übersehen hab, bzw. falsch interpretiert hab, dann lasst es mich bitte wissen, bin ja auch erst am Anfang der Erfahrungskonglomeration angelangt ;-)

Gruß
-C-
 
Was passiert wenn $_POST ein multidimensionales Array enthält?
Was passiert wenn du einen längeren Text benutzt, der auch Zeilenumbrüche enthalten darf?

Außerdem finde ich es recht umständlich, die Variablen einfach so im globalen Raum "herumfliegen" zu lassen...
Da finde ich das $_POST Array schöner.

Für deine foreach Schleife gibt es übrigens noch eine schönere Lösung:

PHP:
array_walk($_POST, 'secure_formdata');
array_walk($_GET, 'secure_formdata');

Um das ganze sogar noch rekursiv zu erhalten, könntest du auch [phpf]array_walk_recursive[/phpf] verwenden.
 
Das Problem ist, dass es keinen allgemeingültigen Filter gibt. Jede Sprache hat seine eigenen Metazeichen und braucht deswegen ihren eigenen Filter. Denn andernfalls werden womöglich unnötig Daten verändert.

Außerdem finde ich es recht umständlich, die Variablen einfach so im globalen Raum "herumfliegen" zu lassen...
Das ist vor allem gefährlich, da so sämtliche Variablen verändert werden können.
 
Was passiert wenn $_POST ein multidimensionales Array enthält?

Hm, hab ich mir noch keinen Kopf gemacht, da das bei mir nicht nötig war. Was machste denn, wenn ein multidim. Array ankommt bzw. wie sieht das im $_POST aus?

Was passiert wenn du einen längeren Text benutzt, der auch Zeilenumbrüche enthalten darf?

Da hast Du schon recht, aber deshalb hab ich ja geschrieben, dass man sich die Funktion an die eigenen Bedürfnisse recht schnell anpassen kann. Man kann ja auch die Funktion secure_formdata aufsplitten und einzeln aufrufen. Die foreach(..) sind dabei ja auch nicht zwingend erforderlich, nur ich fand des nicht schlecht, da ich halt noch auf dem Level bin, bei dem man gerne mit globalen Variablen umgeht ;) - jaja, ich weiss, aber ich kann ja auch nur einen Schritt nach dem anderen machen.

Außerdem finde ich es recht umständlich, die Variablen einfach so im globalen Raum "herumfliegen" zu lassen...
Da finde ich das $_POST Array schöner.

s.o.
Aber dann musste ja trotzdem eine Art Validierung/Filterung machen.
Wie nutzt Du dann eigentlich $_POST "schöner"?

Für deine foreach Schleife gibt es übrigens noch eine schönere Lösung:

PHP:
array_walk($_POST, 'secure_formdata');
array_walk($_GET, 'secure_formdata');

Um das ganze sogar noch rekursiv zu erhalten, könntest du auch [phpf]array_walk_recursive[/phpf] verwenden.

Nicht schlecht, wieder was gelernt :)

Das Problem ist, dass es keinen allgemeingültigen Filter gibt. Jede Sprache hat seine eigenen Metazeichen und braucht deswegen ihren eigenen Filter. Denn andernfalls werden womöglich unnötig Daten verändert.

Das ist mir schon klar. Es war ja nur ein Denkanstoss, da man ja beim str_replace recht schnell entsprechende Ergänzungen machen kann.

Das ist vor allem gefährlich, da so sämtliche Variablen verändert werden können.

Ja, aber wenn ich die quasi nachdem sie übermittelt wurden überprüfe und dann nur noch innerhalb dieses Aufrufes verwende, dann kann doch niemand mehr die Variablen verändern?!
Oder wie meinst Du das? Kannst vielleicht mal ein kleines Beispiel geben?
 
Ein einfaches Beispiel wäre der Aufruf folgender URL: /?_SESSION[user_id]=1. Damit wird (wenn mehrdimensionale Arrays verarbeitet werden) $_SESSION['user_id'] = 1 gesetzt.
 
Ein einfaches Beispiel wäre der Aufruf folgender URL: /?_SESSION[user_id]=1. Damit wird (wenn mehrdimensionale Arrays verarbeitet werden) $_SESSION['user_id'] = 1 gesetzt.

Okay, das ist eindeutig! Dazu muss aber zumindest der Name der Sessionvariablen bekannt sein. Bei privaten Seiten also sicherlich kein Problem, wenn der Quellcode aber mal veröffenlticht wird, ist das sicherlich ein großes Problem.
Wäre also erstens entweder ein Verzicht auf das pauschale Auslesen der $HTTP_POST/GET_VARS eine Lösung bzw. nur die Verwendung der explizit erwünschten Variablen aus $_POST/GET eine andere?
 
Zuletzt bearbeitet:
Es gibt register_globals, das so etwas ähnliches zulässt und deswegen zum Glück mit PHP 6 wieder verschwindet. Bereits existierende Variablen werden dabei allerdings nicht überschrieben.
 
Zurück