Page 1 sur 1

Interdire des caractères dans une variable

Posté : 27 nov. 2009, 16:07
par visualight
Bonjour,

Suite à cet excellent article sur les sessions et le vol de sessions : http://www.xmcopartners.com/article-owa ... ion.html#1
Je désirerai supprimer les caractères suivants de mes variables utilisateur (username et password) :
! @ $ % ^ & * ( ) - _ + ` ~ \ | [ ] { } ; : ' " ? / , . > <

Pour ce faire j'utilise la fonction str_replace.
MAIS j'ai un problème ... lorsque je tape un nom d'utilisateur comme ceci : jeanpierre /\ * -
Un echo du nom d'utilisateur me sort : jeanpierre \\.

On dirait donc que la suppression des éléments "\" ne se fait pas (du moins je pense)
$interdit=array('!', '@',  '$', '%', '^', '&', '*', '(', ')', '-', '_', '+', '`', '~', '"\"', '|', '[', ']', '{', '}', ';', ':', "'", '"', '?', '/', ',', '.', '>', '<');
$myusername=str_replace($interdit, "", $_POST['user']);
Pouvez-vous me corriger ou du moins m'aiguiller ?

Une autre question: Est-ce vraiment utile de supprimer les caractères ci-dessus en sachant que j'utilise également :
stripslashes($myusername) et mysql_real_escape_string($myusername) ?

Merci,
Raph

Re: Interdire des caractères dans une variable

Posté : 27 nov. 2009, 17:25
par FuZZyLine
Salut,
Bonjour,
Suite à cet excellent article sur les sessions et le vol de sessions : http://www.xmcopartners.com/article-owa ... ion.html#1
Je désirerai supprimer les caractères suivants de mes variables utilisateur (username et password) :
! @ $ % ^ & * ( ) - _ + ` ~ \ | [ ] { } ; : ' " ? / , . > <
Pour ce faire j'utilise la fonction str_replace.
MAIS j'ai un problème ... lorsque je tape un nom d'utilisateur comme ceci : jeanpierre /\ * -
Un echo du nom d'utilisateur me sort : jeanpierre \\.
On dirait donc que la suppression des éléments "\" ne se fait pas (du moins je pense)
$interdit=array('!', '@',  '$', '%', '^', '&', '*', '(', ')', '-', '_', '+', '`', '~', '"\"', '|', '[', ']', '{', '}', ';', ':', "'", '"', '?', '/', ',', '.', '>', '<');
$myusername=str_replace($interdit, "", $_POST['user']);
Pouvez-vous me corriger ou du moins m'aiguiller ?
Peut-être serait-il plus judicieux de faire l'inverse. Dans ton cas tu sembles vouloir supprimer tout ce
qui n'est pas alpha et/ou numérique. Si cette solution te plait voici comment procéder. A toi, par la
suite, de modifier le pattern en fonction de tes besoins:
$pattern = "#([^\w])#";
$string = "Ta chaine...";
$strResult = preg_replace ($pattern, "", $string);
Une autre question: Est-ce vraiment utile de supprimer les caractères ci-dessus en sachant que j'utilise
également : stripslashes($myusername) et mysql_real_escape_string($myusername) ?
Merci,
Raph
S'il s'agit juste d'un loggin et d'un passwd: Garde la suppression, ca fera pas de mal ;)
Pour un autre traitement : ...Je dirais que tu peux t'en passer.

Histoire de Normand: Ni pour ni contre... Désolé je peux pas être plus clair.

@+ ;)

Re: Interdire des caractères dans une variable

Posté : 27 nov. 2009, 20:40
par visualight
Merci pour ta réponse FuZZyLine.
J'ai fait comme tu as dis pour supprimer les caractères non alpha et non numériques et ça marche nickel.

Après renseignements, il s'avère que l'utilisation du bannissement des caractères suivants dans un formulaire de login ou de recherche permet de contrer les attaques de type XSS.

Les caractères suivants doivent être bannis (de même que pour leurs versions encodées) :
! @ $ % ^ & * ( ) - _ + ` ~ \ | [ ] { } ; : ' " ? / , . > <

Ceci évitera l'exécution de code Javascript ainsi que d'autres attaques dont l'injection SQL

En combinant ainsi cette portion de code que tu m'as fourni et les fonctions: stripslashes et mysql_real_escape_string, c'est parfait.

Merci,
raph

Re: Interdire des caractères dans une variable

Posté : 27 nov. 2009, 20:59
par Dr@ke
Pour info:
\w = Tous les caractères alpha-numériques
\W (en majuscule cette fois) = Tous les caractères non alpha-numériques

Donc pour simplifier:

En Iso:
$string = 'Ta chaine...';
$string = preg_replace('#\W#', '', $string);
En UTF-8:
// on ajoute l'option u
$string = 'Ta chaine...';
$string = preg_replace('#\W#u', '', $string);
[EDIT]
Et si souhaite ne pas supprimer les caractères accentués et donc les prendre en compte comme caractères alpha-numériques.

Il faut ,dans certains cas, ajouter avant un setlocal():
// Pour UTF-8
setlocale(LC_ALL,'fr_FR.utf8');

// Pour Iso
setlocale(LC_ALL,'fr_FR.ISO8859-1');

Re: Interdire des caractères dans une variable

Posté : 28 nov. 2009, 15:45
par visualight
Merci Dr@ke. De fait je n'avais pas tester un login et pass avec accents.
J'ai implémenté le setlocale(LC_ALL,'fr_FR.ISO8859-1'); en option dans mon fichier de configuration pour permettre ou non un système de login stricte ou Latin et j'ai modifié mon masque pour le preg_replace

Merci pour tout,
Raph

Re: Interdire des caractères dans une variable

Posté : 28 nov. 2009, 16:22
par FuZZyLine
Salut,

Pour la petite histoire: Pour un type particulier de char (j'entends différent d'un alpha celui-ci vaudra
plus qu'un caractère. Le codage ASCII = 1, ne pas l'oublier. Tu as les chars composés qui "eux"
sont supèrieur à 1 Byte ce qui, lors d'un test de longueur de chaine, par exemple, peut provoquer un retour
éronné. Ne pas l'oublier.

Ceci dit: bon codage ;)

@+ ;)