Fraid Posté(e) le 1 avril 2021 Posté(e) le 1 avril 2021 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. https://github.com/Fraiddd
(gile) Posté(e) le 2 avril 2021 Posté(e) le 2 avril 2021 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
Fraid Posté(e) le 2 avril 2021 Auteur Posté(e) le 2 avril 2021 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 "- _ . ! ~ * ' ( )" https://github.com/Fraiddd
Fraid Posté(e) le 2 avril 2021 Auteur Posté(e) le 2 avril 2021 et j'ai oublié de préciser que l'espace peut etre "%20" ou "+", les 2 fonctionnent https://github.com/Fraiddd
(gile) Posté(e) le 2 avril 2021 Posté(e) le 2 avril 2021 Donc, il s'agit d'implémenter en AutoLISP l'équivalent de la fonction JavaScript encodeURI (et pas encodeURIComponent). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Fraid Posté(e) le 2 avril 2021 Auteur Posté(e) le 2 avril 2021 non, c'est bien encodeURIComponent, encodeURI converti tout les caractères. https://github.com/Fraiddd
Luna Posté(e) le 2 avril 2021 Posté(e) le 2 avril 2021 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
Fraid Posté(e) le 2 avril 2021 Auteur Posté(e) le 2 avril 2021 bonjour Luna un petit lien pour comprendre caracteres et oui, ce challenge demande un peu de recherche https://github.com/Fraiddd
(gile) Posté(e) le 2 avril 2021 Posté(e) le 2 avril 2021 1 hour ago, Fraid said: non, c'est bien encodeURIComponent, encodeURI converti tout les caractères. Si j'en crois la page donnée en lien : Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Fraid Posté(e) le 2 avril 2021 Auteur Posté(e) le 2 avril 2021 je ne comprend pas... https://github.com/Fraiddd
(gile) Posté(e) le 2 avril 2021 Posté(e) le 2 avril 2021 encodeUriComponent encode les caractères réservés, encodeURI ne les encode pas. Regarde plus bas dans la page : Description Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Fraid Posté(e) le 2 avril 2021 Auteur Posté(e) le 2 avril 2021 avec une autre console https://github.com/Fraiddd
(gile) Posté(e) le 2 avril 2021 Posté(e) le 2 avril 2021 Essaye avec une url complète. La fonction encodeURIComponent encode les ':' et '/' (%3A et %2F), la fonction encodeURI ne les encode pas. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Fraid Posté(e) le 2 avril 2021 Auteur Posté(e) le 2 avril 2021 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. https://github.com/Fraiddd
(gile) Posté(e) le 2 avril 2021 Posté(e) le 2 avril 2021 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: Exemple "https://fr.wikipedia.org/wiki/Saint-Barthélemy-d'Anjou" doit devenir "https://fr.wikipedia.org/wiki/Saint-Barth%C3%A9lemy-d'Anjou" 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
Fraid Posté(e) le 2 avril 2021 Auteur Posté(e) le 2 avril 2021 t'est vraiment super rapide gile, impressionnant !!!! cela fonctionne très bien. j'avais mis 3 jours... étrangement j'ai plus galéré avec le décode que l'encode. https://github.com/Fraiddd
Fraid Posté(e) le 4 avril 2021 Auteur Posté(e) le 4 avril 2021 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... https://github.com/Fraiddd
(gile) Posté(e) le 4 avril 2021 Posté(e) le 4 avril 2021 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
Fraid Posté(e) le 4 avril 2021 Auteur Posté(e) le 4 avril 2021 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 https://github.com/Fraiddd
VDH-Bruno Posté(e) le 5 avril 2021 Posté(e) le 5 avril 2021 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
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant