Je sais que vous avez toujours pensé aux épreuves et aux tribulations de l'expérience des joies de la vie en tant que proxy Web. Honnêtement, qui ne l'a pas fait? Aujourd'hui, vous êtes chargé de réaliser cet objectif (au moins une partie de celui-ci). Le site Web X reçoit beaucoup de trafic quotidiennement et recherche un PaaS (il s'agit clairement de Proxy as a Service) en raison du grand nombre d'utilisateurs qui insistent pour transmettre des informations sensibles via des paramètres de requête (les utilisateurs sont stupides). Votre tâche consiste à supprimer tous les paramètres de requête sensibles de la demande avant de transmettre la demande à sa destination d'origine.
Contribution
- Une URL HTTP absolue bien formée qui suit la grammaire URI de la section 3 de la RFC3986 .
- Vous pouvez supposer qu'il n'y a pas de fragment
- Exemple de format bref où quelque chose entre crochets indique facultatif:
http[s]://[user:pass@]host.name.com[:port]/[?param1=value1¶m2=value2...]
- Une liste des paramètres de requête à supprimer.
Production
L'URL HTTP modifiée sans les paramètres définis dans la liste d'entrée.
Exemples
http://example.com/ [foo]
> http://example.com/
http://example.com/?foo=bar []
> http://example.com/?foo=bar
http://example.com/ []
> http://example.com/
http://example.com/?foo=1&bar=2&baz=3 [foo,baz]
> http://example.com/?bar=2
http://example.com/?foo=1&bar=2&baz=3 [foo,bar,baz]
> http://example.com/
http://example.com/?foo&bar=2&baz= [foo,baz]
> http://example.com/?bar=2
http://example.com/?abc=1&def=2&baz=foo [foo,bar]
> http://example.com/?abc=1&def=2&baz=foo
http://example.com/?foobar=baz [foo]
> http://example.com/?foobar=baz
http://foo:[email protected]:8080/?foo=1&bar=foo [foo]
> http://foo:[email protected]:8080/?bar=foo
Notation
Il s'agit de code-golf , donc la réponse la plus courte (en octets) l'emporte.
&
apparaître ailleurs qu'entre les paramètres??
? La commande doit-elle également être conservée telle quelle?&
fait partie d'un paramètre de requête, il doit être correctement encodé comme%26
http://foo:&[email protected]:8080/?foo=1&bar=foo
est autorisé par le RFC. Cela devrait casser un tas de solutions existantes. : D (La règle est que userinfo peut être développé comme non réservé ou pct-escape ou sous-délimités, et les sous-délimitations peuvent avoir&
et=
)Réponses:
GNU sed
98 96 88 80 77 74 69 59 54(48 + 1 pour -r) 49La liste des paramètres à supprimer est séparée par des espaces.
la source
&
ou un?
caractère dans l'URL résultante.JavaScript (ES6),
6260 octetsEdit: sauvé 2 octets grâce à @Shaggy.
la source
.href
à la fin.alert
utilisez ou l'insérez dans un nœud (texte), comme vous l'avez fait, cela vous donnera lahref
propriété de l'objet. Si vous le connectez à la console, cependant, cela vous donnera l'objet complet. Voir ce violon .PHP, 90 octets
-11 octets si? ou & est autorisé à la fin
Version précédente 140 octets
la source
^
/(.*|$)
fera partie de la première / dernière alternative..*
. ou remplacez(=.*|$)
par\b
(-5).#^foo|bar(=.*|$)#
qui est identique à#(^foo)|(bar=.*|bar$))#
. Mais ça devrait l'être#(foo|bar)(=.*|$)#
.array_map
(et j'ai été surpris de voir à quel point cela peut se révéler).PHP,
120110 octetsavec les fonctions preg_replace et array: (inspiré par Jörg )
enregistrer dans un fichier, appeler avec
php <scriptname> <uri> <parametername> <parametername> ...
avec parse_str et http_build_query (120 octets):
courir avec
php -r <code> <uri> <parametername> <parametername> ...
la source
parse_str
?http_build_query
? Je suis tellement heureux de voir quelqu'un travailler avec les bons outils pour le travail, même dans le golf de code. Les bogues qui surviennent parce que les requêtes URL / SQL / regexp / HTML ne sont "que des chaînes" sont aussi nombreux qu'ils sont facilement évitables.Java 7, 127 octets
Explication
Ideone
la source
C #,
377336330328 octets (173 alt)Programme complet non golfé:
Probablement pas très efficace, mais ça marche je pense.
Alternativement, il existe une solution de 173 octets utilisant la méthode @ Poke de Java. Nécessite une importation pour Regex, donc ne peut probablement pas être plus court.
la source
Rubis,
146 140 127 119 119 116113 octetsedit 2: enregistré 6 octets en utilisant
$1
,$2
, et$*
, et 7 en changeantx.split("=")[0]
pourx[/\w+/]
modifier 3: enregistré 6 octets en utilisant à la
*
place de.join
, économisé 2 octets à partir d' espaces inutilesmodifier 4: enregistré 3 octets en reformulant ligne (regex changé en équivalent
$*[1][/([^?]*)\??(.*)/,1]
et mis comme assigné àa
)modifier 5: enregistré 3 octets en utilisant
($*[2].scan(r=/\w+/)&[x[r]])[0]
au lieu de$*[2].scan(r=/\w+/).include?(x[r])
En supposant une entrée dans le programme lors de son exécution:
Explication
Cela analyse l'URL indiquée sur la ligne de commande et stocke les correspondances dans
$1
et$2
.$*[1][/([^?]*)\??(.*)/,1]
renvoie également la première correspondance à stocker à l'intérieura
, tandis que la deuxième correspondance est appelée$2
laisser un point à 1 $ et analyserb
dans un tableau de tableaux ...... rejetant tout cela ...
... avoir une chaîne avant le '=' qui est incluse dans la liste des noms donnée par le deuxième paramètre ... Cela fonctionne parce que nous recherchons des mots (pour obtenir la liste) puis obtenons le mot avant le
=
, et voyons si ce mot est dans la liste avec&
. Puisque&
renvoie un tableau vide sur "non trouvé" (l'ensemble nul), nous utilisons l'astuce expliquée ci-dessous pour savoirnil
s'il n'y a aucun élément dans le tableau. sinon, nous renvoyons une chaîne, qui compte comme véridique, qui rejette cette chaîne.... et joignez les chaînes restantes avec '&'
À ce stade,
b
est la chaîne de requête GET pour l'URL. Il suffit donc de l'imprimer.Cela utilise une astuce en rubis.
b[0]
seranil
si b est un tableau ou une chaîne vide. Donc, si c'est vrai , (pasnil
oufalse
), alors il y a au moins un élément dans le tableau, nous devons donc mettrea+"?"+b
l'URL correcte. sinon, on met justea
, car il n'y a pas de paramètres à afficherRemarque: cette réponse suppose qu'il
?
ne peut apparaître nulle part, sauf pour délimiter l'URL de la requête. (selon ce que j'ai lu du RFC lié)Aussi, ceci est ma première réponse de golf: D
la source
Pip , 46 octets
Prend l'URL de stdin et les paramètres de requête à supprimer des arguments de ligne de commande.
Essayez-le en ligne!
Explication:
la source
PowerShell v3 +,
11590 octetsPrend l'entrée
$n
comme URL et$z
comme un tableau littéral de chaînes comme paramètres à supprimer.-split
s l'URL d'entrée?
, stocke la première moitié dans$a
et la seconde dans$b
.Ensuite,
$b
est reformulé en effectuant une boucle$z
, en effectuant une expression régulière-replace
sur chaque mot de requête interdit pour les supprimer. Ensuite, les sorties$a
(non modifiées), plus un/
selon qu'il$b
existe, plus un?
selon qu'il$x
existe, plus `$ x.la source
Pyth - 27 octets
Kenny avait raison quand il a parlé de l'intégration pour transformer puis inverser, il sera très difficile de redresser, cependant.
Suite de tests .
la source
Rétine ,
4448 octetsBarré 44 est toujours 44. Merci à Martin pour le correctif.
Prend l'entrée comme
uri param1 param2
.Essayez-le en ligne!Explication
Le premier remplacement supprime les paramètres appropriés de la chaîne de requête.
[?&](?>([^ =&+))[^ &]*
correspond à un?
ou à&
un nom de paramètre complet et (éventuellement)=
et à une valeur, stockant le nom du paramètre dans le groupe de capture 1. Puis(?=.* \1( |$))
un indicateur de recherche vérifie si ce nom de paramètre apparaît dans la liste des paramètres à supprimer. Si un paramètre correspond à ces conditions, il est supprimé (remplacé par un remplacement vide).Les substitutions ne se chevauchent pas (grâce à l'anticipation) et se déroulent de gauche à droite. À la fin de l'URL, la
.*
branche correspond à la liste des paramètres à supprimer et la supprime également.Le deuxième remplacement s'assure simplement que la nouvelle chaîne de requête commence par
?
si le premier paramètre a été supprimé.la source
(?>...)
.Java 7, 203 octets
Non golfé:
Cette fonction réussit tous les tests.
la source
Python,
7581112 octets:Une fonction nommée. Prend entrée au format
et sort une chaîne.
Repl.it avec tous les cas de test!
la source
PHP, pas en compétition
Heck, PHP a été fait pour cela; pourquoi ne pas utiliser l'URL réelle?
Enregistrer dans un fichier, appeler avec la chaîne de requête souhaitée plus
&x[]=x&x[]=<exclude1>&x[]=<exclude2>&...
.Peut échouer sur le nom d'utilisateur et le mot de passe (selon que votre navigateur les supprime ou non).
Est-ce que l' échec si le mot de passe est
0
.la source