OVH Cloud OVH Cloud

Regexp & tableau de pattern

4 réponses
Avatar
CrazyCat
Bonjour ici :)

Voila, je cherche à limiter l'accès à un fichier par l'ip (ou la plage
d'ip).

La solution actuellement en place est:
$tested_host = $REMOTE_HOST
if (
(ereg('192.168.0.[0-9]{1,3}', $tested_host) OR
(ereg('192.168.10.[0-9]{1,3}', $tested_host) OR
(ereg('192.168.20.[0-9]{1,3}', $tested_host)) {
...
}

Il ne semble pas possible, avec ereg ou preg_match, d'utiliser un
tableau de pattern, quel est à votre avis la solution la plus simple?

J'avais bien pensé à faire un preg_replace du genre:
preg_replace($hosts, "authorized", $tested_host);
if ($tested_host == "authorized") {
...
}


--
Astuces pour webmasters: http://www.crazycat.info
Tchat francophone: http://www.crazy-irc.net

4 réponses

Avatar
Olivier Miakinen

La solution actuellement en place est:
$tested_host = $REMOTE_HOST
if (
(ereg('192.168.0.[0-9]{1,3}', $tested_host) OR
(ereg('192.168.10.[0-9]{1,3}', $tested_host) OR
(ereg('192.168.20.[0-9]{1,3}', $tested_host)) {
...
}

Il ne semble pas possible, avec ereg ou preg_match, d'utiliser un
tableau de pattern,


Et un pattern unique traitant tous les cas, ça ne t'irait pas ?

Par exemple le pattern suivant :
'/(192.168.0.[0-9]{1,3}|192.168.10.[0-9]{1,3}|192.168.20.[0-9]{1,3})/'

Ou plus simplement :
'/192.168.(0|10|20).[0-9]{1,3}/'

Voire :
'/192.168.[12]?0.[0-9]{1,3}/'

Tant que j'y suis, il serait peut-être une bonne idée de tester le '.'
en tant que tel, plutôt que « tout caractère ». Donc :
'/192.168.[12]?0.[0-9]{1,3}/'


J'avais bien pensé à faire un preg_replace du genre:
preg_replace($hosts, "authorized", $tested_host);
if ($tested_host == "authorized") {
...
}


Oui, c'est aussi une possibilité. Bien vérifier qu'il ne peut pas être
mis à "authorized" par le visiteur.

Avatar
CrazyCat
Et un pattern unique traitant tous les cas, ça ne t'irait pas ?
Par exemple le pattern suivant :
'/(192.168.0.[0-9]{1,3}|192.168.10.[0-9]{1,3}|192.168.20.[0-9]{1,3})/'
Ou plus simplement :
'/192.168.(0|10|20).[0-9]{1,3}/'
Voire :
'/192.168.[12]?0.[0-9]{1,3}/'


Malheureusement, non: l'exemple donné est assez mauvais, car il s'agit
en fait des IP des partenaires autorisés, donc les masques peuvent être
très différents (premier point) et la liste doit être facilement lisible
(gérée plus ou moins depuis un backoffice par des personnes peu qualifiées).

J'avais bien pensé à faire un preg_replace du genre:
preg_replace($hosts, "authorized", $tested_host);
Oui, c'est aussi une possibilité. Bien vérifier qu'il ne peut pas être

mis à "authorized" par le visiteur.


Bien sur: il n'y a rien de trop confidentiel, c'est bien de la
limitation d'accès et pas la mise en place d'un defcon :)

--
Astuces pour webmasters: http://www.crazycat.info
Tchat francophone: http://www.crazy-irc.net


Avatar
Olivier Miakinen

Et un pattern unique traitant tous les cas, ça ne t'irait pas ?
Par exemple le pattern suivant :
'/(192.168.0.[0-9]{1,3}|192.168.10.[0-9]{1,3}|192.168.20.[0-9]{1,3})/'
Ou plus simplement :
'/192.168.(0|10|20).[0-9]{1,3}/'
Voire :
'/192.168.[12]?0.[0-9]{1,3}/'


Malheureusement, non: l'exemple donné est assez mauvais, car il s'agit
en fait des IP des partenaires autorisés, donc les masques peuvent être
très différents (premier point) et la liste doit être facilement lisible
(gérée plus ou moins depuis un backoffice par des personnes peu qualifiées).


Rien ne t'empêche, malgré tout, d'en faire un masque unique en utilisant
la syntaxe /(masque1|masque2|masque3|...|masqueN)/ au lieu de faire N
tests successifs sur masque1, puis sur masque2, et ainsi de suite.
Ce masque unique peut même être stocké quelque part, si les masques
individuels changent rarement.


Avatar
CrazyCat
Rien ne t'empêche, malgré tout, d'en faire un masque unique en utilisant
la syntaxe /(masque1|masque2|masque3|...|masqueN)/ au lieu de faire N
tests successifs sur masque1, puis sur masque2, et ainsi de suite.
Ce masque unique peut même être stocké quelque part, si les masques
individuels changent rarement.


Oui, mais c'est relativement sale au niveau présentation du code.
Les personnes pouvant éditer ce code ne sont pas des développeurs, donc
un tableau bien présenté est plus facile à traiter :)

--
Astuces pour webmasters: http://www.crazycat.info
Tchat francophone: http://www.crazy-irc.net