PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Schutz für meine Formulare


McOerk
13.09.2004, 23:49:29
Hallo zusammen,

hat einer einen Tip wie ich folgendes Problem ausmerzen könnte?

Wenn ich ein normales Formular erstelle, sieht ja jeder im Quelltext sämtliche Input-Namen und auch das Zielskript.
Nun kann er jetzt einfach das Formular klonen und von seiner Seite auf meine Seiten zugreifen.

Mir wäre es aber lieber, wenn die Formularauswertung nur Daten übernimmt, die auch von meiner Seite kommen.

Ich hatte als erstes gedacht es mit $HTTP_REFFERER zu lösen, allerdings könnte dann niemand mehr meine Seite besuchen der dies blockt.

Danke für die Hilfe!
Gruß
McÖrk

xabbuh
13.09.2004, 23:58:26
Das ganze mit dem REFERER zu lösen, ist wirklich keine gute Idee, da dieser fast nach Belieben vom User manipuliert werden kann.
Die wohl simpelste Möglichkeit ist die Verwendung von Sessions (http://tut.php-q.net/sessions.html). Auf der Seite, von der aus die Verarbeitung aufgerufen wird, setzt du in einer Session eine bestimmte Variable. In der Verarbeitung überprüfst du dann, ob diese Variable so in der Session vorhanden ist. Wenn nicht, weißt du, dass das Script von einer anderen Seite abgeschickt wurde.

feuervogel
14.09.2004, 11:12:31
warum überprüfst du nicht beim laden des formulars ob es von deiner domain geladen wird?

McOerk
14.09.2004, 12:21:41
Original geschrieben von feuervogel
warum überprüfst du nicht beim laden des formulars ob es von deiner domain geladen wird?

Ich dachte das wäre die Lösung mit einem Referer, oder gibt es da noch was anderes.

@xabbuh
Danke für den Tipp.
Dann müsste ich halt also die Auswertung auf einer extra Seite vornehmen, bisher hatte ich sie immer auf derselben Seite wie das Formular.

xabbuh
14.09.2004, 13:02:12
Original geschrieben von McOerk

Dann müsste ich halt also die Auswertung auf einer extra Seite vornehmen, bisher hatte ich sie immer auf derselben Seite wie das Formular.
Dann kannst du die Auswertung doch trotzdem auf der gleichen Seite vornehmen. Die Sessionvariable darf eben nur gesetzt werden, wenn das Formular aufgerufen wird und nicht wenn es abgeschickt wird. Aber das lässt sich ja ganz einfach mit einer if-Abfrage lösen.

feuervogel
14.09.2004, 13:02:54
> Ich dachte das wäre die Lösung mit einem Referer, oder gibt es da noch was anderes.

beim referer schaust du auf der seite die beim form als action angegeben ist, woher das form abgeschickt wurde.

du kannst aber sicher einfach feststellen von welchem host das form geladen wird. dies geschieht auf der seite, auf der das form steht.

das ist der unterschied.

hier ein nützlicher link:

http://www.php.net/manual/de/reserved.variables.php#reserved.variables.server

Gweilo
14.09.2004, 13:14:31
Original geschrieben von feuervogel
du kannst aber sicher einfach feststellen von welchem host das form geladen wird. dies geschieht auf der seite, auf der das form steht.

Was soll das bringen? Deswegen kann man ja trotzdem noch ein POST an den server mit gefälschtem referrer senden. Oder übersehe ich da etwas?

feuervogel
14.09.2004, 13:53:24
argh, stimmt...

hm, dann bringts nur max 1 mal von der gleichen ip in einer minute oder wie oft das formular abschicken zu können...

Gweilo
14.09.2004, 14:14:03
Das mit den Sessions sollte grundsätzlich funktionieren.

aber können eigentlich Sessions gefälscht werden? Soweit ich weiss, werden Sessions auf dem Server gespeichert, und können somit nicht direkt manipuliert werden, oder?

feuervogel
14.09.2004, 14:20:00
doch, wenn ein session-keks beim besucher der seite abgelegt wird, kann man diesen löschen. entweder manuell oder durch das schließen des browser-fensters (wenn er nicht länger am leben gelassen wird). so lassen sich zwar nicht die daten beeinflussen (weil ja serverseitig), aber wenn er weg ist, ist man praktisch ein unbeschriebenes blatt für den server.

xabbuh
14.09.2004, 14:23:33
Original geschrieben von feuervogel
doch, wenn ein session-keks beim besucher der seite abgelegt wird, kann man diesen löschen. entweder manuell oder durch das schließen des browser-fensters (wenn er nicht länger am leben gelassen wird). so lassen sich zwar nicht die daten beeinflussen (weil ja serverseitig), aber wenn er weg ist, ist man praktisch ein unbeschriebenes blatt für den server.
Stimmt schon, hat aber auf das Beispiel, um das es McOerk geht keinen Einfluss ;-)

