mengirimkan formulir GET dengan params string kueri dan params tersembunyi menghilang

231

Pertimbangkan formulir ini:

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

Saat mengirimkan formulir ini (formulir GET), parameter a dan b menghilang. Apakah ada alasan untuk itu? Apakah ada cara untuk menghindari perilaku ini?

Kiquenet
sumber
3
Elemen tindakan Anda salah.
Adrian Godong
Mereka seharusnya tidak menghilang, jadi saya pikir kita perlu melihat formulir Anda.
UnkwnTech
2
Hai, Ini adalah formulir lengkap, Anda bisa membuat HTML dengan formulir ini dan melihat bahwa parameter yang saya berikan dalam tindakan sudah terlihat: <form action = " example.com?e=4&f=5 " method = "GET"> <input type = "hidden" name = "a" value = "1" /> <tipe input = "hidden" name = "b" value = "2" /> <tipe input = "hidden" name = "c" value = "3" /> <input type = "submit" /> </form>
1
Ngomong-ngomong, Anda tahu Anda melewatkan penawaran akhir pada nilai tindakan itu? Sama sekali terpisah dari masalah utama, tapi ...
Jay
Saya memposting solusi yang mungkin menggunakan JavaScript di sini: stackoverflow.com/questions/3548795/…
Jenny O'Reilly

Jawaban:

263

Bukankah itu parameter tersembunyi untuk memulai dengan ...?

<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>

Saya tidak akan mengandalkan browser apa pun yang mempertahankan string kueri yang ada di URL tindakan.

Seperti spesifikasi ( RFC1866 , halaman 46; HTML 4.x bagian 17.13.3) menyatakan:

