przesłanie formularza GET z parametrami ciągu zapytania i ukrytymi parametrami zniknie

231

Rozważ ten formularz:

<form action="http://www.blabla.com?a=1&b=2" method="GET">
    <input type="hidden" name="c" value="3" /> 
</form>

Podczas przesyłania tego formularza (formularza GET) parametry aib znikają. Czy jest powód ku temu? Czy istnieje sposób na uniknięcie tego zachowania?

Kiquenet
źródło
3
Twój element akcji jest zniekształcony.
Adrian Godong
Nie powinny znikać, więc myślę, że będziemy musieli zobaczyć twój formularz.
UnkwnTech
2
Cześć, oto pełna forma, możesz po prostu utworzyć HTML za pomocą tego formularza i zobaczyć, że parametry, które przekazuję w akcji, znikają: <form action = " example.com?e=4&f=5 " method = "GET"> <input type = "hidden" name = "a" value = "1" /> <input type = "hidden" name = "b" value = "2" /> <input type = "hidden" name = "c" value = "3" /> <input type = "upload" /> </form>
1
Nawiasem mówiąc, wiesz, że brakuje Ci cytatu końcowego na temat wartości akcji? Zupełnie poza głównym problemem, ale ...
Jay
Tutaj opublikowałem możliwe obejście tego problemu za pomocą JavaScript: stackoverflow.com/questions/3548795/...
Jenny O'Reilly

Odpowiedzi:

263

Czy nie od tego są ukryte parametry na początek ...?

<form action="http://www.example.com" method="GET">
  <input type="hidden" name="a" value="1" /> 
  <input type="hidden" name="b" value="2" /> 
  <input type="hidden" name="c" value="3" /> 
  <input type="submit" /> 
</form>

Nie liczyłbym, że żadna przeglądarka zachowa istniejący ciąg zapytania w adresie URL akcji.

Zgodnie ze specyfikacjami ( RFC1866 , strona 46; HTML 4.x sekcja 17.13.3):

