Aller au contenu

[challenge] String pour injection


Fraid

Messages recommandés

Bonjour,

Je viens de me souvenir d'un challenge perso qui m'avais bien tordu l'esprit.

Convertir un texte pour injection d'URL. (ou requete HTML).

Lorsque nous tapons une adresse internet dans la barre d'adresse d'un navigateur, c'est une injection.

Exemple simple "https://www.openstreetmap.org/#map=16/48.4674/-2.5486"

Ici nous arrivons directement au coordonnées injectées.

Mais lorsque nous utilisons une URL en programmation, nous utilisons pas la barre du navigateur, cela va directement au serveur.

Si l'injection contient des caractères spéciaux il faut les convertir en Caractères hexadécimales.

Exemple "https://fr.wikipedia.org/wiki/Saint-Barthélemy-d'Anjou" doit devenir "https://fr.wikipedia.org/wiki/Saint-Barth%C3%A9lemy-d'Anjou"

ou  "aB 09_éùl'o @£" -> "aB%2009_%C3%A9%C3%B9l'o%20%40%C2%A3"

Il existe des fonctions ou méthodes dans beaucoup de langage qui s'occupe très bien de cela, mais pas en Autolisp.

Je me permet donc de vous proposer d'écrire l'équivalent de ces 2 fonctions Javascript

encodeURIComponent

decodeURIComponent

Évidement sans énumération telle que '(("é" . "%C3%A9") ...)

Je poste mes fonctions Dimanche soir.

bonne exploration et à bientôt.

Lien vers le commentaire
Partager sur d’autres sites

Salut,

Si je ne me trompe pas, il y a une petite coquille dans l'exemple :
"aB 09_éùl'o @£" -> "aB%2009_%C3%A9%C3%B9l'o%20%40%C2%A3"
le résultat devrait plutôt être : "aB%2009_%C3%A9%C3%B9l%27o%20%40%C3%63" (encodage de l'apostrophe qui est un caractère réservé).

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Malheureusement, il n'y a pas de consensus, et il y a quelque différence, selon les langages.

C'est pourquoi j'ai donné en exemple celle du Javascript, pour qu'on partent sur la même chose.

si tu vas voir le lien fournis, les caractères spéciaux ignorés sont "- _ . ! ~ * ' ( )"

 

Lien vers le commentaire
Partager sur d’autres sites

Coucou @Fraid,

Il y a une chose que je n'arrive pas bien à comprendre sur la valeur des caractères... Si on fait un rapide check j'ai :

Ecriture décimale = (ascii "é") -> 233
Ecriture binaire = (itob 233) -> ("1110 1001" (1 1 1 0 1 0 0 1))
Ecriture héxadécimale = "1110" -> "E" et "1001" -> "9"
Soit plus rapidement, (base 16 (ascii "é")) -> "E9"

Or ici l'encodage veut "é" -> "%C3%A9%" donc ma question c'est à quelle base cet encodage fait-il référence pour passer de "E9" en "C3A9" ?

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Ok, tu t'éloigne un petit peu.

On s’occupe que de la partie injection. (après le dernier / )

dans l'absolue, si on encode tous les caractères, c'est évidement accepté par le serveur.

Mais la, le but, est de garder une lisibilité par un être humain de l'injection.

Je vais reformuler le challenge en oubliant le javascript.

Convertir les caractères spéciaux excepté  "- _ . ! ~ * ' ( )" en caractères hexadécimal pour UTF-8

voir lien donné à Luna + haut.

 

Lien vers le commentaire
Partager sur d’autres sites

1 hour ago, Fraid said:

Ok, tu t'éloigne un petit peu.

Je n'avais pas l'impression :

On 01/04/2021 at 10:53, Fraid said:

Est-ce que les fonctions urlEncode et urlDecode définies dans le FAS attaché répondent à la demande ? J'attends pour poster le code .

_$ (urlEncode "https://fr.wikipedia.org/wiki/Saint-Barthélemy-d'Anjou")
"https://fr.wikipedia.org/wiki/Saint-Barth%C3%A9lemy-d'Anjou"
_$ (urlDecode "https://fr.wikipedia.org/wiki/Saint-Barth%C3%A9lemy-d'Anjou")
"https://fr.wikipedia.org/wiki/Saint-Barthélemy-d'Anjou"
_$ (urlEncode "aB 09_éùl'o @£")
"aB%2009_%C3%A9%C3%B9l'o%20@%C2%A3"
_$ (urlDecode "aB%2009_%C3%A9%C3%B9l'o%20@%C2%A3")
"aB 09_éùl'o @£"

url_encode_decode.fas

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Comme promis

(defun encodeURI (str / ind ret pre)
    (setq ret "" pre "")
    (if (and str (> (strlen str) 0))
        (progn 
            (if (and (> (strlen str) 6)(= (substr str 1 6)) "https:") 
                (setq pre (substr str 1 (1+ (vl-string-position (ascii "/") str nil T)))
                      str (substr str (1+(strlen pre)) (strlen str))
                )
            )
            (foreach cod (vl-string->list str)
                (cond   ( (or (and (>= cod 48)(<= cod 57))
                              (and (>= cod 65)(<= cod 90))
                              (and (>= cod 97)(<= cod 122))
                              (member cod (vl-string->list "-_.!~*'()")) 
                          )
                          (setq  ret (strcat ret (chr cod)))
                        )
                        ((< cod 128) (setq  ret (strcat ret "%"(dec2hex cod))))
                        ((> cod 127) (setq  ind  (/ (- cod 128) 64)
                                            ret (strcat ret "%C" (itoa(+ ind 2)) "%" (dec2hex (- cod (* ind 64))))
                                     )
                        )
                )
            )
        )
        (setq ret nil)
    )
    (if ret (strcat pre ret) ret)
)
(defun decodeURI (str / ret pre hex flag ind)
    (setq ret "" pre "" hex "")
    (if (and str (> (strlen str) 0))
        (progn 
            (if (and (> (strlen str) 6)(= (substr str 1 6)) "https:") 
                (setq pre (substr str 1 (1+ (vl-string-position (ascii "/") str nil T)))
                      str (substr str (1+(strlen pre)) (strlen str))
                )
            )
            (foreach char (mapcar 'chr (vl-string->list str))
                (cond   ((and (null flag)(/= char "%")) (setq ret (strcat ret char)))
                        ((and (null flag)(= char "%"))(setq flag 0))
                        ((and (= flag 0)(= char "C"))(setq flag 1))
                        ((and (= flag 0)(null ind))
                                (setq hex (strcat hex char))
                                (if (= (strlen hex) 2)
                                    (setq ret (strcat ret (chr (hex2dec hex))) flag nil hex "")
                                )
                        )
                        ((= flag 0)
                            (setq hex (strcat hex char))
                            (if (= (strlen hex) 2)
                                (setq ret (strcat ret (chr (+ (hex2dec hex) (* 64 ind)))) flag nil hex "" ind nil)
                            )
                        )   
                        ((= flag 1)(setq ind (-(atoi char)2) flag nil))     
                )
            )
        )
        (setq ret nil)
    )
    (if ret (strcat pre ret) ret)
)
;cadxp
(defun hex2dec (str / n s)
  (setq n (strlen str))
  (if (zerop n)
    n
    (+ (* (if (numberp (read (setq s (substr str 1 1))))
            (atoi s)
            (- (ascii (strcase s)) 55)
          )
          (expt 16 (1- n))
       )
       (hex2dec (substr str 2))
    )
  )
)
(defun dec2hex (nb / sub)
  (defun sub (nb n / r d)
    (if (= 0 (/ nb (expt 16 n)))
      ""
      (progn
        (setq r (rem nb (expt 16 (1+ n))))
        (strcat
          (sub (- nb r) (1+ n))
          (if (< (setq d (/ r (expt 16 n))) 10)
            (itoa d)
            (chr (+ 55 d))
          )
        )
      )
    )
  )
  (sub nb 0)
)

je comprend que cela ne passionne pas grand monde...

Lien vers le commentaire
Partager sur d’autres sites

Ma copie :
 

(defun hex->dec (s / f)
  (defun f (l a / c)
    (if	(setq c (car l))
      (f (cdr l)
	 (+ (cond ((< 96 c 103) (- c 87))
		  ((< 64 c 71) (- c 55))
		  ((< 47 c 58) (- c 48))
	    )
	    (lsh a 4)
	 )
      )
      a
    )
  )
  (f (vl-string->list s) 0)
)

(defun dec->hex (n)
  (cond
    ((< 15 n) (strcat (dec->hex (lsh n -4)) (dec->hex (rem n 16))))
    ((< n 10) (itoa n))
    (T (chr (+ n 55)))
  )
)

(defun urlEncode (url / f xpt)
  (defun f (l)
    (if	l
      (strcat
	(cond
	  ((or (< 47 (car l) 58)	; [0-9]
	       (< 64 (car l) 91)	; [A-Z]
	       (< 96 (car l) 123)	; [a-z]
	       (member (car l) xpt)	; caractères spéciaux non encodés
	   )
	   (chr (car l))
	  )
	  ((< (car l) 128)
	   (strcat "%" (dec->hex (car l)))
	  )
	  ((< (car l) 192)
	   (strcat "%C2%" (dec->hex (car l)))
	  )
	  ((< (car l) 256)
	   (strcat "%C3%" (dec->hex (- (car l) 64)))
	  )
	)
	(f (cdr l))
      )
      ""
    )
  )
  (setq	xpt
	 (vl-string->list "-_.!~*'()")  ; JScript
	 ;;(vl-string->list "-._~")       ; the Internet Society
	 ;;(vl-string->list "-_.!*()")    ; .NET	 
  )
  (f (vl-string->list url))
)

(defun urlDecode (url / f)
  (defun f (l)
    (cond
      ((null l) nil)
      ((= (car l) 37)			; "%"
       (cond
	 ((and (= (cadr l) 67)		; "%C3"
	       (= (caddr l) 51)
	  )
	  (cons	(+ 64
		   (hex->dec	(strcat	(chr (car (cddddr l)))
				(chr (cadr (cddddr l)))
			)
		   )
		)
		(f (cddr (cddddr l)))
	  )
	 )
	 ((and (= (cadr l) 67)		; "%C2"
	       (= (caddr l) 50)
	  )
	  (cons	(hex->dec (strcat (chr (car (cddddr l)))
			     (chr (cadr (cddddr l)))
		     )
		)
		(f (cddr (cddddr l)))
	  )
	 )
	 (T
	  (cons	(hex->dec (strcat (chr (cadr l))
			     (chr (caddr l))
		     )
		)
		(f (cdddr l))
	  )
	 )
       )
      )
      (T (cons (car l) (f (cdr l))))
    )
  )
  (vl-list->string (f (vl-string->list url)))
)

 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Jolie récursivité

Je vois que tu as émit d'autre liste d'exception,

il y en a d'autre encore...

cela doit dépendre du langage qui tourne sur le serveur qui héberge la page (php, java, phyton ..)

Je pense, après coup, que pour rendre plus générique ces fonctions

qu'il faudrait mettre cette liste en argument

Lien vers le commentaire
Partager sur d’autres sites

20 hours ago, Fraid said:

je comprend que cela ne passionne pas grand monde...

Bonjour Fraid,

Pour ma part ce n'était pas un problème de passion, juste que le challenge proposé faisait appel à des connaissances que je n'avais pas sur le sujet, donc j'avoue que pour participer cela m'aurait demandé un peu (beaucoup) de recherche pour que je puisse me mettre au niveau de la difficulté à relever. Sur ce coup, j'ai préféré passer mon tour une prochaine fois peut-être.

Personnellement je te remercie tout de même de l'avoir posé car qui sait si un jour je veux jouer avec des url ce post sera une bonne base de départ.

Salutations Bruno

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité