php.de

Zurück   php.de > Webentwicklung > Software-Design

Software-Design Diskussionen auf Profi-Niveau: PHP Lösungen auf konzeptioneller Ebene

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 26.12.2011, 13:47  
Benutzer
 
Benutzerbild von sharpx
 
Registriert seit: 12.04.2011
Beiträge: 50
PHP-Kenntnisse:
Fortgeschritten
sharpx befindet sich auf einem aufstrebenden Ast
Standard Anwendungssicherheit: Validierung von Eingabedaten

Hallo und Frohe Weihnachten (nachträglich)!

In den letzten Tagen habe ich mir über ein konzeptionelles Problem hinsichtlich Anwendungssicherheit bzw. Datenvalidierung für ein Onlineportal (Kundenprojekt) den Kopf zerbrochen.

Alle genutzten "eingehenden Daten" (d.h. $_GET, $_POST, $_COOKIE und manche Elemente aus $_SERVER) werden vor Ausführung der eigentlichen, HMVC-basierten, Anwendungslogik zentral vorvalidiert (eine strengere Validierung entsprechend dem jeweiligen letztendlichen Verwendungszweck der Information erfolgt innerhalb des Controllers). Ein Beispiel für eine solche Vorvalidierung wäre, dass $_GET-Elemente lediglich Alphanumerische (+ Deutsche Umlaute) Zeichen enthalten dürfen. Im Controller kann der Programmierer nun z.B. noch definieren, dass es sich nur um einen positiven ganzzahligen Wert 0 <= x < 10.000 handeln darf.

Das Vorgehen bei einer Verletzung der (sehr genau festgelegten) Validierungsregel innerhalb des Controllers ist klar. Die Ausführung der Anwendungslogik wird unterbrochen und ein spezieller ErrorController wird ausgeführt.

Nun stellt sich mir die Frage wie ich in der Vorvalidierungs-Klasse am Besten vorgehe.

Sollte ich versuchen die Eingaben zu säubern, sie also in gemäß meiner Spezifikationen valide Inhalte transformieren, auch auf die Gefahr hin, dass sie absichtlich eingegeben wurden, um die Systemsicherheit zu testen / zu gefährden. Vorteil hier wäre die Benutzerfreundlichkeit, da eventuelle Fehleingaben (z.B. ein Ausrufezeichen in einem Alphanumerischen Feld) einfach weggefiltert werden, ohne das der Benutzer eine Fehlermeldung erhält und dementsprechend nicht im Arbeitsablauf gestört wird.

Auf der anderen Seite könnte ich mich dafür entscheiden, bei einem Verstoß gegen meine Spezifikationen direkt die Anwendungslogik abzubrechen und eine Fehlerseite anzuzeigen. Grundlage der Entscheidung zu diesem Vorgehen wäre, dass non-valide Daten die auf das passende Format zurechtgestutzt werden, trotzdem nicht die vom Benutzer erwarteten Ergebnisse erzielen würden. Auch könnte es sich um sinnfreie Daten handeln, wie oben bereits beschrieben. Nachteil hier ist natürlich die BenutzerUNfreundlichkeit.

In meinem Kopf streiten sich gerade Engelchen und Teufelchen was ich denn nun tun sollte - Es wäre hilfreich wenn Ihr eure eigenen Gedanken / Philosophien zu diesem Thema mit mir teilen könntet bzw. evtl. auch eure eigene Projekte und die dort getroffenen Entscheidungen hinsichtlich des Themas "Anwendungssicherheit / Datenvalidierung" vorstellen könntet.

Danke hierfür im Voraus!
__________________
root@php.de:~$ rm -rd /
sharpx ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 26.12.2011, 14:03  
meikel
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von sharpx Beitrag anzeigen
Hallo und Frohe Weihnachten (nachträglich)!
Danke gleichfalls.

Zitat:
... Ein Beispiel für eine solche Vorvalidierung wäre, dass $_GET-Elemente lediglich Alphanumerische (+ Deutsche Umlaute) Zeichen enthalten dürfen.
Leider falsch, weil GET Strings urlencodet sein müssen.

http://php.net/rawurlencode
  Mit Zitat antworten
Alt 26.12.2011, 14:16  
Benutzer
 
Benutzerbild von sharpx
 
Registriert seit: 12.04.2011
Beiträge: 50
PHP-Kenntnisse:
Fortgeschritten
sharpx befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von meikel Beitrag anzeigen
Leider falsch, weil GET Strings urlencodet sein müssen.

