Frage

Wenn ich mit PHP begann, war ich wirklich zufrieden, wie PHP wurde lose typisiert und wie einfach war es zu lernen. Aber als ich in sie wuchs, erkannte ich, dass lose eigentlich eher meine Skripte kompliziert wird getippt dann sie zu vereinfachen. Und jetzt bin ich der Suche nach Möglichkeiten, wie ich stark meine PHP-Variablen geben könnte, insbesondere die Eingangsgrößen ($_POST, $_GET, $_COOKIE, $_REQUEST und einige $_SERVER VARs).

Außerdem würde ich meine Validierung mag und Desinfizieren in diesem Prozess wird versteckt, so dass ich „vergessen“ über SQL-Injection und viele der anderen fehleranfällig Validierungsprozesse. Ich habe eine grobe Skizze, wie ich will, dies sein.

Zuerst erkläre ich die Variable. Vorzugsweise in OOP

$varClass->post->variable_name->type('STR', 'SQL', 'EMAIL');  

// or as an array  
$_MY_POST['variable_name'] = array('STR', 'SQL', 'EMIAIL');

Jetzt könnte ich einfach fallen alle nicht deklarierten Variablen aus der vordefinierten PHP Globals und verwenden Sie den Variablentyp zu validieren und zu sanieren sie direkt in den globalen Arrays.
Ich kann auch die Werte von unvalidated Variablen wie ein emaill zu Bool falsch und un-vorgelegten auf null gesetzt und sie bei der Datenvalidierung verwenden. Doch bevor ich ging und wieder das Rad erfunden Ich hatte gehofft:

jemand könnte mich in eine Bibliothek lenken, die bereits hilft meine Probleme zu lösen?
ob es irgendwelche Gründe, warum ich nicht auf dieser wilden Fantasie verfolgen sollte? Eine bessere und klare Wege zur Erreichung dieses?
und andere allgemeine Gedanken Sie können über diese Idee?

War es hilfreich?

Lösung

http://sourceforge.net/p/php7framework/wiki/input/

Wraps die superglobals standardmäßig, aber man kann auch instantiate lokale Objekte mit $postFilter = new input($_POST). Es sollte manuell wie folgt verwendet werden:

 $_POST->email->sql["variable_name"]
 $_POST->array->int["order_list"]

Und es beschwert sich, ob es einen $ _POST [ "raw"] Zugang sieht.

Sie können aber auch Filterlisten vordefinieren. Ich würde in der Klasse-Definition, dass zentral tun. Dies soll ein Add-on für alte Anwendungen sein, wo Sie wollen nicht manuell durch den Code gehen und schreiben Strings Datenformaten oder -arten zu erzwingen:

 var $__rules = array(
      "variable_name" => "email,sql",
      "order_id" => "int,range:0:500",
      "order_list" => "array,int",
 );

Aber ich persönlich würde vermeiden -> SQL-escaping vorzeitig. Falls vorhanden PDO und parametrisierte SQL verwendet werden. Aber natürlich eine zentrale Flucht Funktion ist ohnehin besser als cautiosness.

Sie können auch benutzerdefinierte Filter definieren. Es nimmt globale Funktionen zum Beispiel.

Andere Tipps

  

PHP war lose typisierten

Nein - es ist nicht lose typisiert, es dynamisch getippt -. Es gibt einen feinen Unterschied

  

meine Skripte tatsächlich kompliziert eher dann vereinfacht sie

Meine Erfahrung ist genau das Gegenteil.

  

Ich möchte meine Validierung und Hygienisierung ...

Starke Typisierung ist nicht die Art und Weise mit der Eingabevalidierung zu behandeln, vor allem über Medien wie HTTP (die los typisiert ist). Es ist einfach nicht praktisch Typ Validierung für jede mögliche Eingabe zu haben - sicher können Sie in einem String eine E-Mail-Adresse speichern - aber das bedeutet nicht, die E-Mail-Adresse korrekt formatiert ist, wie stellen Sie sicher, dass eine Datei ein Bild ist? Wie funktioniert die starke Typisierung sicher, dass das Startdatum vor dem Enddatum ist?

Während der letzten verions von PHP haben Filterfunktionalität , I (und die meisten Leute die ich kenne) sind seit langem meine eigene Eingabevalidierung lib für Atome wurden verwendet und zweiter Ordnung Validierung (die relativen Werte von mehr als einem Eingang zu vergleichen) muss benutzerdefinierten Code. Das einzige Mal, sollten Sie immer die Art der Eingänge ändern ist, wo es keine resultierenden Datenverlust (zum Beispiel String Anzahl Konvertierungen - aber Sie müssen sehr, dass Sie habe nicht verloren Daten als Ergebnis). die erwartete Art des Eingang var Deklarieren ist nicht schwieriger als einen tatsächlichen Typen für eine Variable zu deklarieren. Wenn Sie keine gültige Darstellung der Eingabe für die Verarbeitung erstellen können, dann sollten Sie den Code nie erraten, was der Benutzer gemeint -. Sie müssen die Eingabe verwerfen und den Benutzer / calling Verfahren informieren

kann eine Menge Validierung sehr kontextuelle sein - z.B. 02.12.2010 in Großbritannien beträgt 10 Monate nach dem gleichen Zeitpunkt in den USA.

Wenn Sie wirklich wollen PHP verhalten, als ob seine stark typisiert, einen Blick auf PHPLint

  

, so dass ich "vergessen" über SQL-Injection

NEIN! Sie validate / sanitize Ein- und Sie verwandeln Ausgänge je nachdem, wo sie ausgegeben zu werden! Die rechte Darstellung eines Strings für die von unterscheidet sich das Schreiben von HTML es zu einer URL zu schreiben, die vom Schreiben in eine Datenbank unterscheidet.

Ich habe ein Formen-System für unsere App geschrieben, die diese zu einem großen Teil tun;

  • Ich definiere alle Felder Ich erwarte und Regeln über sie (Datentyp, bei minimaler, aber auch Minuten, Maximal-, Aufzählungen, usw.)
  • ein Nonce verwendet wird, um die Form zu sichern und auch zu bestimmen, ob es eingereicht wurde
  • , wenn die Sitzung wiederhergestellt wird, die jeweils serialisierten prüft Form zu sehen, ob die entsprechende nonce gesendet wurde, und hält sich, wenn vorgelegt, so
    • es dann prüft jedes bekanntes Feld, erhält die vorgelegten Daten und validiert sie
    • alle Felder können wieder auf ihren Standard sein, wenn sie sind ungültig

Dies ist auch für die Darstellung von Formen und die Erzeugung von Client-Seite Prüfregeln als gut, so kann ich nur die Regeln einmal beschreibbar (Server-Seite) und sowohl Client- und Server-seitige Validierung automatisch erfolgt. Datentyp Regeln sind das Minimum, das für jedes Feld definiert werden muß.

Leider ist es nicht Open Source, und ich habe keine Berechtigung zum Open-Source-es; Ich sah für eine lange Zeit, so etwas zu finden, aber ich konnte nicht wirklich etwas finden. Die Birne Quickforms Bibliothek war in der Nähe, aber schien nicht alle der Validierung zu decken und hatte schreckliche, schreckliche Dokumentation.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top