Wiem, że zawsze myślałeś o próbach i udrękach związanych z doświadczaniem radości życia jako internetowy serwer proxy. Szczerze mówiąc, kto nie? Dziś masz za zadanie zrealizować ten cel (przynajmniej jego część). Witryna X codziennie dostaje duży ruch i szuka PaaS (wyraźnie odnosi się to do serwera proxy jako usługi) ze względu na dużą liczbę użytkowników, którzy nalegają na przekazywanie poufnych informacji za pomocą parametrów zapytań (użytkownicy są głupi). Twoim zadaniem jest usunięcie wszystkich wrażliwych parametrów zapytania z żądania przed przekazaniem żądania do pierwotnego miejsca docelowego.
Wejście
- Dobrze sformułowany bezwzględny adres URL HTTP zgodny z gramatyką URI w RFC3986 sekcja 3 .
- Możesz założyć, że nie ma fragmentu
- Krótki przykład formatu, w którym cokolwiek w nawiasach kwadratowych oznacza opcjonalne:
http[s]://[user:pass@]host.name.com[:port]/[?param1=value1¶m2=value2...]
- Lista parametrów zapytania do usunięcia.
Wynik
Zmodyfikowany adres URL HTTP bez parametrów zdefiniowanych na liście wejściowej.
Przykłady
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
Punktacja
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź (w bajtach).
&
pojawić się gdziekolwiek poza parametrami??
? Czy zamówienie powinno być również zachowane?&
jest częścią parametru zapytania, należy go poprawnie zakodować jako%26
http://foo:&[email protected]:8080/?foo=1&bar=foo
jest dozwolony przez RFC. To powinno złamać wiele istniejących rozwiązań. : D (Reguła jest taka, że informacja o użytkowniku może być rozwinięta jako niezarezerwowana lub ucieczka przed pct lub podpodwójki, a podpodzimie mogą mieć&
i=
)Odpowiedzi:
GNU sed
98 96 88 80 77 74 69 59 54(48 + 1 dla -r) 49Lista parametrów do usunięcia jest oddzielona spacjami.
źródło
&
lub?
znak w wynikowym adresie URL.JavaScript (ES6),
6260 bajtówEdycja: Zapisano 2 bajty dzięki @Shaggy.
źródło
.href
na końcu.alert
go użyjesz , lub wstaw go do węzła (tekstowego), tak jak masz, da cihref
właściwość obiektu. Jeśli jednak zalogujesz się do konsoli, otrzymasz pełny obiekt. Zobacz to skrzypce .PHP, 90 bajtów
-11 Bajtów, jeśli? lub & jest dozwolone na końcu
Poprzednia wersja 140 bajtów
źródło
^
/(.*|$)
będą częścią pierwszej / ostatniej alternatywy..*
. lub zastąpienia(=.*|$)
w\b
(-5).#^foo|bar(=.*|$)#
samo jak#(^foo)|(bar=.*|bar$))#
. Ale tak powinno być#(foo|bar)(=.*|$)#
.array_map
(i byłem zaskoczony, jak krótki może się okazać).PHP,
120110 bajtówz preg_replace i funkcjami tablicowymi: (zainspirowany Jörg )
zapisz do pliku, zadzwoń za pomocą
php <scriptname> <uri> <parametername> <parametername> ...
z parse_str i http_build_query (120 bajtów):
Biegnij z
php -r <code> <uri> <parametername> <parametername> ...
źródło
parse_str
?http_build_query
? Tak się cieszę, że ktoś pracuje przy użyciu odpowiednich narzędzi do pracy, nawet w golfa kodowym. Błędy, które pojawiają się, ponieważ URL / zapytanie SQL / regexp / HTML są „tylko łańcuchami”, są tak liczne, że można ich łatwo zapobiec.Java 7, 127 bajtów
Wyjaśnienie
Ideone
źródło
C #
377336330328 bajtów (173 alt)Pełny program bez golfa:
Prawdopodobnie niezbyt wydajny, ale myślę, że działa.
Alternatywnie, istnieje 173 bajtowe rozwiązanie wykorzystujące metodę @ Poke z Javy. Wymaga jednak importu Regex, więc prawdopodobnie nie może być krótszy.
źródło
Ruby,
146 140 127 119 116113 bajtówedycja 2: zapisano 6 bajtów za pomocą
$1
,$2
i$*
oraz 7, przechodzącx.split("=")[0]
dox[/\w+/]
edycji 3: zapisano 6 bajtów za pomocą
*
zamiast.join
, zapisano 2 bajty z niepotrzebnych spacjiedytuj 4: zapisano 3 bajty przez przeformułowanie inline (zmieniono wyrażenie regularne na ekwiwalent
$*[1][/([^?]*)\??(.*)/,1]
i wstawiono przypisane doa
)edytuj 5: zapisano 3 bajty za pomocą
($*[2].scan(r=/\w+/)&[x[r]])[0]
zamiast$*[2].scan(r=/\w+/).include?(x[r])
Zakładając wejście do programu podczas jego uruchamiania:
Wyjaśnienie
To analizuje adres URL podany w wierszu poleceń i przechowuje dopasowania w
$1
i$2
.$*[1][/([^?]*)\??(.*)/,1]
zwraca również pierwsze dopasowanie do zapisania w środkua
, podczas gdy drugie dopasowanie jest określane jako$2
pozwól punktowi na 1 $ i parsujb
w tablicy tablic ...... odrzucając to wszystko ...
... mają ciąg przed „=”, który jest zawarty na liście nazw podanych przez drugi parametr ... Działa to, ponieważ wyszukujemy słowa (w celu uzyskania listy), a następnie dostajemy słowo przed
=
i sprawdzamy, czy to słowo jest na liście z&
. Ponieważ&
zwraca pustą tablicę przy „nie znaleziono” (zestaw zerowy), używamy sztuczki opisanej poniżej, aby uzyskaćnil
jeśli w tablicy nie ma żadnych elementów. w przeciwnym razie zwracamy ciąg znaków, który liczy się jako prawdziwy, co odrzuca ten ciąg.... i dołącz pozostałe ciągi razem z „&”
W tym momencie
b
jest ciąg zapytania GET dla adresu URL. Dlatego musimy go tylko wydrukować.To używa sztuczki w rubinie.
b[0]
będzie,nil
jeśli b jest pustą tablicą lub łańcuchem. Więc jeśli to prawda , (nienil
lubfalse
), to w tablicy jest co najmniej jeden element, więc musimy wstawića+"?"+b
poprawny adres URL. w przeciwnym razie po prostu stawiamya
, ponieważ nie ma parametrów do wyświetleniaUwaga: ta odpowiedź zakłada, że
?
nie może nigdzie pojawić poza ograniczeniem adresu URL z zapytania. (zgodnie z tym, co przeczytałem z połączonego RFC)To także moja pierwsza odpowiedź na golfa: D
źródło
Pip , 46 bajtów
Pobiera adres URL ze standardowego wejścia i parametry zapytania w celu usunięcia z argumentów wiersza polecenia.
Wypróbuj online!
Wyjaśnienie:
źródło
PowerShell v3 +,
11590 bajtówPobiera dane wejściowe
$n
jako adres URL i$z
jako dosłowną tablicę ciągów jako parametry do usunięcia.-split
s wejściowy adres URL włączony?
, przechowuje pierwszą połowę w,$a
a drugą w$b
.Następnie
$b
sformułowano ponownie$z
, przeprowadzając pętlę , wykonując wyrażenie regularne-replace
dla każdego zbanowanego słowa zapytania, aby je usunąć. Następnie wyjścia$a
(niezmodyfikowane) plus plus w/
zależności od tego$b
, czy istnieje, plus plus w?
zależności od tego$x
, czy istnieje, plus `$ x.źródło
Pyth - 27 bajtów
Kenny miał rację, kiedy mówił o wbudowanej transformacji, a następnie odwróceniu, jednak bardzo trudno będzie to naprawić.
Pakiet testowy .
źródło
Siatkówka ,
4448 bajtówPrzekreślony 44 to wciąż 44. Dzięki Martin za poprawkę.
Przyjmuje dane wejściowe jak
uri param1 param2
. Wypróbuj online!Wyjaśnienie
Pierwsza zamiana usuwa odpowiednie parametry z ciągu zapytania.
[?&](?>([^ =&+))[^ &]*
dopasowuje a?
lub&
pełną nazwę parametru i (opcjonalnie)=
i wartość, przechowywanie nazwę parametru w grupie przechwytywania 1. Następnie(?=.* \1( |$))
jest uprzedzona, że sprawdza, czy nazwa parametru, który pojawia się na liście parametrów usunąć. Jeśli parametr spełnia te warunki, jest usuwany (zastępowany pustym zamiennikiem).Podstawienia nie nakładają się (dzięki lookahead) i przechodzą od lewej do prawej. Po osiągnięciu końca adresu URL plik
.*
gałąź dopasowuje listę parametrów do usunięcia, a także ją usuwa.Druga zamiana tylko upewnia się, że nowy ciąg zapytania zaczyna się od,
?
jeśli pierwszy parametr został usunięty.źródło
(?>...)
.Java 7, 203 bajty
Nie golfowany:
Ta funkcja przechodzi wszystkie testy.
źródło
Python,
7581112 bajtów:Nazwana funkcja. Pobiera dane wejściowe w formacie
i wyprowadza ciąg.
Zamień na wszystkie przypadki testowe!
źródło
PHP, nie konkuruje
Do cholery, PHP zostało do tego stworzone; dlaczego nie użyć rzeczywistego adresu URL?
Zapisz do pliku, zadzwoń z poszukiwanym ciągiem zapytania plus
&x[]=x&x[]=<exclude1>&x[]=<exclude2>&...
.Może się nie powieść nazwa użytkownika i hasło (w zależności od tego, czy przeglądarka je usuwa, czy nie).
Nie powiedzie się, jeśli hasło jest
0
.źródło