http://php.net/rawurlencode
Und wo genau siehst du hier das Problem? Das entsprechende Decoding übernimmt PHP automatisch.
__________________
root@php.de:~$ rm -rd /
sharpx ist offline   Mit Zitat antworten
Alt 26.12.2011, 14:20  
meikel
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von sharpx Beitrag anzeigen
Und wo genau siehst du hier das Problem?
Code mit non-US-ASCII Zeichen im URL ist Kot.
  Mit Zitat antworten
Alt 26.12.2011, 14:31  
Benutzer
 
Benutzerbild von sharpx
 
Registriert seit: 12.04.2011
Beiträge: 50
PHP-Kenntnisse:
Fortgeschritten
sharpx befindet sich auf einem aufstrebenden Ast
Standard

Könntest du dich bitte etwas verständlicher Ausdrücken?

Hier mal ein kleiner Auszug aus meinem Code:
PHP-Code:
$valOutput preg_replace('/[^(\x30-\x7A)]/'""$_GET[$key]);
$valOutput preg_replace("/[^a-zA-Z0-9]/"""$valOutput);
CleanRequest::$GET[$key] = $valOutput
__________________
root@php.de:~$ rm -rd /
sharpx ist offline   Mit Zitat antworten
Alt 26.12.2011, 15:06  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.874
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

Pre-Validation die außerhalb der gesamtlogik passiert ( meinetwegen schon im Bootstrap der Anwendung oder als eigene vorgeschaltete Library ), die Superglobals "überarbeitet" würde bei mir InvalidArgumentExceptions statt den eigentlichen Werten übergeben. Das Inbound-Konzept der Anwendung müsste nur entsprechend dem gelieferten Interface reagieren, Die Exception entweder weiterreichen oder direkt abfeuern. Alles in allem würde ich aber auf keinen Fall den Wert der meine Anwendung kompromitieren könnte, an meine Anwendung ranlassen ( wollen ).
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.
tr0y ist offline   Mit Zitat antworten
Alt 26.12.2011, 15:09  
Benutzer
 
Benutzerbild von sharpx
 
Registriert seit: 12.04.2011
Beiträge: 50
PHP-Kenntnisse:
Fortgeschritten
sharpx befindet sich auf einem aufstrebenden Ast
Standard

Die Gefahr der Kompromitierung existiert ja nicht (mehr), da die Daten im gegebenen Beispiel nun lediglich a-zA-Z0-9 => alphanumeric sein können. Die Frage ist nur, ob es Sinn macht, hier eine "heile Welt" anzunehmen und mit den gesäuberten Daten die Programmlogik weiterlaufen zu lassen.
__________________
root@php.de:~$ rm -rd /
sharpx ist offline   Mit Zitat antworten
Alt 26.12.2011, 15:13  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.874
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

Informier die Anwendung doch das dort gesäubert wurde ( wie oben beschrieben ), dann kannst du zumindest Anwendungszentral mitloggen was die Anwendung auch betrifft.

Wenn du keine Exceptions dafür weiterreichen willst ( weil du Werte säuberst und doch weiterreichts ) würde ich zumindest ein Interface implementieren das die Anwendung ein Subject aggregiert und deinem Validator einen Observer, der diese Exceptions der Validation "zur Kenntnisnahme" piped.
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.
tr0y ist offline   Mit Zitat antworten
Alt 27.12.2011, 09:58  
Benutzer
 
Benutzerbild von nedelin
 
Registriert seit: 06.05.2011
Beiträge: 98
PHP-Kenntnisse:
Fortgeschritten
nedelin befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von meikel Beitrag anzeigen
Leider falsch, weil GET Strings urlencodet sein müssen.
Mein Gott, wie ich solche pauschalen Statements liebe...

@sharpx:

Ich mach's ähnlich wie Du: es gibt eine zentrale Vorvalidierung eingehender Daten. So wird bspw. für GET geprüft:

1. ist die GET-Variable überhaupt registriert
2. erlaubte Zeichen des GET-Wertes via Whitelist; ist abhängig von der GET-Variable
3. max. Länge des GET-Wertes

Die Superglobalen werden anschliessend gelöscht, um die Verwendung verseuchter Daten auszuschliessen. Bei erfolgreicher Validierung werden die Superglobalen als statische Klassenmember bereitgestellt; im Fall einer negativen Validierung wird im Content-Controller eine Fehlerseite + entspr. HTTP-Header ausgelöst.

