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?
Odpowiedzi:
Czy nie od tego są ukryte parametry na początek ...?
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):
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.
źródło
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:
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.
źródło
?
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.Możesz użyć prostego foreach na stole zawierającym informacje GET. Na przykład w php:
źródło
Należy uwzględnić dwa elementy (a i b) jako ukryte elementy wejściowe, a także C.
źródło
Location:
przekierowaniem serwera, jeśli nie chcesz interakcji z użytkownikiem końcowym .Miałem bardzo podobny problem, gdzie w przypadku akcji formularza miałem coś takiego:
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/something
działała. Mógłbym również użyć numeru węzła (tj/node/123
.).źródło
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:
wtedy twój nowy formularz będzie wyglądał następująco:
i Apache dołączy trzeci parametr do zapytania
źródło
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.
źródło
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:
źródło
zmień metodę żądania na „POST” zamiast „GET”.
źródło
Zwykle piszę coś takiego:
Działa to, ale nie zapomnij oczyścić swoich danych wejściowych przed atakami XSS!
źródło