You are not logged in.

wcf.regNote.message

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

1

Friday, May 15th 2009, 5:44pm

Wie erreicht man ein Höchstmaß an Sicherheit beim Arbeiten mit Daten aus Formularen?

Es gibt da zahlreiche Informationen im Netz und darunter natürlich auch massig Blödsinn. Da ich aber auf keinen Fall möchte, dass mal irgendwer schafft irgendwelchen Blödsinn auf meinem Server zu veranstalten versuch ich grade irgend einen Sicherheitsmechanismus zu erarbeiten welcher Daten aus Formularen sicher in die Datenbank packt und auch wieder raus ohne das auf diesem Weg was schief gehn kann. Hier mal ein Beispiel.

Bei einem Gästebuch gibts die Formularfelder Name, Emailadresse, Webadresse und eine Textarea für den Gästebucheintrag. Das Formular wird an die PHP Datei guestbook.php geschickt und dort verarbeitet. Die reinen Formularfelder würde ich erst mal mit $feld = $_REQUEST['feld']; in Empfang nehmen. Danach dann $feld = striptags($feld); und $feld = addslashes($feld);. Bei der Textarea genau so und diese dann mit den Formularfeldern in die Datenbank. Bei der Ausgabe in einem HTML Gerüst kann man ja mit nl2br die Textarea wieder korrekt ausgeben lassen und natürlich vorher mit stripslashes($feld); die Escapes entfernen. Nur wie sieht es hier aus mit Ausbrüchen aus der Textarea? Oder sonstigen Vorgehensweisen um z.B. JS Code auszuführen oder sonst irgend einen Mist? Genügt das was ich da mache wirklich oder gibt es noch weitere Dinge die man tun sollte? Sollte ich z.B. jeden Feldinhalt oder Textareainhalt auf Dinge wie "JavaScript" oder sonstige Wortlaute prüfen und diese noch mal gesondert behandeln? Oder wie einige im Netz meinen den Inhalt aller Felder und Areas grundsätzlich in Hex umwandeln? Man kann natürlich alles übertreiben aber ich möchte auf keinen Fall zu wenig machen.

Wenn jemand Lust und Zeit hat kann ich auch gerne mal einen Teil aus dem betreffenden Projekt als Quellcode zeigen. Möchte ich nur im Moment hier nicht offen falls ich ein Sicherheitsloch hab und dann der nächst beste gleich zur Tat schreitet und mir das ganze Ding auf links dreht.
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

Opi62

Trainee

Posts: 91

Location: 127.0.0.1

  • Send private message

2

Sunday, July 12th 2009, 11:07pm

Also ich weiß nciht ob ich das jetzt richtig verstanden habe aberich meine das $_REQUEST angefangen werden kann und wirde von jemand fremden bearbeitet.

Quoted

PHP.net

Hinweis
: Die Variablen in $_REQUEST werden dem Skript mittels der GET-, POST- und COOKIE-Inputmechanismen zur Verfügung gestellt. Daher kann der Inhalt durch einen entfernten Benutzer modifiziert worden sein und ist daher als nicht vertrauenswürdig zu betrachten. Das Vorhandensein und die Reihenfolge des Variableninhalts in diesem Array wird entsprechend der PHP-Konfigurationsdirektive variables_order bestimmt.
Und ich muss datzu sagen ich Bevorzuge da Lieber die Variable $_POST.

Um gesendedt daten zu überprüfen. Wäre meine idee das du dir so ne art zeitstämpel baust der die zeit vom absenden des Formulares bis zur ankunft an das gewünschte script berrechnet.
Sollte dieser wert Z.b unterschiedlich sein könnte mann eine if abfrage einbauen die Dann das senden der Daten Unterbindedt.

Sonnte würde mir noch mysql_escape_string einfallen

Quoted

PHP.NET

Hinweis: Die Zeichen % und _ werden von mysql_escape_string() nicht maskiert. Diese Funktion ist identisch zur Funktion mysql_real_escape_string() ausgenommen, dass mysql_real_escape_string() eine Verbindungs-Kennung benötigt und den String entsprechend zum aktuellen Zeichensatz maskiert. Der Funktion mysql_escape_string() kann keine Verbindungs-Kennung übergeben werden und der aktuelle Zeichensatz wird nicht berücksichtigt.

Ich hoffe ich konnte ein bischen Helfen aber Fals ich fals liegen sollte Berichtigt mich ruhig.

Gruß Opi62

http://sozialgc.com
Das leben hat ne Geile Grafik,
nur das Gameplay ist Beschissen

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

3

Monday, July 13th 2009, 8:17am