Im Falle der POST-Variablen werden die hereinkommenden Daten an der Stelle der konkreten Implememtierung geprüft; hier greift eine zentrale Validierung zu kurz. Dies übernimmt i.d.R. eine Klasse zur Formularverarbeitung, welche über das Model (Datenbank) konfiguriert wird. Darüber hinaus können für spezielle Szenarien individuelle POST-Variablen registriert werden, z.B. Integer.

dr.
nedelin ist offline   Mit Zitat antworten
Alt 27.12.2011, 13:16  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Zitat:
Es wäre hilfreich wenn Ihr eure eigenen Gedanken / Philosophien zu diesem Thema mit mir teilen könntet bzw. evtl. auch eure eigene Projekte und die dort getroffenen Entscheidungen hinsichtlich des Themas "Anwendungssicherheit / Datenvalidierung" vorstellen könntet.
Zentrale Validierung für konkrete Anwendungsteile verletzt ganz klar die Kapselung (weiter auch separation of concerns)! Konkrete Logik sollte auch in der konkreten Implementierung stecken und nicht "aussen" bereits bekannt sein. In einer Bootstrap, einem Input-Filter oder einer Front-Controller-Action lassen sich allgemeingültige, Anwendungs-übergreifende Dinge validieren, nicht jedoch konkrete Inputs für beispielsweise ein Formular in der Anwendung. In diesen kann ich mir XSS-Prüfungen oder DB-Attacken ansehen und ggf. mit einer globalen Fehlerseite beantworten (natürlich mit einem Log um im Betrieb derartige Angriffe analysieren zu können).

Sobald es im Rahmen einer HMVC-Implementierung um die Prüfung von konkreten Eingaben angeht, ist immer diejenige Komponente dafür zuständig um die es gerade geht. Diese "kennt" ihre Business-Prozesse, ihre validen und nicht validen Eingaben und kann entsprechend reagieren. Aus Usability-Gesichtspunkten möchte der Benutzer doch keine globale Fehler-Seite angezeigt bekommen, wenn er statt einer "1" eine "5" eingegeben hat.

Zitat:
[..]werden vor Ausführung der eigentlichen, HMVC-basierten, Anwendungslogik zentral vorvalidiert[..]
Ich bin mir nicht sicher, in wie weit du dich mit Software-Architektur-Pattern befasst hast, dieser Satz klingt jedoch sehr abenteuerlich. "vorvalidieren" ist ein bischen wie "halbschwanger" und HMVC ist ein Struktur-Pattern für Web-basierte GUIs und zunächst keine Anwendungslogik.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Erweiterung um Autologin - Validierung, Logik ? hausl PHP Einsteiger 36 30.11.2011 10:22
Meine Formular Validierung (4) elf PHP Tipps 2010 36 15.11.2010 18:18
Meine Formular Validierung (3) elf PHP Tipps 2010 17 01.11.2010 12:32
Meine Formular Validierung (2) elf PHP Tipps 2010 7 20.10.2010 22:14
[Erledigt] Meine Formular Validierung elf PHP Tipps 2010 23 17.10.2010 15:23
Validierung Sascha Ahlers Wiki Diskussionsforum 5 17.06.2010 14:43
[Erledigt] HTML Validierung meckert über link tkausl PHP Tipps 2010 21 07.03.2010 22:31
[Erledigt] Bitte um Hilfe bei Validierung meines Scriptes ePole PHP Tipps 2010 22 24.02.2010 16:11
utf-8 validierung mit reg. Expr. nikosch PHP Tipps 2010 6 27.01.2010 15:53
Validierung !is_array($_POST['Vorname']) testen kurtmos PHP Tipps 2009 16 30.12.2009 19:48
[Erledigt] Mail Validierung MX Record Abfrage sinnvoll? Ennosuke PHP Tipps 2009 7 21.10.2009 17:55
dynamischer Bildupload + -validierung Knutschi PHP Tipps 2009 12 11.05.2009 22:28
Formulargenerierung + Validierung cp_toby Software-Design 11 01.03.2009 22:02
[Erledigt] Validierung mit Arrays vyo PHP Tipps 2008 4 27.12.2008 18:39
Formular und fehlermeldung--> Eingabedaten weg nieselfriem PHP Tipps 2005-2 8 16.06.2005 10:38

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
was ist besser anwendungssicher oder fortgeschritten, php anwendungssicherheit, php datenvalidierung klasse, php datenvalidierung, software design anwendungssicherheit fehler, php eingabedaten

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:41 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum