Vaincre SVGCaptcha


79

Je suis tombé sur SVGCaptcha et j'ai tout de suite compris que c'était une mauvaise idée.

J'aimerais que vous montriez à quel point l'idée est mauvaise en extrayant le code de validation des images SVG que le code produit.


Un exemple d'image ressemble à ceci: Voici la source de l'exemple d'image:
8u4x8lf

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
        "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
    <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve"
             width="200" height="40"
    > <rect x="0" y="0" width="200" height="40" 
        style="stroke: none; fill: none;" >
        </rect> <text style="fill: #4d9363;" x="5" y="34" font-size="20" transform="translate(5, 34) rotate(-17) translate(-5, -34)">8</text>
<text style="fill: #be8b33;" x="125" y="29" font-size="21" transform="translate(125, 29) rotate(17) translate(-125, -29)">f</text>
<text style="fill: #d561ff;" x="45" y="35" font-size="20" transform="translate(45, 35) rotate(-2) translate(-45, -35)">4</text>
<text style="fill: #3de754;" x="85" y="31" font-size="21" transform="translate(85, 31) rotate(-9) translate(-85, -31)">8</text>
<text style="fill: #5ed4bf;" x="25" y="33" font-size="22" transform="translate(25, 33) rotate(16) translate(-25, -33)">u</text>
<text style="fill: #894aee;" x="105" y="28" font-size="25" transform="translate(105, 28) rotate(9) translate(-105, -28)">1</text>
<text style="fill: #e4c437;" x="65" y="32" font-size="20" transform="translate(65, 32) rotate(17) translate(-65, -32)">x</text>
</svg>

L'entrée est l'image SVG, qui est un format textuel.

La seule restriction réelle est que votre code doit générer les valeurs dans le bon ordre .
Les <text>éléments d' entrée sont dans un ordre aléatoire, vous devez donc faire attention à l' xattribut dans la <text>balise


Score est le nombre d'octets dans le code


Étant donné que le code effectue actuellement deux transformations qui s’annulent, vous pouvez les ignorer, mais si vous les prenez en considération, continuez et utilisez une réduction de 30% de votre score.


3
En réalité, vous n'avez pas indiqué explicitement les entrées et les sorties: je présume que le fichier SVG et les lettres qu'il contient sont? Et il m'est difficile de savoir si des réponses sont nécessaires pour implémenter réellement la spécification SVG ou si elles peuvent supposer que le SVG est généré par la version actuelle de SVGCaptcha et que les transformations peuvent donc être ignorées.
Peter Taylor

Je suggère de limiter la sortie à STDOUT ou à la valeur de retour de la fonction et d'en faire un code-golf
TheDoctor

1
Non, les questions ont besoin d'un critère gagnant objectif et quantifiable pour être sur le sujet de ce site.
Alex A.

7
Je ne sais pas à quel point le traitement des images est pertinent .
SuperJedi224

18
Cette question est maintenant le 4ème résultat lorsque nous recherchons 'svgcaptcha' sur Google
Bleu

Réponses:


18

Bash , 63 56 39 octets

cat<<_|grep -o 'x=.*>'|cut -c4-|sort -n|grep -o '>.</t'|cut -c2

grep -o 'x=.*>'|cut -c4-|sort -n|grep -o '>.</t'|cut -c2

grep -o 'x=.*<'|sort -k1.4n|rev|cut -c2

Remarque: il faut cat, grep , sort, revet cut. Prend les commentaires de stdin. La sortie est séparée par des sauts de ligne sur stdout. Assurez-vous d’appuyer sur CTRL + D (pas de COMMAND + D sur Mac) lorsque vous avez fini d’entrer le CAPTCHA. L'entrée doit être suivie d'une nouvelle ligne, puis de '_'.

EDIT : Sauvegardé 13 octets.

EDIT 2 : 20 octets sauvés grâce à @manatwork !


GNU coreutils sort supporte la position du caractère dans le keydef: cut -c4-|sort -nsort -k1.4n.
Manatwork

@manatwork Merci, j'ai mis à jour la réponse.
Coder256

13

CJam, 26 octets

q"x="/2>{'"/1=i}${'>/1=c}/

Essayez-le en ligne dans l' interprète CJam .

Comment ça fonctionne

q     e# Read all input from STDIN.
"x="/ e# Split it at occurrences of "x=".
2>    e# Discard the first two chunks (head and container).
{     e# Sort the remaining chunks by the following key:
  '"/ e#   Split at occurrences of '"'.
  1=  e#   Select the second chunk (digits of x="<digits>").
  i   e#   Cast to integer.
}$    e#
{     e# For each of the sorted chunks:
  '>/ e#   Split at occurrences of '>'.
  1=  e#   Select the second chunk.
  c   e#   Cast to character.
}/    e#

8

JavaScript, 95 93 91 octets

l=[],r=/x="(\d*).*>(.)/g;while(e=r.exec(document.lastChild.innerHTML))l[e[1]]=e[2];l.join``

edit: -2 octets passant documentRootà lastChild; -2 octets passant join('')à join``, merci Vɪʜᴀɴ

Entrez le code dans la console du navigateur sur une page contenant le fichier SVG en question, écrit dans la sortie de la console.


document.rootElementest réaccorder undefined. J'ai essayé Firefox et Safari
Version

Cela n'a été testé que dans Chrome, je vais regarder ce qui pourrait être changé.
Nickson

Cela semble fonctionner dans Firefox, SVG est-il le seul contenu du fichier?
Nickson

Ok, essayé dans Chrome, maintenant cela a fonctionné. +1 Vous pouvez également économiser deux octets en ('')remplaçant le en deux backticks: ``
Downgoat

Ceci est 78: t=>(l=[],r=/x="(\d*).*?>(.)/g,eval("while(e=r.exec(t))l[e[1]]=e[2];l.join``"))(prend la chaîne xml en paramètre, renvoie le texte captcha)
DankMemes

7

Perl, 40 octets

39 octets code + 1 pour -n

$a[$1]=$2 for/x="(.+)".+(.)</g}{print@a

Exemple:

perl -ne '$a[$1]=$2 for/x="(.+)".+(.)</g}{print@a' <<< '<example from above>'
8u4x81f

Homme qui est juste plein d'avertissements si vous les allumez. Excellente utilisation de la nature laxiste par défaut de Perl.
Brad Gilbert b2gills

@ BradGilbertb2gills Ouais, j'essaie de ne pas tester les avertissements, je suis tellement surpris que tout code de golf fonctionne même parfois!
Dom Hastings



3

Befunge, 79 octets

Il me semble qu’il devrait être possible de jouer au moins un octet de plus sur ce parcours, mais je travaille dessus depuis quelques jours maintenant, et c’est aussi bon que possible.

<%*:"~"*"~"_~&45*/99p1v-">":_|#`0:~<
#,:#g7-#:_@^-+*"x~=":+_~99g7p>999p#^_>>#1+

Essayez-le en ligne!

Explication

Code source avec les chemins d'exécution mis en évidence

*Définissez la direction d'exécution de droite à gauche et tournez-vous pour lancer la boucle principale.
*Lire un caractère à partir de stdin et tester la valeur de fin de fichier.
*Si ce n'est pas la fin du fichier, vérifiez si c'est un >.
*Si ce n'est pas un >, ajoutez-le à la valeur de la pile qui suit les deux derniers caractères et vérifiez si la paire actuelle correspond x=.
*Sinon, multipliez par 126 et modifiez par 126 2 pour supprimer la valeur la plus ancienne de la paire et faire de la place pour le caractère suivant.
*Retournez à nouveau pour répéter la boucle principale.
*Lorsqu'une x=paire est rencontrée, ignorez le caractère suivant (la citation), lisez un entier (la valeur x ) et divisez par 20. Il devient le décalage actuel qui est enregistré pour plus tard.
*Lorsqu’un >est rencontré, lisez le caractère suivant (généralement l’une des lettres captcha) et enregistrez-le au décalage actuel dans un "tableau". Réinitialisez le décalage à 9, afin que la lettre captcha ne soit pas écrasée lorsque des >caractères ultérieurs sont rencontrés.
*Enfin, lorsque la fin de fichier est atteinte, parcourez les 7 valeurs enregistrées dans le tableau et exportez-les une par une. Cela devrait vous donner toutes les lettres captcha dans le bon ordre.

Je passe en revue certains détails, car les chemins de code se chevauchent de manière un peu difficile à expliquer, mais cela devrait vous donner une idée générale du fonctionnement de l’algorithme.


2

Python2, 129 octets

import re,sys
print''.join(t[1] for t in sorted(re.findall(r'(\d+), -\d+\)"\>(.)\</t',sys.stdin.read()),key=lambda t:int(t[0])))

Prend la source HTML sur stdin, produit du code sur stdout.


Comment cela trie-t-il la sortie? Les <text>éléments sont dans un ordre aléatoire et la seule exigence réelle est de les placer dans le bon ordre. Cela signifie que vous devez utiliser le xde <text>et suivre toutes les transformations.
Brad Gilbert b2gills

@ BradGilbertb2gills J'ai raté ça la première fois, corrigé maintenant.
Orlp

2

Mathematica, 106 octets

""<>(v=ImportString[#~StringDrop~157,"XML"][[2,3,4;;;;2]])[[;;,3]][[Ordering[FromDigits/@v[[;;,2,2,2]]]]]&

Remarque: l'entrée doit être exactement dans le format spécifié par l'exemple.


2

V , 28 26 25 24 octets

d5j́x=
ún
J́">
lH$dÍî

Essayez-le en ligne!

Explication:

d5j              delete first 6 lines
   Í<0x81>x=     In every line, replace everything up to x=" (inclusive) by nothing
ún               Sort numerically
J                Join line (closing </svg>) with next line
 Í<0x81>">       In every line, replace everything up to "> by nothing
l␖H$d            Visual block around closing </text> tags, delete
     Íî          In every line, replace \n by nothing.

HexDump:

00000000: 6435 6acd 8178 3d0a fa6e 0a4a cd81 223e  d5j..x=..n.J..">
00000010: 0a6c 1648 2464 cdee                      .l.H$d..

2

QuadS , 49 octets

c[⍋⊃x c←↓⍎¨@1⍉(⊢⍴⍨2,⍨.5×≢)3↓⍵]
x="(\d+)
>(.)<
\1

Essayez-le en ligne!

Trouve les valeurs x (chiffres après x=") et les "lettres" (liées par des balises fermantes et ouvrantes), puis exécute la APL suivante (où est la liste des x valeurs et lettres trouvées, dans l'ordre d'apparition):

3↓⍵ déposez les trois premiers éléments (espaces autour <rect/rect>et la <rectvaleur 'sx).

() Applique la fonction tacite suivante à ce sujet:

 le nombre d'articles restants

.5× réduire de moitié cette

2,⍨ ajouter un deux

⊢⍴⍨ remodeler à cette forme (ie une matrice n × 2)

 transposer (sur une matrice 2 × n)

⍎¨@1 exécuter chaque chaîne de la première ligne (en les transformant en nombres)

 scinder la matrice en deux vecteurs (un par ligne)

x c← stocker ces deux en x (valeurs x) et c (caractères) respectivement

 choisissez le premier (x)

 améliorer le niveau (les indices dans x qui trieraient x)

c[… L' ] utiliser pour indexer dansc

ε nlist (aplatir) parce que chaque lettre est une chaîne par lui - même


L’expression APL équivalente de l’ensemble du programme QuadS est la suivante:

c[⍋⊃x c←↓⍎¨@1⍉(⊢⍴⍨2,⍨.5×≢)3'x="(\d+)"' '>(.)<'S'\1'⊢⎕]

1

Java 8, 197 173 octets

import java.util*;s->{String a[]=s.split("x=\""),r="";Map m=new TreeMap();for(int i=2;i<a.length;m.put(new Long(a[i].split("\"")[0]),a[i++].split(">|<")[1]));return m.values();}

Affiche un java.util.Collectiondes caractères.

Explication:

Essayez-le en ligne.

import java.util*;            // Required import for Map and TreeMap
s->{                          // Method with String as both parameter and return-type
  String a[]=s.split("x=\""), //  Split the input by `x="`, and store it as String-array
         r="";                //  Result-String, starting empty
  Map m=new TreeMap();        //  Create a sorted key-value map
  for(int i=2;                //  Skip the first two items in the array,
      i<a.length;             //  and loop over the rest
    m.put(new Long(a[i].split("\"")[0]),
                              //   Split by `"` and use the first item as number-key
          a[i++].split(">|<")[1]));
                              //   Split by `>` AND `<`, and use the second item as value
    return m.values();}       //  Return the values of the sorted map as result

1

Gema , 65 caractères

x\="<D>*\>?=@set{$1;?}
?=
\Z=${5}${25}${45}${65}${85}${105}${125}

À Gema, il n'y a pas de tri, mais heureusement, ce n'est même pas nécessaire.

Échantillon échantillon:

bash-4.4$ gema 'x\="<D>*\>?=@set{$1;?};?=;\Z=${5}${25}${45}${65}${85}${105}${125}' < captcha.svg
8u4x81f

1

XMLStarlet , 46 caractères

xmlstarlet sel -t -m //_:text -s A:N:U @x -v .

Espérons que cette solution est valide car XMLStarlet est un transpiler qui génère et exécute le code XSLT, qui est un langage complet de Turing.

Échantillon échantillon:

bash-4.4$ xmlstarlet sel -t -m //_:text -s A:N:U @x -v . < captcha.svg 
8u4x81f

1

PHP, 96 octets

Étant donné que $ic'est la chaîne d'entrée

preg_match_all('|x="(\d+).*(.)\<|',$i,$m);$a=array_combine($m[1],$m[2]);ksort($a);echo join($a);

1
Au lieu de array_combine()+ ksort()vous pouvez utiliser array_multisort()comme ceci: array_multisort($m[1],$m[2]);echo join($m[2]);. Cependant, veuillez noter que les solutions doivent gérer les entrées et les sorties elles-mêmes (à moins que la langue ne le fasse automatiquement), au lieu de rechercher l'entrée dans une variable ou de simplement laisser le résultat dans une variable. Voir les méta liés .
Manatwork

1

Propre , 277 150 octets

Yay motif correspondant!

import StdEnv,StdLib
?s=map snd(sort(zip(map(toInt o toString)[takeWhile isDigit h\\['" x="':h]<-tails s],[c\\[c:t]<-tails s|take 7 t==['</text>']])))

Essayez-le en ligne!

Définit la fonction ?, en prenant [Char]et en donnant [Char].

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.