• STATISTIQUES
  • Il y a eu un total de 2 membres et 13657 visiteurs sur le site dans les dernières 24h pour un total de 13 659 personnes!


    Membres: 2 433
    Discussions: 3 585
    Messages: 32 832
    Tutoriels: 78
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [EN] Gekko
    Site de challenge présenter sous la forme d'une quête. Vous êtes un agent secret qui répond sous le nom...
    Challenges
    [EN] Bright Shadows
    JavaScript: 13, Exploit: 27, Crypto: 69, CrackIt: 52, Stegano: 67, Flash: 3, Programming: 16, Java-Applet: 10, Logic: 20...
    Challenges
    [EN] Hack this site
    Basic: 11, Realistic: 17, Application: 18, Programming: 12, Extbasic: 14, Javascript: 7, Stego: 17
    Challenges
    [FR] Le site du zero
    Découvrez gratuitement la programmation (C, C++, PHP, MySQL, XHTML, CSS...), Linux, le Mapping, la modé...
    Programmation
    [EN] wechall
    Pour les gens n'étant pas familiers avec les sites de challenges, un site de challenges est un site propos...
    Hacking
    [EN] Astalavista
    Un site aux ressources incontournable depuis plusieurs années, Astalavista est réellement devenue un cl...
    Hacking
    [EN] Security Traps
    Site de challenge qui prétend être construit non pas dans le but de parfaire vos connaissances, mais plutôt dan...
    Challenges

  • DONATION
  • Si vous avez trouvé ce site internet utile, nous vous invitons à nous faire un don du montant de votre choix via Paypal. Ce don servira à financer notre hébergement.

    MERCI!




Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
validation d'une saisie utilisateur avec wildcard autorisé
11-01-2015, 22h53 (Modification du message : 11-01-2015, 22h54 par gruik.)
Message : #1
gruik Hors ligne
gouteur de savon
*



Messages : 757
Sujets : 44
Points: 482
Inscription : Oct 2012
validation d'une saisie utilisateur avec wildcard autorisé
dans un script je check un paramètre utilisateur, lequel paramètre est censé être une adresse IP plus ou moins complète avec éventuellement un (unique) wildcard
le wildcard c'est classiquement l'astérisque '*', et on ne cherche *pas* à vérifier que chaque nombre composant l'IP est dans l'intervalle qui convient [0-255], on se contente de valider que le nombre comporte au maximum 3 chiffres significatifs (donc [0-999])

du coup les saisies suivantes sont correctes :
Code :
1.1.1.1
1.1.1.*
712.999.*
*
*.5.18.3
*.817

tandis que les saisies suivantes sont invalides :
Code :
*.*
5.*.*.*
*.940.*
**
1.2.3.4.5
1.2.*.4  <-- le wildcard ne peut etre qu'au debut ou a la fin
1.2.3.
1.2

