Diskussion
Webanwendung: zentraler Sicherheitspunkt.
| cd_brenner |
Geschrieben am: Mi 18.04.2012, 14:21
|
||
|
AyomRank 4 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Gruppe: Member (aktiv) Beiträge: 116 Mitglied seit: 19.12.2004 |
Hallo Community, Um eine Webanwendung sicher zu machen müssen zu mindest alle bösen Sonderzeichen maskiert werden. Zusätzlich muss ich in meinem speziellen Fall auch noch Templatevariablen, Snippet-Markierungen und Sprachvariablen aus der Benutzereingabe entfernen. Auch ein Bad-Word-Filter könnte hier ansetzen. Die meisten Anfragen an die Webanwendung laufen über einen Front-Controller ab. Ist es vertretbar Dinge wie
zu machen, wenn zuvor an zentraler Stelle das $_GET, $_POST und $_SESSION Array durchlaufen wird, und dabei alle Maskierungen und Entfernungen vorgenommen werden? Vielen Dank, Markus -------------------- |
||
![]() |
|
#2 Geschrieben am: Mi 18.04.2012, 15:41 (+01:20)
|
|
|
AyomRank 9 Gruppe: Moderator, Experte, VIP-Mitglied Beiträge: 2771 Mitglied seit: 27.12.2004 |
Nein, da die Filterung entsprechend für den Anwendungsfall durchgeführt werden sollte, eine pauschale Filterung ist nett, um nach SQL-Injections oder XSS-Angriffen zu suchen, so wie es mit phpids realisiert werden kann.
Aber die Filterung der einzelnen Variablen sollten doch ganz genau auf den Anwendungsfall abgestimmt werden. Hat auch einen sehr simplen Grund, laufen alle Variablen durch so etwas durch, muss man dieses für die Überprüfung von String-Längen oder ähnlichen auch erst wieder entfernen, sonst werden diese Prüfungen verfälscht. Jedoch kann man sich für das Filtern entsprechende Funktionen zur Vereinfachung erstellen, welche an zentraller Stelle angepasst werden. |
![]() |
| cd_brenner |
#3 Geschrieben am: Mi 18.04.2012, 16:33 (+00:52)
|
|
AyomRank 4 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Gruppe: Member (aktiv) Beiträge: 116 Mitglied seit: 19.12.2004 |
Danke für deine Antwort.
Also die Methoden, die Werte in die Datenbank schreiben prüfen selbstverständlich ob der eingegebene Datentyp und die Länge zum Datenfeld passt. Eine Methode die einen Integer Wert erfordert verweigert ihren Dienst wenn sie "abc" kriegt. Allerdings fühle ich mich besser, wenn eine zentrale Instanz eine grobe Filterung vornimmt - insbesondere weil in diesem Projekt Strings wie {title}, #_edit_button#, #SNPT_benchmark# etc auch geparst werden, was bedeutet, dass diese Strings aus der Benutzereingabe entfernt werden müssen. Weiters möchte ich alle SQL Steuerzeichen maskieren, im Notfall mit einem # irgendwo (DELETE -> DELE#TE). Reicht es alle ", <, und > in ihre Entitäten umzuwandeln, um HTML und JavaScript auszuschalten? Vielen Dank vorerst, Markus -------------------- |
![]() |
|
#4 Geschrieben am: Mi 18.04.2012, 18:05 (+01:31)
|
|||||
|
AyomRank 6 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Gruppe: Member (aktiv) Beiträge: 698 Mitglied seit: 10.02.2005 |
Nein, SQL-Querys so zusammenmzufrickeln ist m.E. nicht mehr vertretbar - Geschweige denn vernünftig oder gar sinnvoll. Angenommen du hast irgendwo ein "Freitext" - und wenn dort innerhalb des Texts jemand irgendwas mit "Delete" schreiben/speichern möchte wird sein Text automatisch auf "DELE#TE" umgeändert? Du musst das Rad hier allerdings nicht neu erfinden. Dafür gibts unter PHP "ab Werk" z.B. PDO |
||||
![]() |
|
#5 Geschrieben am: Do 19.04.2012, 07:56 (+13:50)
|
|||||
|
AyomRank 9 Gruppe: Moderator, Experte, VIP-Mitglied Beiträge: 2771 Mitglied seit: 27.12.2004 |
So was ist quatsch, da es mehr Probleme verursacht als löscht, wenn Du ein für Dich gefährlichen String ausmachst, solltest Du eher die Ausführung der Anwendung stoppen, statt versuchen es zu maskieren und dann weiter zu machen. Wobei ich es trotz allen nicht so sinnig finde DELETE oder SELECT so zu verändern, da es ja normale Wörter aus dem englischen Sprachgebrauch sind.
Nein, tut es nicht. Für HTML muss noch mindestens noch & maskiert werden, besser auch noch den Single Quote, aber dann würde ich davon absehen es an zentraler Stelle zu filtern, dies sollte erst kurz vor der Ausgabe erfolgen. Wenn es um JavaScript alleine geht, weil der Text in HTML-Code eingesetzt wird, reicht dieser Art der Filterung aber nicht mehr. |
||||
![]() |
| cd_brenner |
#6 Geschrieben am: Sa 21.04.2012, 21:08 (+2d 13:12)
|
|
AyomRank 4 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Gruppe: Member (aktiv) Beiträge: 116 Mitglied seit: 19.12.2004 |
Danke für die zahlreichen Antworten, die mir schon einiges weitergeholfen haben.
Ich hätte jetzt allerdings einen weiteren Ansatz um das Ding zentral zu Lösen: Alle relevanten externen Datenquellen sind ja bekannt - von daher sollte es kein Problem sein diese abzuprüfen. Im Frontcontroller wird dann quasi geprüft ob $_GET["xyz"] erlaubt ist, und ob dort der erwartete Datentyp (z.B. nur Integer) gegeben ist - wenn nicht wird alles verworfen. Somit sollte doch schon mal relativ gut gefiltertes Ausgangsmaterial aus $_GET, $_POST und eventuell $_COOKIE kommen. Wenn das noch nach essenziellen HTML, JavaScript und SQL Steuerzeichen filtert/maskiert sollten wir doch klarkommen oder? ad "Rad neu erfinden": Bei diesem Projekt möchte ich bewusst Dinge selbst entwickeln um daraus zu lernen. Lernen ist der Grundgedanke bei dem Projekt. Vielen Dank vorerst, Markus -------------------- |
![]() |
|
#7 Geschrieben am: Sa 21.04.2012, 22:40 (+01:31)
|
|
|
AyomRank 9 Gruppe: Moderator, Experte, VIP-Mitglied Beiträge: 2771 Mitglied seit: 27.12.2004 |
Wie ich oben schon geschrieben habe, halte ich es eher für wenig sinnvoll es so zu lösen. Ich sähe nur eine Möglichkeit, dass Du entsprechende eigenständige Arrays baust, zum Einfügen in SQL, und ein separates für die Ausgabe auf der Seite, und wie gesagt alles wegwirfst, wenn eine Variable daneben liegt.
Ich würde aber wohl eher dazu abraten, so vorzugehen. |
![]() |
| NullAhnung |
#8 Geschrieben am: So 22.04.2012, 17:53 (+19:13)
|
||
|
AyomRank 4 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Gruppe: Member (aktiv) Beiträge: 95 Mitglied seit: 16.02.2012 |
zu dem Thema hab ich auch noch ne Frage.... ist es sinnvoll, bestimmte Zeichen bei der Eingabe in ein Formular schon zu verhindern?
dadurch verhindere ich doch, dass der User irgendwelchen Unfug eingibt, oder sehe ich das falsch? Möchte noch hinzufügen, dass mein Nickname was php und co. betrifft vollkommen zutrifft... |
||
![]() |
| PH |
#9 Geschrieben am: Mo 23.04.2012, 11:48 (+17:54)
|
![]() AyomRank 9 Gruppe: Moderator, VIP-Mitglied Beiträge: 2520 Mitglied seit: 29.08.2004 |
"frontcontroller" durchsucht die GET und POST arrays nach verdächtigen Zeichen oder Zeichenfolgen, wie z.B. INSERT, DELETE, EXEC, usw. und wenn fündig stoppt die Ausführung des PHP Skripts.
Dieser Frontcontroller müsste in jedem Skript an den Anfang gebaut werden. Das Hauptproblem dabei ist, sich wirklich sicher zu sein, dass man nichts verpasst hat und wirklich alle Sicherheitsprobleme mit dem Frontcontroller abfängt. Richitg sicher wäre ich mir dabei nie. Ich würde so einen quick & dirty fix nur kurzlebig als Überbrückungslösung anwenden, solange wie gebraucht wird um die Anwendung abzusichern, wenn diese denn nicht abgeschaltet werden kann. -------------------- Disclaimer: Ich gebe manchmal rechtliche Tips, aber ich bin kein Anwalt, sondern verfüge nur über Erfahrung in diesem Bereich sowie über eine Ausbildung in Wettbewerbsrecht, Handelsrecht, Vertragsrecht, Privatrecht und Markenrecht (jeweils immer auch aus internationaler Perspektive), die Teil meines Studiums war.
Ich gebe rechtliche Tips, weil mich diese Themen interessieren und weil mir dies nach dem Gesetz meines Aufenthaltslandes und dem Schweizer Gesetz gestattet ist. Es ist dem Leser überlassen, was er mit diesen Tips anfängt - ich übernehme keinerlei Haftung für meine Ausführungen. |
![]() |
|
#10 Geschrieben am: Mo 23.04.2012, 11:54 (+00:05)
|
|
|
AyomRank 9 Gruppe: Moderator, Experte, VIP-Mitglied Beiträge: 2771 Mitglied seit: 27.12.2004 |
Solche Dinger, wie es auch das PHP IDS ist dienen nur als zusätzlichen Schutz, können aber keine vollständige Applikationssicherheit gewährleisten, und im schlimmsten Falle sogar neue Lücken reißen, da es ja auch ein weiteres Stück Software ist.
@NullAhnung Prinzipell ja, aber durch den Programmcode wird dies Auswahl etwas zu stark eingeschränkt, sowohl für's Passwort als auch für den Benutzernamen. Und letztendlich kommt es eben auch stark darauf an, was am Ende mit den einzelnen Feldern geschicht, so kann das Passwortfeld anders zu filtern sein, als das Feld eines Benutzernamens. |
![]() |
| NullAhnung |
#11 Geschrieben am: Mo 23.04.2012, 13:04 (+01:09)
|
|
AyomRank 4 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Gruppe: Member (aktiv) Beiträge: 95 Mitglied seit: 16.02.2012 |
Danke für die Antwort... da beruhigt mich...grins
ich denke man muss auch den User dazubringen gewisse Regeln einzu halten... und _ oder '# etc haben in einem Namen, Ort und auch in einem Passwort nichts verloren...ist meine Meinung |
![]() |
|
#12 Geschrieben am: Mo 23.04.2012, 13:57 (+00:53)
|
|
|
AyomRank 9 Gruppe: Moderator, Experte, VIP-Mitglied Beiträge: 2771 Mitglied seit: 27.12.2004 |
Falsch in einen Passwort muss man gerade eine breite Masse an Zeichen zu lassen und kann es nicht so dermaßen beschränken, wie in dem Falle. Da spielt Deine Meinung eher eine untergeordnete Rolle, und würde ich insbesondere beim Passwort als völlig falsch ansehen.
In Passwörtern müssen auch Sonderzeichen zur Verfügung stehen. Zeichengruppen in Passwörtern sind noch immer folgende:
Bearbeitet von Sascha Ahlers am Mo 23.04.2012, 14:02 |
![]() |
| NullAhnung |
#13 Geschrieben am: Mo 23.04.2012, 14:13 (+00:15)
|
|
AyomRank 4 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Gruppe: Member (aktiv) Beiträge: 95 Mitglied seit: 16.02.2012 |
gut an den rene hab ich nicht gedacht....aber wenn er in der db mit rene drin ist, ist es auch nicht schlimm....grins
aber große firmen wie microsoft verbieten ja auch die eingabe von sonderzeichen....und hunderte millionen menschen können damit leben, und ich denke, dass viele user es aktzeptieren, wenn es anscheinend um die sicherheit ihrer daten geht.... |
![]() |
|
#14 Geschrieben am: Mo 23.04.2012, 14:24 (+00:10)
|
|
|
AyomRank 9 Gruppe: Moderator, Experte, VIP-Mitglied Beiträge: 2771 Mitglied seit: 27.12.2004 |
Hmm, also ich kann in meinen Windows Sonderzeichen verwenden. Und nein, ich habe in meinen Live-Account auch Sonderzeichen drin.
Na ja, ich nicht, da es ja gerade eben um die Sicherheit meiner Daten geht, keine Sonderzeichen im Passwort heißt für mich, ich melde mich mal besser nicht an dem Dienst an, wer weiß welchen Bockmist die noch veranstaltet haben. Besonders toll auch immer wenn man keine gültigen E-Mail-Adressen eingeben kann, weil so ein Depp vom Anwendungsentwickler meinte gewisse Zeichen nicht zu akzeptieren. Aber wenn Softwareentwickler oftmals schon keinen Plan von Sicherheit haben. Wie willste dann bitte davon ausgehen, dass ein Anwender weiß was sicher ist? |
![]() |
| NullAhnung |
#15 Geschrieben am: Mo 23.04.2012, 14:56 (+00:32)
|
|
AyomRank 4 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Gruppe: Member (aktiv) Beiträge: 95 Mitglied seit: 16.02.2012 |
also ich kann bei der benutzerkonten-geschichte in windows keine sonderzeichen eingeben....
|
![]() |
|
#16 Geschrieben am: Mo 23.04.2012, 15:17 (+00:20)
|
|
|
AyomRank 9 Gruppe: Moderator, Experte, VIP-Mitglied Beiträge: 2771 Mitglied seit: 27.12.2004 |
Also ich kann im Windows Passwörter mit Sonderzeichen angeben!
|
![]() |
| NullAhnung |
#17 Geschrieben am: Mo 23.04.2012, 15:57 (+00:39)
|
|
AyomRank 4 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Gruppe: Member (aktiv) Beiträge: 95 Mitglied seit: 16.02.2012 |
sorry.... stimmt....aber beim benutzername geht es nicht...
|
![]() |
| cd_brenner |
#18 Geschrieben am: Mi 25.04.2012, 01:53 (+33:55)
|
||||
|
AyomRank 4 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Gruppe: Member (aktiv) Beiträge: 116 Mitglied seit: 19.12.2004 |
Lassen wir das 'wo' mal im Hintergrund und beachten nur das 'was': Wie macht man's richtig/am Besten? Wir ist klar, dass SQL, HTML, Javascript und die internen Steuerzeichen in den Templates maskiert entfernt werden müssen. Zusätzlich sollten alle eingehenden Variablen (egal ob via GET, POST etc) möglichst fein selektiert werden. Als Beispiel: $_GET["id"] > darf nur numerisch sein [0-9], darf max. x lang sein. $_POST["cloudkey"] > darf nur Buchstaben enthalten [A-Za-z], darf max. y lang sein Was ist noch essenziell um eine Webanwendung sicher zu gestalten? Da mir jetzt schon einigemale geraten wurde das nicht global zu lösen könnte ich mir auch vorstellen eine einfache Funktion zu schreiben, die die Eingangsvariablen mit dem entsprechenden RegEx prüft und reagiert. Allerdings muss ich zugeben, dass mir der Mehrwert gegenüber der globalen Methode noch nicht klar ist. Mich reizt das sorglose Verwenden der Superglobalen nach dem Frontcontroller irgendwie...
Was passiert mit einem DELE<span style="display: none;"></span>TE ?? Es sollte eher in die Richtung Web Application Firewall gehen: http://de.wikipedia.org/wiki/Web_Application_Firewall und noch ein recht interessantes Paper: https://www.owasp.org/images/1/1b/Best_Prac...s_Guide_WAF.pdf Vielen Dank. Markus -------------------- |
||||
![]() |
Thema wird von 0 Benutzer(n) gelesen (0 Gäste und 0 anonyme Benutzer)
0 Mitglieder:
![]() |
![]() ![]() ![]() |
Neu: Kleinanzeige pinnen | Kleinanzeige auf Startseite | Werbetarife 2013 | VIP Mitgliedschaft (30 Tage Geld-zurück-Garantie)
















