2010-10-04 7 views
2

J'ai un script PHP qui est censé vérifier les noms humains "valides", mais récemment craqué contre un nom avec un espace, nous avons donc ajouté des espaces à notre validateur.
Plutôt que de le faire, y a-t-il un moyen d'ajouter une liste noire au validateur de CakePHP pour bloquer tous les caractères "invalides", plutôt que d'en autoriser des "valides"?Comment "valider" les noms de personnes dans CakePHP?

NOTE: Je sais comment faire en PHP (en général), mais en utilisant la syntaxe de validateur CakePHP est différent.

+4

Qu'est-ce qui classe un nom humain comme * valide *? Cela semble être un terme assez arbitraire à aborder. Voulez-vous classer les lettres avec des accents comme non valides? –

+0

L'idée est que le système serait basé sur des noms humains "valides" et "réels", donc nous essaierions d'éviter trop de caractères spéciaux qui affaibliraient la confiance dans le système. – chustar

+0

J'ai ajouté des citations pour montrer que je comprends à quel point ce que je demande est flou. – chustar

Répondre

15

Je suis d'accord avec les autres commentaires que la validation d'un nom est probablement une mauvaise idée.

Pour pratiquement tout ce que vous pouvez penser à valider, il y aura quelqu'un avec un nom qui brise la règle. Si vous êtes satisfait de l'idée que vous allez bloquer la saisie de noms, vous pouvez le valider autant que vous le souhaitez. Mais plus vous mettez de règles de validation, plus vous avez de chances de trouver une personne réelle qui ne peut pas se connecter.

Voici un lien vers une page qui décrit quelques-unes des évidentes (et pas si évidentes) les choses que les gens tentent de valider, ce qui peut les faire trébucher:

http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/

Si vous souhaitez autoriser sur votre site, le mieux que vous pouvez vraiment espérer est de forcer une longueur de champ maximale pour s'adapter à l'espace que vous avez alloué dans votre base de données. Même alors, vous allez ennuyer quelqu'un.

+4

+1 Lien génial, merci! – deceze

4

Ne pas faire des hypothèses sur la façon dont le nom peut pe épeautre. Acceptez n'importe quelle entrée (oui, n'importe quel), et faites un échappement approprié en l'affichant, afin de ne pas avoir de vulnérabilités XSS.

Je vous suggère de vous le faites échapper au modèle sur afterFind(), de sorte que vous ne l'oubliez pas quelque part. Conservez les données d'origine dans un champ séparé du modèle, comme ['unescaped_name'], si vous avez besoin d'accéder aux données en clair.

4

Custom Regular Expression Validation

var $validate = array(
    'name' => array(
     'rule' => '/^[^%#\/*@!...other characters you don\'t want...]+$/', 
     'message' => 'Only letters and integers, min 3 characters' 
    ) 
); 

Ceci est une approche trop naïve mais, comme vous auriez à la liste noire presque toute la gamme de caractères Unicode. Vous pouvez à peu près faire uniquement la liste blanche des caractères latins de base plus les bizarreries communes comme les espaces et les apostrophes. Plus que cela et vous vous battrez une bataille difficile, vous ne pouvez pas gagner. Vous pourriez être en mesure de créer un algorithme raisonnablement bon au fil du temps, mais il ne sera jamais à 100% infaillible. Donc soit restreignez vos utilisateurs aux noms de base en latin (et espérez ne pas aliéner votre public) ou passez la validation entièrement *.

Ou investir quelques années dans le développement d'un algorithme couvrant < 100% des noms humains, travaillant 99,9% du temps.

8

Il n'y a aucun moyen de « valider ». Comment pouvez-vous empêcher quelqu'un vraiment appelé:

Robert '); DROP TABLE Étudiants; -

http://xkcd.com/327/


EDIT: Ce que je veux dire vraiment, les gens dans certains pays peuvent avoir leur nom dans différentes langues (par exemple japonais, chinois, coréen) et peut même contient des symboles . Comment allez-vous penser si un site dit que votre nom est "INVALIDE" quand il/elle entre son vrai nom?

Questions connexes