Du hast vollkommen recht. Die Variablen welche man mit $_REQUEST in Empfang nimmt können manipuliert sein. Allerdings nicht dadurch, dass jemand den Datenstrom zwischen Formular und PHP Skript unterbricht und da was macht. Jemand kann direkt im Formular schon entsprechende Codes einfügen und so div. Dinge erreichen. Wenn man also in einem Formularfeld oder Textarea gewissen Code einfügt wird dieser unweigerlich zum Server übertragen. Erst hier kann man den Inhalt der einzelnen Eingaben prüfen und ggf. verhindern, dass jemand was anstellt. Es nützt also auch nichts mit einem Zeitstempel zu arbeiten da das reine Senden des Formulars ja genau so passiert wie bei normaler Nutzung. Ich habe inzwischen noch einige Dinge getan um das Ausbrechen aus dem Formular zu verhindern und auch um meine DB zu schützen und alles. Ob es genügt weiß ich nicht aber ich gehe mal ganz davon aus.
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

Opi62

Trainee

Posts: 91

Location: 127.0.0.1

  • Send private message

4

Tuesday, July 14th 2009, 2:36pm

tut mir leid du sagt du hast schon eineige dinge gehtan.
Was für dinge gieb mir doch mal ein bischen vom quellcode.
Denn ich sage mal so ich kann dir ein bischen schlecht helfen wenn ich nicht ganz genau weiß was du bis jetzt dagegen tuhst.

Ich würde dir ja gern mehr tipps geben so weit wie ich es weiß und ich sag mal so googole ist eigendlich mein freund^^.
Wenn du mir genau sagt so du denkst das was unsicher ist stell doch bitte das stück wo du fehler vermutest rein.

Denn ich glaube n icht das jemand hier aus dem board deine projeckt hacken würde..

LG Opi

http://sozialgc.com
Das leben hat ne Geile Grafik,
nur das Gameplay ist Beschissen

european

Beginner

Posts: 10

  • Send private message

5

Thursday, July 16th 2009, 12:24pm

Jedesmal, wenn ich mit Formular eingaben arbeite, überprüfe ich, ob die Eingabe das erwünschte Muster erfüllt. Also z.B. ob beim Namen nur Buchstaben verwendet wurden etc. Außerdem entschärfe ich alle ' und "
Wenn ich diese Daten an eine DB verschicke, überprüfe ich, ob folgende eingaben nicht vorhanden sind: DROP, SELECT, javascript etc...also alle angaben, die ggf irgendwas anrichten könnten, sollten diese vorhanden sein, so wird ein Fehler ausgegeben.

Joa sonst hab ich mir nur noch eine kleine Funktion gebastelt mit den üblichen befehlen, wie mysql_escape_string() etc.

Opi62

Trainee

Posts: 91

Location: 127.0.0.1

  • Send private message

6

Thursday, July 16th 2009, 2:37pm

Jedesmal, wenn ich mit Formular eingaben arbeite, überprüfe ich, ob die Eingabe das erwünschte Muster erfüllt. Also z.B. ob beim Namen nur Buchstaben verwendet wurden etc. Außerdem entschärfe ich alle ' und "
Wenn ich diese Daten an eine DB verschicke, überprüfe ich, ob folgende eingaben nicht vorhanden sind: DROP, SELECT, javascript etc...also alle angaben, die ggf irgendwas anrichten könnten, sollten diese vorhanden sein, so wird ein Fehler ausgegeben.

Joa sonst hab ich mir nur noch eine kleine Funktion gebastelt mit den üblichen befehlen, wie mysql_escape_string() etc.

Ich finde das eigendlich ne gute idee so Wie du es geschrieben hast.

Aber ich glaube da gab es noch was was mann machen konnte.

Ich muss mal nachgoogeln villeicht finde ich es ja nochmal dann Poste ich es Hier auch mal noch mit rein.

Gruß Opi

http://sozialgc.com
Das leben hat ne Geile Grafik,
nur das Gameplay ist Beschissen

european

Beginner

Posts: 10

  • Send private message

7

Thursday, July 16th 2009, 3:19pm

Man kann natürlich noch unsichtbare Felder einbauen, und sobald sie ein Bot ausfüllen sollte wird ein fehler ausgegeben, außerdem wäre noch das Speichern der IP möglich, dass der nächste sender eine neue IP haben muss, oder man könnte noch Cookies bzw Sessions benutzen.

Da gibts noch einige möglichkeiten ;)

Opi62

Trainee

Posts: 91

Location: 127.0.0.1

  • Send private message

8

Thursday, July 16th 2009, 4:58pm

Ich bin ja der meinung unsichtbare felder Bringen eigendlich nix da der inhalt doch so oder ausgelesen werden kann.
Mit cookie und session bin Ich Einverstanden.
Villeicht könnte mann auch so ne art Verschalt seite machen mit einem captcha Code, oder mann baut ihn direct in Das formular ein.
Und um es dem Bot ein bischen Schwerer zu Machen villeicht auch als Runder captcha Code.
Gruß Opi

http://sozialgc.com
Das leben hat ne Geile Grafik,
nur das Gameplay ist Beschissen