voila et je cherche à valider ça à travers une regex, évidement Big Grin
Avant donc que d'écrire, apprenez à penser.
Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure.
Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément.
(Nicolas Boileau, L'Art poétique)
+1 (0) -1 (1) Répondre
20-01-2015, 01h09
Message : #2
Yttrium Hors ligne
Membre actif
*



Messages : 106
Sujets : 14
Points: 48
Inscription : Jul 2012
RE: validation d'une saisie utilisateur avec wildcard autorisé
Alors je ne sais pas si je vais t'aider avec ce que je vais dire, mais au pire, ça servira juste a rien Wink

Théoriquement tu peux faire une condition :

(?(?=regex)then|else)

Donc un truc du style (? (?=\*) *.[0-999].[0-999].[0-999] | [0-999].[0-999].[0-999].[*0-999])

Mais vu que je suis une bille en regex, je sais que la mienne ne fonctionne pas, mais l'idée est peut être intéressante ? ou totalement con x)
BufferoverfloW

Всё минется, одна правда останется
+1 (0) -1 (0) Répondre
20-01-2015, 10h00
Message : #3
gruik Hors ligne
gouteur de savon
*



Messages : 757
Sujets : 44
Points: 482
Inscription : Oct 2012
RE: validation d'une saisie utilisateur avec wildcard autorisé
oui en fait je pense qu'il faut découper en 3 cas distincts
- la chaine contient un wildcard au debut
- la chaine ne contient pas de wildcard
- la chaine contient un wildcard à la fin

chaque cas séparé effectivement par un |, ça fait un truc un peu à rallonge mais bon

la chaine contient un wildcard au début : ^\*(?:\.[0-9]{1,3}){0,3}$
la chaine ne contient pas de wildcard : ^[0-9]{1,3}(?:\.[0-9]{1,3}){3}$
la chaine contient un wildcard à la fin : ^(?:[0-9]{1,3}\.){0,3}\*$

donc la regex complète serait un truc du genre :
^\*(?:\.[0-9]{1,3}){0,3}$|^[0-9]{1,3}(?:\.[0-9]{1,3}){3}$|^(?:[0-9]{1,3}\.){0,3}\*$

la vérification :
Code BASH :
$ cat vrai
1.1.1.1
1.1.1.*
712.999.*
*
*.5.18.3
*.817
$ diff -s vrai <(grep -P '^\*(?:\.[0-9]{1,3}){0,3}$|^[0-9]{1,3}(?:\.[0-9]{1,3}){3}$|^(?:[0-9]{1,3}\.){0,3}\*$' vrai)
Les fichiers vrai et /dev/fd/63 sont identiques
$ cat faux
*.*
5.*.*.*
*.940.*
**
1.2.3.4.5
1.2.*.4
1.2.3.
1.2
$ grep -P '^\*(?:\.[0-9]{1,3}){0,3}$|^[0-9]{1,3}(?:\.[0-9]{1,3}){3}$|^(?:[0-9]{1,3}\.){0,3}\*$' faux || echo "no match"
no match
Avant donc que d'écrire, apprenez à penser.
Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure.
Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément.
(Nicolas Boileau, L'Art poétique)
+1 (2) -1 (1) Répondre
20-01-2015, 10h41 (Modification du message : 20-01-2015, 10h43 par b0fh.)
Message : #4
b0fh Hors ligne
Membre actif
*



Messages : 210
Sujets : 17
Points: 309
Inscription : Jul 2012
RE: validation d'une saisie utilisateur avec wildcard autorisé
Hello,

Je te propose la regex suivante, de longueur a peu près comparable:

Code :
~$ grep -P '^\*(?:\.\d{1,3}){0,3}$|^\d{1,3}\.(?:\*|\d{1,3}\.(?:\*|\d{1,3}\.(?:\*|\d{1,3})))$' <<TEST
1.1.1.1
1.1.1.*
712.999.*
*
*.5.18.3    
*.817
*.*
5.*.*.*
*.940.*
**
1.2.3.4.5
1.2.*.4
1.2.3.
1.2
TEST

Donne

Code :
1.1.1.1
1.1.1.*
712.999.*
*
*.817

J'ai gagné un peu d'espace en remplaçant [0-9] par \d, j'en ai un peu perdu en fusionnant tes cas 2 et 3 et en développant les branches à la main. Ceci permet d'éviter trop de backtracking. Dans le cas le plus marqué, on observe un gain de 40% (mais sûrement beaucoup moins sur un cas moyen)

Code :
$ export RE_GRUIK='^\*(?:\.[0-9]{1,3}){0,3}$|^[0-9]{1,3}(?:\.[0-9]{1,3}){3}$|^(?:[0-9]{1,3}\.){0,3}\*$'
$ export RE_MAC='^\*(?:\.\d{1,3}){0,3}$|^\d{1,3}\.(?:\*|\d{1,3}\.(?:\*|\d{1,3}\.(?:\*|\d{1,3})))$'
$ yes '999.999.999.*' |head -n 6553600 >prout
$ time grep -P $RE_GRUIK prout >/dev/null

real    0m4.521s
user    0m4.497s
sys    0m0.024s
$ time grep -P $RE_MAC prout >/dev/null

real    0m2.567s
user    0m2.545s
sys    0m0.020s
+1 (3) -1 (0) Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 3 visiteur(s)
N-PN
Accueil | Challenges | Tutoriels | Téléchargements | Forum | Retourner en haut