2k Aufrufe
Gefragt in Skripte(PHP,ASP,Perl...) von
Hallo,

ich möchte meine PHP-Anwendung möglichst sicher gestalten, vor allem bei Formularen, die ausgefüllt werden müssen und z.B. Filtern für die Anzeige von Tabelleneinträgen.

Momentan mache ich es so, dass ich bei Formularen natürlich vor dem Speichern in der DB Strings escape, Zahlen auf ihren Typ prüfe etc.

Wie ist das hier bei z.B. Dropdown-Menüs....die können doch auch manipuliert werden, so dass ich hier den Typ oder gegen eine Whitelist prüfen müsste oder?
Und wie mache ich z.B. Abfragen, die über einen Filter (Daten werden dann per GET übergeben) eingeschränkt werden, reichen hier auch oben genannte Mechanismen aus?

Und nochmal zurück zu Formularen...ich habe so halb im Gedächtnis dass man hier auch noch prüfen sollte, woher die Anfrage kommt? Die kommt doch immer vom User?
Was sollte ich noch berücksichtigen?

Vielen Dank schon mal.

4 Antworten

0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
Die Absicherung sollte immer so restriktiv wie möglich sein (also alle unbekannten Übergaben verwerfen), wobei der Inhalt dann möglichst freizügig behandelt werden sollte (nicht vorschreiben, ab wann eine E-Mail-Adresse als richtig gilt und ab wann nicht).

Ersteres geht supereinfach:
<?php

// Definition aller gültigen Parameter
$aParam= ( 'vorname', 'nachname', 'alter', 'plz', 'email', 'geschlecht' );

// nur die definierten Parameter übernehmen, Rest verwerfen
$aInput= array();
foreach( $_REQUEST as $k=> $v ) if( isset( $aParam[$k] ) ) $aInput[$k]= $v;

// Beispiel: Zahlen erzwingen
$aInput['plz']= (int)$aInput['plz'];

// Beispiel: Wert in Feld vorhanden
$aGeschlecht= array( 'Mann', 'Frau', 'Ding' );
if( !in_array( $aInput['geschlecht'], $aGeschlecht ) ) unset( $aInput['geschlecht'] );

...

?>


Und "woher" die Abfrage kommt? Na immer vom Benutzer - woher denn sonst? Falls du den REFERER meinst: der ist bei einigen Leuten abgeschaltet.
0 Punkte
Beantwortet von
OK also wenn ich das richtig verstanden habe, reicht es aus, wenn ich wirklich nur die Eingabewerte überprüfe, richtig? Das heißt wenn ich sicherstelle, dass z.b. bei einer DB-Abfrage mittels einer ID dem SQL-Befehl wirklich nur eine Zahl übergeben wird etc...

Noch zwei generelle Fragen: du hast in der foreach-Schleife die Variable $_REQUEST verwendet, wäre es hier nicht sinnvoller, nur über $_GET oder $_POST zu laufen?
Und noch eine Frage zu deinem Programmierstil: du hast vor den Variablen Buchstaben (a steht vermutlich für array), gibt es hierfür einen Standard? würde mich mal interessieren, denn das macht den Umgang in großen Skripten mit sicherheit übersichtlicher
0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
"Nur die Eingabewerte überprüfen" - ja, das ist das ganze Geheimnis. Sie gut zu prüfen ist die Kunst. Das ist bei Zahlen (wie du gesehen hast) das einfachste. Bei Text wird es schwieriger - hier muss man vor allem bedenken, wo der dann gespeichert wird und entsprechend kritische Zeichen umwandeln oder gar entfernen.

$_REQUEST vereint POST und GET - es ist also egal, ob die Parameter mit in der URL stehen oder nicht. Auch POST-Anfragen können simuliert werden - das ist also nichts "sichereres" als GET.

Die Buchstaben vor den Variablen sind von mir persönlich gewählt, es ist eine Art Mischform aus der ungarischen Noration und der Reddick-Namenskonvention, die in dieser eher falschen Interpretation auch in der Win32-API anzutreffen ist. Mir reicht jedoch ein Buchstabe völlig, den ich auch nur für den Typen brauche, nicht für den Sinn oder die Herkunft:

a = Array
b = Boolean
c = Char
d = Unsigned Integer (DWord)
e = Element
f = Float
h = Handle
i = Signed Integer
k = Key
l = List
n = Node
o = Object
p = Pointer
r = Rect
s = String
t = Time
v = Value
w = Widestring
0 Punkte
Beantwortet von
Danke für die Links, die werde ich mir gleich mal ansehen!
...