Sécuriser un formulaire d'enregistrement

VaN
Mammouth du PHP | 1107 Messages

06 nov. 2006, 17:48

Bonjour,

je travaille sur un site professionnel, et j'aimerai sécuriser le formulaire d'inscription. J'entends par là empêcher l'utilisateur de rentrer des caractères sensibles dans les champs de login, password et mail.

Comment dois-je m'y prendre ?

J'imagine qu'il existe déjà des fonctions développées pour ce genre de problème. En auriez-vous ?

Merci d'avance.

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

06 nov. 2006, 17:56

filtrage au moyen de regexp

Mammouth du PHP | 684 Messages

06 nov. 2006, 18:46

Peut etre en regardant l'extension Filter qui te filtre les chaines de caracteres.
Pour les emails, il te verifi la syntaxe sans pour autant faire la verification du nom de domaine.
Si tu prend php5.2 ou le zend framework, tu auras ces fonctions.
Sinon tu peux compiler la derniere version de filter qui se trouve sur le site de pecl.php.net -> section Tools and utilities.
La methode des regexp etant toujours une bonne methode mais qui doit couter en terme de performance. Pour la verification d'un login, mot de passe c'est toujours envisagable.
Zigz4g

VaN
Mammouth du PHP | 1107 Messages

07 nov. 2006, 16:49

Je n'y arrive pas : /

je parcours depuis hier des sites sur les regex, mais rien n'y fait, j'ai vraiment du mal avec ça.

Comment créer une regex qui interdise les caractères douteux comme <, >, =, $ etc ?

(au passage, il y'a t'il d'autres caractères qu'il est bon d'interdire lors d'une saisie ? )

Si quelqu'un pouvait me donner une regex simple pour faire ce genre de truc, je lui en serait grandement reconnaissant : )

Merci d'avance.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

07 nov. 2006, 17:34

Dans les expressions régulières, pour refuser un ou plusieurs caractères il suffit dans le masque de débuter la classe par un ^ : [^-_ ] équivaut à "sauf tiret, underscore ou espace"

Mais il n'y a pas réellement de caractères "douteux", il y a juste des caractères à savoir gérer. Il n'est pas inhabituel (il devrait même être normal ;)) de retrouver des caractères spéciaux dans des mots de passe.. ca n'a rien de douteux :)

Tout dépend de l'usage.. dans un champ input il faut faire attention aux guillemets qui doivent être protégées quand tu les réafficheras... les < > n'ont pas d'inconvénient particulier, il faut juste s'assurer qu'ils ne dissimulent pas un code html nuisible (et encore, selon l'usage que tu veux en faire)
Dans un login on peut envisager que l'espace n'est pas des plus adapté..
Dans un mail les restrictions sont beaucoup plus importantes car le format est normalisé...
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

VaN
Mammouth du PHP | 1107 Messages

07 nov. 2006, 18:10

voici ma regex, mais elle ne semble pas marcher :
if(preg_match('[^"\'<>=$ ]', $_POST['login']))
Je souhaite interdire les caractères suivants : " ' < > = $ et l'espace.

Qu'est ce qui cloche ?

VaN
Mammouth du PHP | 1107 Messages

07 nov. 2006, 19:51

J'ai résolu mon problème.

J'en ai un autre : Voici la regex pour vérifier les mails :
'`^[[:alnum:]]([-_.]?[[:alnum:]])*@[[:alnum:]]([-.]?[[:alnum:]])*\.([a-z]{2,4})$`'
Elle a l'air plutot efficace, mais je viens de la tester avec mon email perso, et elle n'accepte pas plusieurs _ à la suite dans la partie avant le @.

Que dois-je modifier pour qu'elle accepte cela ?

Mammouth du PHP | 684 Messages

08 nov. 2006, 15:19

Pour l'email :
        $regex = '/^((\"[^\"\f\n\r\t\v\b]+\")|([\w\!\#\$\%\&\'\*\+\-\~\/\^\`\|'
        .'\{\}]+(\.[\w\!\#\$\%\&\'\*\+\-\~\/\^\`\|\{\}]+)*))@((\[(((25[0-5])'
        .'|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|'
        .'([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))'
        .'\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))\])|(((25[0-5])|'
        .'(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|'
        .'([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))'
        .'\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|'
        .'((([A-Za-z0-9\-])+\.)+[A-Za-z\-]+))$/';
Zigz4g

Mammouth du PHP | 684 Messages

08 nov. 2006, 15:20

voici ma regex, mais elle ne semble pas marcher :
if(preg_match('[^"\'<>=$ ]', $_POST['login']))
Je souhaite interdire les caractères suivants : " ' < > = $ et l'espace.

Qu'est ce qui cloche ?
Ne faut-il pas mettre une * ou un + apres tes [] ?
if(preg_match('[^"\'<>=$ ]+', $_POST['login']))
EDIT: j'avais mal lu le ^ dans la regexp. Je dois me tromper.
Zigz4g