european

Beginner

Posts: 10

  • Send private message

9

Thursday, July 16th 2009, 8:18pm

Ich bin ja der meinung unsichtbare felder Bringen eigendlich nix da der inhalt doch so oder ausgelesen werden kann.

Unsichtbare Felder bringen nur was, wenn du sich richtig benennst ;)
Wenn du ein Feld z.B. email oder name nennst, gehen die meisten Bot's darauf an ;)
Das Feld darfst du nicht hidden nennen, sondern musst du per CSS verstecken.

Opi62

Trainee

Posts: 91

Location: 127.0.0.1

  • Send private message

10

Thursday, July 16th 2009, 10:08pm

Ich danke fir Für die kleine Nachhilfestunde..
Das wusste ich noch nicht das ich die mit css verstecken kann.

Gruß Opi

http://sozialgc.com
Das leben hat ne Geile Grafik,
nur das Gameplay ist Beschissen

european

Beginner

Posts: 10

  • Send private message

11

Thursday, July 16th 2009, 10:49pm

Ich danke fir Für die kleine Nachhilfestunde..
Das wusste ich noch nicht das ich die mit css verstecken kann.

Gruß Opi
Man lernt ja nie aus ;-)
Immer wieder gern ^^

davil

Beginner

Posts: 36

Location: Wien

Occupation: Entwickler

  • Send private message

12

Tuesday, July 21st 2009, 7:18pm

Gegen folgende Dinge musst du dich besonders schützen:
SQL-Injections
Du bist mit Addslashes etc. zwar auf dem richtigen Weg, aber das sind sehr alte Hüte, die schon langsam eingemottet werden sollten. Nimm PDO und Prepared Statements, dann kümmert sich der Datenbanklayer darum und es kann absolut nichts mehr passieren. Es ist an der Zeit, PHP4 zu begraben!

Cross-Site-Scripting (XSS), Javascript-Injection
Ich weiß nicht, was du in deinem Textarea an HTML-Code erlauben willst, aber der einfachste Weg wäre, gar kein HTML zuzulassen. Dazu reicht es für gewöhnlich bei allen Texten alle spitzen Klammern zu entfernen. Wer es noch radikaler will, lässt per Regex nur Zeichen durch, die in einer Whitelist stehen (damit kann dir auch niemand Nullbytes oder ähnlichen Mist unterschieben). Falls du auf HTML angewiesen bist und böse Sachen rausfiltern willst, reicht eine einfache Suche nach "Javascript" auf keinen Fall aus. Der sauberste Weg ist ein Parser/Lexer, der den Code in eine echte XHTML-Struktur umwandelt und dann alle Tags und alle Attribute entfernt, die nicht in einer Whitelist stehen (du könntest z.B. nur <strong></strong> und <em></em> zulassen). Dabei werden auch gleich Tags entfernt, denen der entsprechende Gegenpart fehlt (z.B. offene <strong>). Dann musst du nur noch auf Elemente achten, die externe Referenzen zulassen, wie z.B. IMG-Tags. Eine Zeit lang konnte man z.B. in manchen Browsern JavaScript im img/src-Attribut ausführen. An dieser Stelle hilft eine zusätzliche Kontrolle, ob der Inhalt des src-Attributs mit "http" beginnt.
Solche XHTML-Säuberer gibt es fertig, ich hab im Moment aber grad keinen bei der Hand, Google hilft auf jeden Fall. Von komplexen Regex-Orgien rate ich in diesem Fall ab, es gibt immer Dinge, die da durchrutschen können.

Davil
~~~ ihr seid alle krank! ~~~ :D

Opi62

Trainee

Posts: 91

Location: 127.0.0.1

  • Send private message

13

Thursday, July 23rd 2009, 12:50pm

Hmm Könntest du das ein bischen näher für mich erleutern.
Denn von Regex habe ich noch nie was gehört.
Whitlist ist mir ein begriff. Aber ich wüsste so auf die schnelle nicht wie ich eine Erstelle.
BZW. Wie ich die auf die übergebenen Daten anwenden können soll.

Ich würde denke das leuft mit. str_replace().

Aber da liege ich beschtimmt Falsch.

Wäre nett wenn du es mir ein bischen näher erklären könntest.

Gruß Opi

Opi62

Trainee

Posts: 91

Location: 127.0.0.1

  • Send private message

14

Wednesday, July 29th 2009, 1:19am

Ich weiß Zwar nicht ob es richtig ist aber ich hoffe mal ich habe das problehm einigermasen richtig gelöst auser euch sollte selbst noch was einfallen zu dehm tehe sicherheit.

[php]
<?php
if(!preg_match("#^[a-z0-9äöüß _-]+$#si",$nick))
{
echo "FEHLER<br><br><br>";
}
?>
[/php]

Gruß Opi

Similar threads

wcf.user.socialbookmarks.titel