McOerk
15.09.2004, 00:24:24
:)
Ich werde es jetzt mit der Variable machen!

Ich werde sowieso nicht verstehen warum es Leuten Spaß macht solche Sicherheitslücken auszunützen, um der Seite oder dem Server zu schaden.

Den Großteil der Zeit muss man wirklich auf Affenroutinen verwenden, damit niemand die Formulare missbraucht um deine Datenbanken vollzumüllen.

yozek
15.09.2004, 23:26:19
Also, ich würde an deiner Stelle folgendermassen vorgehen:

Du nimmst ein Hiddenfield und setzt dort eine verschluesselte Variable ein.

Bsp: die aktuelle Zeit + 5 Minuten mit einem geheimen schluessel.

Nun wird das Formular übermittelt und du vergleichst in deimen Script den Hiddenfieldeintrag.

Wenn du denn schluessel kennst, kannst du auch problemlos wieder zurueckentschluesseln.

Wenn die Ausgabe des dekodierten Schluessels nicht stimmt, dann wird das Formular nicht verarbeitet.


Dies geht mit der PHP Klasse EnDe [1] sehr einfach und schnell:


//Verschluesseln
$ende = new EnDe('daß$tR3nGgE!me2004');
$crypted = $ende->encrypt(time());

//ENtschluesseln
$ende = new EnDe('daß$tR3nGgE!me2004');
$crypted = base64_decode($_POST['check']);
$crypted = $ende->decrypt($crypted);

if ($cyrpted < time() - 1800):
die('FEHLER');
endif;


HTH


[1]
Die Klasse EnDe (http://www.phpclasses.org/browse/package/1658.html)

Gweilo
16.09.2004, 11:47:12
das nützt leider nichts, da der user diesen verschlüsselten code auch kennt (er kann ja schliesslich den quellcode anschauen) und mitsenden kann.

Domi
16.09.2004, 17:30:40
bist du dir sicher das er den quellcode von der verschlüsselung sieht?? Er sieht ja nicht die ganze PHP Datei. Un trotzdem kannst du das verschlüsselte mit übergeben und testen.

GreeTz Domi

Gweilo
16.09.2004, 17:41:04
nein, den quellcode der verschlüsselung sieht er nicht, braucht er aber auch nicht zu sehen. er sieht das produkt der verschlüsselung, nämlich im hidden-feld. Dieses sendet er einfach mit und hat eine gültige verschlüsselte variable.

yozek
17.09.2004, 18:22:42
Die ja aber nur begrenzt gültig ist.

Ansonsten mach doch mit Captcha [1]. Dann kannst du sicher sein, dass der Benutzer Mensch die Eingabe vornimmt und nicht ein automatisiertes Programm ...

[1] Captcha Klasse für PHP (http://phpclasses.php-start.de/browse/package/1569.html)

Gweilo
17.09.2004, 18:54:42
nützt genauso wenig. Das Formular kann dann zwar nicht massenweise abgesandt werden, aber trotzdem die send-values gefälscht/manipuliert werden.

In den normalfällen reicht der code im hidden-feld völlig aus, aber ein beispiel wäre ein Online-Spiel (wird client-seitig ausgeführt), das dem Server den Highscore zusendet. Nun die Frage: Wie überliefert man dem Server den wert, ohne dass er manipuliert werden kann? Habe mir lange den Kopf darüber zerbrochen, aber keine lösung gefunden.

Usul
17.09.2004, 20:03:37
Nun die Frage: Wie überliefert man dem Server den wert, ohne dass er manipuliert werden kann? Habe mir lange den Kopf darüber zerbrochen, aber keine lösung gefunden. [/B]

Vielleicht indem das Spiel auf Clientseite den Wert verschluesselt und der Server ihn dann wieder entschluesselt. So muss ein Cheater zumindest erstmal in den Quellcode nach der Verschluesselungsmethode schauen, wenn er herausfinden will, wie man einen Highscore von einer Millionen verschluesseln muss.

Gweilo
17.09.2004, 20:14:05
naja. zu einfach zu knacken - einfach variable ersetzen vor dem verschlüsseln, und schauen was dabei rauskommt.

Sessions sind auch nicht wirklich sicher, weil die ja (wahrscheinlich) leicht auch von programmen benutzt werden können.

Ist das überhaupt möglich ganz sicher zu machen? Wie machen Online Casino's das? Java Applets und Flash können dekompiliert werden, also ist sämtlicher code verfügbar.

Nicht, dass ich das persönlich bräuchte, aber würde mich einfach interessieren.

Usul
18.09.2004, 00:12:54
Wie machen Online Casino's das?

Na da wird wohl alles serverseitig geregelt und gespeichert, der user wird wohl nur die Ergebnisse dargestellt bekommen.