Jeśli metodą jest „get”, a akcja jest identyfikatorem URI HTTP, agent użytkownika przyjmuje wartość akcji, dołącza `? ' następnie dołącza zestaw danych formularza, zakodowany przy użyciu typu zawartości „application / x-www-form-urlencoded”.

Być może można by procentowo zakodować adres URL akcji, aby osadzić znak zapytania i parametry, a następnie trzymać kciuki, aby mieć nadzieję, że wszystkie przeglądarki opuszczą ten adres URL (i sprawdzi, czy serwer też go rozumie). Ale nigdy nie polegałbym na tym.

Nawiasem mówiąc: nie jest inaczej w przypadku niezajętych pól formularza. W przypadku testu POST adres URL akcji może jednak zawierać ciąg zapytania.

Arjan
źródło
71

W HTML5 jest to zachowanie zgodne ze specyfikacją.

Zobacz: http://www.w3.org/TR/2011/WD-html5-20110525/association-of-controls-and-forms.html#form-submission-alameterm

Patrz „Algorytm przesyłania formularza 4.10.22.3”, krok 17. W przypadku formularza GET do identyfikatora URI http / s z ciągiem zapytania:

Niech miejscem docelowym będzie nowy adres URL, który jest równy akcji, z wyjątkiem tego, że jego <query>komponent jest zastąpiony przez zapytanie (dodając znak U + 003F ZNAK PYTANIA (?), Jeśli to właściwe).

Tak więc twoja przeglądarka wyrzuci istniejącą część?? ...? Twojego URI i zastąpi ją nową opartą na twoim formularzu.

W HTML 4.01 specyfikacja wytwarza nieprawidłowe URI - większość przeglądarek tak naprawdę tego nie zrobiła ...

Zobacz http://www.w3.org/TR/html401/interact/forms.html#h-17.13.3 , krok czwarty - URI będzie miał? dołączany, nawet jeśli już go zawiera.

xyphoid
źródło
to znaczy: czy wszystko za ?URL-em akcji zostało usunięte? Więc co jest, jeśli parametr GET w adresie URL akcji zawiera cel, gdzie formularz powinien zostać przetworzony? Lubię: action="index.php?site=search". Nie jestem pewien, czy umieszczenie parametru GET w ukrytych polach wejściowych jest dobrym pomysłem.
The Bndr
co rozumiesz przez per-spec @xyphoid?
AmiNadimi,
@AmiNadimi: Oznacza „zgodnie ze specyfikacją”.
rekurencyjny
14

Możesz użyć prostego foreach na stole zawierającym informacje GET. Na przykład w php:

foreach ($_GET as $key => $value) {
    echo("<input type='hidden' name='$key' value='$value'/>");
}
Efx
źródło
23
Uwaga: nigdy nie używaj tego przykładowego kodu dokładnie tak, jak napisano. To byłoby bardzo niebezpieczne. Wartości z GET pochodzą od użytkownika, więc nie należy ich zapisywać na stronie bez uprzedniej zmiany ich znaczenia.
Drawm
16
Głosowanie do momentu usunięcia błędu XSS w tym kodzie.
spookylukey,
1
Ta odpowiedź zapewnia podobne rozwiązanie, ale nie jest możliwe do uzyskania z XSS.
vvzh
to nie obsługuje parametrów tablicy
Andrew
5

Należy uwzględnić dwa elementy (a i b) jako ukryte elementy wejściowe, a także C.

Bernhard Hofmann
źródło
Tak, oczywiście zrobiłbym to, jeśli to możliwe. Ale powiedzmy, że mam parametry w ciągu zapytania i ukrytych danych wejściowych, co mogę zrobić?
Myślę, że jedyną opcją jest parsowanie par nazwa-wartość ciągu zapytania i utworzenie ukrytych pól wejściowych. Być może, jeśli opisałeś nieco więcej w kontekście strony i adresu URL, możemy zaproponować działające rozwiązanie.
Bernhard Hofmann
Ewentualnie weź dane z ukrytych elementów formularza i dodaj je do adresu URL i dodatkowych parametrów zapytania, a następnie zastąp przycisk wysyłania formularza prostym linkiem kotwicy lub Location:przekierowaniem serwera, jeśli nie chcesz interakcji z użytkownikiem końcowym .
Jason
1

Miałem bardzo podobny problem, gdzie w przypadku akcji formularza miałem coś takiego:

<form action="http://www.example.com/?q=content/something" method="GET">
   <input type="submit" value="Go away..." />&nbsp;
</form>

Przycisk doprowadziłby użytkownika do witryny, ale informacje o zapytaniu zniknęły, więc użytkownik wylądował na stronie głównej, a nie na żądanej stronie treści. W moim przypadku rozwiązaniem było dowiedzieć się, jak zakodować adres URL bez zapytania, które doprowadziłoby użytkownika do pożądanej strony. W tym przypadku moim celem była witryna Drupal, więc jak się okazało, /content/somethingdziałała. Mógłbym również użyć numeru węzła (tj /node/123.).

KillerRabbit
źródło
0

Jeśli potrzebujesz obejścia, ponieważ ten formularz można umieścić w systemach innych firm, możesz użyć mod_rewrite Apache w następujący sposób:

RewriteRule ^dummy.link$ index.php?a=1&b=2 [QSA,L]

wtedy twój nowy formularz będzie wyglądał następująco:

<form ... action="http:/www.blabla.com/dummy.link" method="GET">
<input type="hidden" name="c" value="3" /> 
</form>

i Apache dołączy trzeci parametr do zapytania

wanis
źródło
-3

Twoja budowa jest nielegalna. Nie można dołączyć parametrów do wartości akcji formularza. Co się stanie, jeśli spróbujesz, będzie zależeć od dziwactwa przeglądarki. Nie zdziwiłbym się, gdyby działał z jedną przeglądarką, a nie z inną. Nawet jeśli wydawałoby się, że działa, nie polegałbym na nim, ponieważ następna wersja przeglądarki może zmienić zachowanie.

„Ale powiedzmy, że mam parametry w ciągu zapytania i ukrytych danych wejściowych, co mogę zrobić?” Co możesz zrobić, to naprawić błąd. To nie jest złośliwe, ale to trochę jak pytanie: „Ale powiedzmy, że mój adres URL używa znaków procentu zamiast ukośników, co mogę zrobić?” Jedyną możliwą odpowiedzią jest to, że możesz naprawić adres URL.

Sójka
źródło
Cała odpowiedź jest technicznie poprawna („jest niepoprawna, więc ją napraw”), ale bezużyteczna. OP już wie, że coś jest nie tak, i pyta, jak to naprawić.
Jason
Przepraszam, czy to nie było jasne? „Nie można dołączyć parametrów do wartości akcji formularza”. Aby to naprawić, usuń parametry z wartości akcji formularza.
Jay
@Jay Problem polega na tym, że użytkownik potrzebuje parametrów URL, aby pozostać, więc powiedzenie „usuń” nie pomoże
Chuck Le Butt
@ChuckLeButt Mówienie „ale muszę zrobić to, co nie działa”, nie jest przydatne do powiedzenia. Jeśli ktoś powie mi: „Obracam pokrętło radia, ale mój samochód się nie rusza”, jedyną odpowiedzią, jaką mogę wymyślić, jest powiedzenie: „Obrócenie pokrętła radia nie powoduje ruchu samochodu. Musisz obrócić kluczyk zapłonowy i nacisnąć pedał gazu. ” Odpowiedź: „ale muszę wprawić samochód w ruch, obracając gałkę radia”, jest nieproduktywną reakcją. To nie działa To nie zadziała.
Jay,
-3

Jest to odpowiedź na powyższy post autorstwa Efx:

Jeśli adres URL zawiera już zmienną, którą chcesz zmienić, jest on dodawany ponownie jako ukryte pole.

Oto modyfikacja tego kodu, aby zapobiec powielaniu zmiennych w adresie URL:

foreach ($_GET as $key => $value) {
    if ($key != "my_key") {
        echo("<input type='hidden' name='$key' value='$value'/>");
    }
}
TH_
źródło
-4
<form ... action="http:/www.blabla.com?a=1&b=2" method ="POST">
<input type="hidden" name="c" value="3" /> 
</form>

zmień metodę żądania na „POST” zamiast „GET”.

Shashidhar Gr
źródło
-4

Zwykle piszę coś takiego:

foreach($_GET as $key=>$content){
        echo "<input type='hidden' name='$key' value='$content'/>";
}

Działa to, ale nie zapomnij oczyścić swoich danych wejściowych przed atakami XSS!

Rápli András
źródło