2010-12-02 45 views
2

Quand j'ai commencé avec PHP, j'étais vraiment content de la façon dont PHP était faiblement typé et comment il était facile à apprendre. Mais au fur et à mesure que j'y avais grandi, je me suis rendu compte qu'être faussement typé compliquait mes scripts plutôt que de les simplifier. Et maintenant je cherche des façons que je pourrais fort tapez mes variables PHP, en particulier les variables d'entrée ($_POST, $_GET, $_COOKIE, $_REQUEST et certains $_SERVER vars). Je souhaite également que ma validation et ma désinfection soient masquées dans ce processus afin que je puisse "oublier" l'injection SQL et de nombreux autres processus de validation sujets aux erreurs. J'ai une ébauche de la façon dont je veux que ce soit.Est-il possible de forcer vos variables d'entrée PHP à être fortement typées

D'abord, je déclare la variable. De préférence en POO

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

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

Maintenant, je pourrais peut-être juste laisser tomber toute variable non déclarée des GLOBALS PHP prédéfinies et utiliser le type de variable pour valider et désinfectez directement dans les tableaux mondiaux.
Je pourrais également définir les valeurs de variables non validées comme un emaill à bool false et non soumis à null et les utiliser lors de la validation des données. Cependant, avant que je sois allé et ai réinventé la roue j'espérais:

quelqu'un pourrait me diriger vers une bibliothèque qui a déjà aidé à résoudre mes problèmes?
s'il y avait des raisons pour lesquelles je ne devrais pas poursuivre sur cette fantaisie sauvage? Des façons meilleures et plus claires d'y parvenir?
et D'autres idées générales que vous pourriez avoir à propos de cette idée?

+1

Oh, mon dieu, comment je voudrais pouvoir forcer une frappe plus forte sur PHP ... mais non, pas vraiment. Je pense que nous aurons bientôt des indices sur les primitives, ce qui serait certainement un plus. –

+0

Suite à mon dernier commentaire: le type scalaire ne cesse de revenir en PHP http://sebastian-bergmann.de/archives/900-Scalar-Type-Hints-in-PHP-5.3.99.html#content –

+0

Alors que je pense appliquer des types dans les frontières de PHP sur la programmation de culte de cargaison, il y a en fait une implémentation qui fait ce que vous essayez de faire: http://sourceforge.net/p/php7framework/wiki/input/ – mario

Répondre

4

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

Wraps superglobales par défaut, mais vous pouvez aussi instancier des objets locaux avec $postFilter = new input($_POST).Il est censé être utilisé manuellement comme ceci:

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

Et il se plaint si elle voit tout accès $ _POST [ « raw »].

Mais vous pouvez également prédéfinir des listes de filtres. Je le ferais centralement dans la définition de classe. Ce système est censé être un add-on pour les anciennes applications, où vous ne voulez pas aller manuellement à travers le code et réécrire des chaînes pour appliquer des formats de données ou types:

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

Mais j'éviterait personnellement -> sql s'échapper prématurément. Si disponible, PDO et SQL paramétré doivent être utilisés. Mais bien sûr, une fonctionnalité d'échappement centrale est de toute façon préférable à la prudence.

Vous pouvez également définir des filtres personnalisés. Il prend des fonctions globales par exemple.

+1

Je voudrais appuyer l'utilisation de SQL et de PDO paramétrés. Cela rend votre vie plus simple. – cwallenpoole

0

J'ai écrit un système de formulaires pour notre application qui le fait dans une large mesure;

  • Je définir tous les domaines que je me attends et des règles sur les (type de données, au minimum, mais aussi minutes, valeurs maximales, énumérations, etc.)
  • un nonce est utilisé pour fixer la forme et aussi déterminer si elle a été soumise
  • lorsque la session est récupérée, chaque contrôle de forme sérialisée pour voir si a été envoyé le nonce approprié et se considère soumis le cas échéant
    • il vérifie ensuite chaque champ connu, obtient les données soumises et validation
    • tous les champs peuvent être réinitialisés à leur valeur par défaut si elles sont invalides

Cela gère également le rendu des formes et la génération de règles de validation côté client et, donc je peux écrire les règles une fois (côté serveur) et à la fois client et la validation côté serveur se produit automatiquement. Les règles de type de données sont le minimum qui doit être défini pour chaque champ.

Malheureusement ce n'est pas open source et je n'ai pas la permission de l'ouvrir; J'ai cherché longtemps à trouver quelque chose comme ça, mais je n'ai pas vraiment trouvé quelque chose. La bibliothèque Pear Quickforms était la plus proche, mais ne semblait pas couvrir toute la validation et avait une documentation terrible et terrible.

+0

Cela ressemble vraiment beaucoup plus à ce que je regarde. Les quelques bibliothèques de validation et de désinfection de données disponibles pour PHP sont vraiment une honte de savoir à quel point il est célèbre pour emballer des applications non sécurisées. C'est une merveille de savoir comment il a fallu 5 versions pour qu'ils incluent nativement la fonction filter_var() dans PHP. – shxfee

4

PHP a été faiblement typé

Non - ce ne est pas faiblement typé, il est dynamiquement typé - il y a une différence subtile.

réellement compliqué mes scripts plutôt que de les simplifier

Mon expérience est exactement le contraire.

Je voudrais que ma validation et désinfectante ...

frappe fort n'est pas la façon de traiter la validation d'entrée, en particulier sur support comme HTTP (qui est faiblement typé). Il n'est simplement pas pratique d'avoir une validation de type pour chaque entrée possible - vous pouvez stocker une adresse e-mail dans une chaîne - mais cela ne signifie pas que l'adresse e-mail est formatée correctement, comment vous assurez-vous qu'un fichier est une image? Comment la frappe forte garantit-elle que la date de début est antérieure à la date de fin? Alors que les versions récentes de PHP ont filter functionality, je (et la plupart des gens que je connais) utilise depuis longtemps ma propre validation d'entrée lib pour les atomes, et la validation de second ordre (comparant les valeurs relatives de plus d'une entrée) code. La seule fois où vous devez changer le type d'entrée est l'absence de perte de données qui en résulte (par exemple, conversion de chaîne en nombre, mais vous devez absolument éviter de perdre des données). Déclarer le type attendu de l'entrée var n'est pas plus difficile que de déclarer un type réel pour une variable. Si vous ne pouvez pas créer une représentation valide de l'entrée adaptée au traitement, votre code ne devrait jamais deviner ce que l'utilisateur voulait dire - vous devez rejeter l'entrée et informer l'utilisateur/procédure d'appel.

Une grande partie de la validation peut être très contextuelle - par ex. 02/12/2010 au Royaume-Uni est de 10 mois après la même date aux États-Unis.

Si vous voulez vraiment PHP à se comporter comme si son fortement typé, un coup d'oeil à PHPLint

pour que je puisse « oublier » Injection SQL

NON! Vous validez/désinfectez les entrées et vous transformez les sorties en fonction de leur destination!La bonne représentation d'une chaîne pour l'écriture au format HTML est différente de l'écriture dans une URL différente de l'écriture dans une base de données.

+0

Êtes-vous sûr de lire la question correctement? Votre dernier point sur la sortie de transformation dit autrement. Comme vous l'avez mentionné avant de le dire, et comme je l'ai mentionné répété dans la question sur la gestion de $ _POST, $ _GET et d'autres variables globales spécifiques à l'entrée, je suis préoccupé par la partie validation/désinfection. Pas la sortie. Vous pourriez aussi bien vous moquer de mon mauvais choix de titre de question et de mes compétences descriptives. Voir la réponse de @mario pour comprendre le contexte de ma question. – shxfee