Jika metode ini adalah "dapatkan" dan tindakannya adalah HTTP URI, agen pengguna mengambil nilai tindakan, menambahkan `? ' untuk itu, kemudian menambahkan set data formulir, dikodekan menggunakan tipe konten "application / x-www-form-urlencoded".

Mungkin seseorang dapat menyandikan URL tindakan untuk menyematkan tanda tanya dan parameter, dan kemudian semoga saja semua peramban akan membiarkan URL itu seperti itu (dan memvalidasi bahwa server juga memahaminya). Tapi saya tidak akan pernah bergantung pada itu.

By the way: itu tidak berbeda untuk bidang formulir yang tidak tersembunyi. Namun untuk POST, URL tindakan dapat menampung string kueri.

Arjan
sumber
71

Dalam HTML5, ini adalah perilaku per-spec.

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

Lihatlah "4.10.22.3 Algoritma pengiriman formulir", langkah 17. Dalam kasus formulir GET ke URI http / s dengan string kueri:

Biarkan tujuan menjadi URL baru yang sama dengan tindakan kecuali bahwa <query>komponennya diganti dengan kueri (menambahkan karakter MARK PERTANYAAN U + 003F (?) Jika sesuai).

Jadi, browser Anda akan membuang bagian "? ..." yang ada dari URI Anda dan menggantinya dengan yang baru berdasarkan formulir Anda.

Di HTML 4.01, spesifikasi menghasilkan URI yang tidak valid - sebagian besar browser sebenarnya tidak melakukan ini ..

Lihat http://www.w3.org/TR/html401/interact/forms.html#h-17.13.3 , langkah empat - URI akan memiliki? ditambahkan, meskipun sudah mengandung satu.

xyphoid
sumber
ini berarti: semua yang ada di belakang ?dalam url tindakan dihapus? Jadi apa, jika parameter GET di url tindakan berisi target, di mana formulir harus diproses? seperti: action="index.php?site=search". Saya tidak yakin, jika menempatkan parameter GET dalam bidang input tersembunyi adalah ide yang bagus.
The Bndr
apa yang Anda maksud dengan per-spec @xyphoid?
AmiNadimi
@AmiNadimi: Artinya "sesuai dengan spesifikasi".
rekursif
14

Yang bisa Anda lakukan adalah menggunakan foreach sederhana di atas meja yang berisi informasi GET. Misalnya di php:

foreach ($_GET as $key => $value) {
    echo("<input type='hidden' name='$key' value='$value'/>");
}
Efx
sumber
23
Catatan: jangan pernah menggunakan kode contoh ini persis seperti yang tertulis. Itu akan sangat berbahaya. Nilai-nilai dari GET berasal dari pengguna, jadi seharusnya tidak ditulis ke halaman tanpa melarikan mereka terlebih dahulu.
drewm
16
Downvoting sampai bug XSS dalam kode ini diperbaiki.
spookylukey
1
Jawaban ini memberikan solusi yang serupa tetapi tidak dapat dikenakan untuk XSS.
vvzh
ini tidak menangani parameter array
Andrew
5

Anda harus memasukkan dua item (a dan b) sebagai elemen input tersembunyi serta C.

Bernhard Hofmann
sumber
Ya, tentu saja saya akan melakukan ini jika memungkinkan. Tetapi katakanlah saya memiliki parameter dalam string kueri dan input tersembunyi, apa yang bisa saya lakukan?
Saya pikir satu-satunya pilihan Anda adalah mengurai pasangan nama string / nilai string dan menghasilkan bidang input tersembunyi. Mungkin jika Anda menjelaskan sedikit lebih banyak tentang konteks halaman dan URL, kami mungkin dapat menyarankan solusi yang berfungsi.
Bernhard Hofmann
Atau, ambil data dari item formulir tersembunyi, dan tambahkan ke URL dan parameter kueri tambahan, lalu ganti tombol kirim formulir dengan tautan jangkar sederhana, atau server Location:redirect jika Anda tidak ingin ada interaksi dengan pengguna akhir .
Jason
1

Saya punya masalah yang sangat mirip di mana untuk tindakan bentuk, saya punya sesuatu seperti:

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

Tombol akan mengarahkan pengguna ke situs, tetapi info kueri menghilang sehingga pengguna mendarat di laman beranda alih-alih laman konten yang diinginkan. Solusi dalam kasus saya adalah mencari tahu cara membuat kode URL tanpa permintaan yang akan membawa pengguna ke halaman yang diinginkan. Dalam hal ini target saya adalah situs Drupal, sehingga ternyata /content/somethingjuga berhasil. Saya juga bisa menggunakan nomor simpul (yaitu /node/123).

KillerRabbit
sumber
0

Jika Anda membutuhkan solusi, karena formulir ini dapat ditempatkan di sistem pihak ke-3, Anda dapat menggunakan Apache mod_rewrite seperti ini:

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

maka formulir baru Anda akan terlihat seperti ini:

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

dan Apache akan menambahkan parameter ke-3 ke kueri

Wanis
sumber
-3

Konstruksi Anda ilegal. Anda tidak bisa menyertakan parameter dalam nilai tindakan formulir. Apa yang terjadi jika Anda mencoba ini akan tergantung pada kebiasaan browser. Saya tidak akan terkejut jika itu bekerja dengan satu browser dan bukan yang lain. Bahkan jika tampaknya berfungsi, saya tidak akan bergantung padanya, karena versi browser berikutnya mungkin mengubah perilaku.

"Tetapi katakanlah saya memiliki parameter dalam string kueri dan input tersembunyi, apa yang bisa saya lakukan?" Yang bisa Anda lakukan adalah memperbaiki kesalahan. Bukan untuk bersikap sinis, tapi ini seperti bertanya, "Tapi katakanlah URL saya menggunakan tanda persen alih-alih garis miring, apa yang bisa saya lakukan?" Satu-satunya jawaban yang mungkin adalah, Anda dapat memperbaiki URL.

Jay
sumber
Seluruh jawaban ini secara teknis benar ("salah, jadi perbaiki") tetapi tidak digunakan sama sekali. OP sudah tahu ada yang salah, dan di sini bertanya bagaimana memperbaikinya.
Jason
Maaf, bukankah itu jelas? "Anda tidak bisa memasukkan parameter dalam nilai tindakan formulir." Untuk memperbaikinya, hapus parameter dari nilai tindakan formulir.
Jay
@ Jay Masalahnya jelas bahwa pengguna memerlukan parameter URL untuk tetap, jadi mengatakan "hapus" tidak akan membantu
Chuck Le Butt
@ ChuckLeButt Mengatakan "tapi saya harus melakukan hal ini yang tidak berhasil" bukanlah hal yang berguna untuk dikatakan. Jika seseorang mengatakan kepada saya, "Saya terus memutar kenop radio tetapi mobil saya tidak mau bergerak", satu-satunya jawaban yang bisa saya pikirkan adalah mengatakan, "Memutar kenop radio tidak membuat mobil bergerak. Anda harus menghidupkan kunci kontak dan tekan pedal gas. " Untuk menjawab, "tapi saya harus membuat mobil bergerak dengan memutar kenop radio" adalah respons yang tidak produktif. Itu tidak bekerja. Itu tidak akan berhasil.
Jay
-3

Ini sebagai tanggapan terhadap posting di atas oleh Efx:

Jika URL sudah berisi var yang ingin Anda ubah, maka ditambahkan lagi sebagai bidang tersembunyi.

Berikut ini adalah modifikasi dari kode itu untuk mencegah duplikasi vars di URL:

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

ubah metode permintaan ke 'POST' alih-alih 'GET'.

Shashidhar Gr
sumber
-4

Saya biasanya menulis sesuatu seperti ini:

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

Ini berfungsi, tetapi jangan lupa untuk membersihkan input Anda terhadap serangan XSS!

Rápli András
sumber