sorgu dizesi parametreleri ve gizli parametreler kaybolarak bir GET formu gönderme


231

Bu formu düşünün:

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

Bu form gönderilirken (bir GET formu) a ve b parametreleri kaybolur. Bunun bir sebebi var mı? Bu davranıştan kaçınmanın bir yolu var mı?


3
Eylem öğeniz hatalı biçimlendirilmiş.
Adrian Godong

Kaybolmamalılar, bu yüzden formunuzu görmemiz gerekeceğini düşünüyorum.
UnkwnTech

2
Merhaba, İşte tam form, sadece bu formla bir HTML oluşturabilir ve eylemde geçirdiğim parametrelerin disppearing olduğunu görebilirsiniz: <form action = " example.com?e=4&f=5 " method = "GET"> <giriş türü = "gizli" ad = "a" değer = "1" /> <giriş türü = "gizli" ad = "b" değer = "2" /> <giriş türü = "gizli" ad = "c" value = "3" /> <giriş türü = "gönder" /> </form>

1
Bu arada, bu işlem değerinde bir son teklifin eksik olduğunu biliyor musunuz? Tamamen ana sorun dışında, ama ...
Jay

Burada JavaScript kullanarak olası bir çözüm gönderdim: stackoverflow.com/questions/3548795/…
Jenny O'Reilly

Yanıtlar:


263

Başlamak için gizli parametreler bu değil midir?

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

İşlem URL'sinde mevcut herhangi bir sorgu dizesini tutan herhangi bir tarayıcıya güvenmem.

Spesifikasyonların ( RFC1866 , sayfa 46; HTML 4.x bölüm 17.13.3) belirttiği gibi:

Yöntem "get" ise ve eylem bir HTTP URI ise, kullanıcı aracısı eylemin değerini alır, bir?? daha sonra "application / x-www-form-urlencoded" içerik türü kullanılarak kodlanmış form veri kümesini ekler.

Belki soru işareti ve parametreleri yerleştirmek için eylem URL'sini yüzde olarak kodlayabilir ve ardından tüm tarayıcıların bu URL'yi olduğu gibi bırakmasını (ve sunucunun da anladığını doğrular) ummak için parmaklarını çaprazlayabilirsiniz. Ama buna asla güvenmem.

Bu arada: gizli olmayan form alanları için farklı değildir. POST için işlem URL'si bir sorgu dizesi içerebilir.


71

HTML5'te, bu özellik başına davranıştır.

Görmek Http://www.w3.org/TR/2011/WD-html5-20110525/ociociation-of-controls-and-forms.html#form-submission-algorithm

"4.10.22.3 Form gönderme algoritması", adım 17'ye bakın. Sorgu dizesi içeren bir http / s URI'sına GET formu olması durumunda:

Hedefin, <query>bileşeni sorgu ile değiştirilmesi dışında eyleme eşit yeni bir URL olmasına izin verin (uygunsa bir U + 003F SORU İŞARETİ karakteri (?) Ekleyerek).

Böylece, tarayıcınız URI'nizin mevcut "? ..." bölümünü çöker ve formunuza göre yenisiyle değiştirir.

HTML 4.01'de, spesifikasyon geçersiz URI'ler üretir - çoğu tarayıcı bunu aslında yapmamıştır.

Bkz. Http://www.w3.org/TR/html401/interact/forms.html#h-17.13.3 , dördüncü adım - URI'da bir? zaten içeriyor olsa bile eklenir.


Bu ?, eylem URL'sinin arkasındaki her şey kaldırıldı mı? Eylem URL'sindeki GET parametresi hedefi içeriyorsa, formun nerede işlenmesi gerekir? gibi: action="index.php?site=search". GET parametresini gizli girdi alanlarına koymak bir tanrı fikriyse emin değilim.
Bndr

per-spec @xyphoid ne demek istiyorsun?
AmiNadimi

@AmiNadimi: "Şartnameye uygun" anlamına gelir.
özyinelemeli

14

Yapabileceğiniz şey, GET bilgilerini içeren tabloda basit bir foreach kullanmaktır. Örneğin php'de:

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

23
Not: Bu örnek kodu asla tam olarak yazıldığı gibi kullanmayın. Çok tehlikeli olurdu. GET'ten gelen değerler kullanıcıdan gelir, bu nedenle önce kaçmadan sayfaya yazılmamalıdır.
drewm

16
Bu koddaki XSS hatası düzeltilene kadar aşağı oylama.
spookylukey

1
Bu cevap benzer bir çözüm sağlar, ancak XSS için kullanılamaz.
vvzh

Bu dizi parametrelerini işlemez
Andrew

5

İki öğeyi (a ve b) C'nin yanı sıra gizli giriş öğeleri olarak eklemeniz gerekir.


Evet, tabii ki mümkünse bunu yapardım. Ama diyelim ki sorgu dizesinde ve gizli girişlerde parametreler var, ne yapabilirim?

Tek seçeneğiniz sorgu dizesi adı / değer çiftlerini ayrıştırmak ve gizli giriş alanları üretmek olduğunu düşünüyorum. Belki sayfanın ve URL'nin bağlamı hakkında biraz daha bilgi verdiyseniz, çalışan bir çözüm önerebiliriz.
Bernhard Hofmann

Alternatif olarak, gizli form öğelerinden verileri alın ve bunları URL'ye ve ek sorgu parametrelerine ekleyin, ardından form gönderme düğmesini basit bir bağlantı bağlantısıyla veya Location:son kullanıcıyla herhangi bir etkileşim istemiyorsanız bir sunucu yönlendirmesiyle değiştirin .
Jason

1

Form eylemi için şöyle bir şey yaşadığım çok benzer bir sorunum vardı:

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

Düğme kullanıcıyı siteye götürür, ancak sorgu bilgileri kayboldu, böylece kullanıcı istenen içerik sayfası yerine ana sayfaya indi. Benim durumumda çözüm, kullanıcıyı istenen sayfaya götürecek sorgu olmadan URL'yi nasıl kodlayacağınızı öğrenmekti. Bu durumda hedefim bir Drupal sitesi idi, bu yüzden de ortaya çıktı /content/something. Ayrıca bir düğüm numarası (yani /node/123) kullanabilirsiniz.


0

Geçici çözüm gerekiyorsa, bu form üçüncü taraf sistemlerine yerleştirilebileceğinden Apache mod_rewrite'ı şu şekilde kullanabilirsiniz:

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

yeni formunuz şöyle görünür:

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

ve Apache sorguya 3. parametreyi ekleyecek


-3

Yapınız yasadışı. Bir formun işlem değerine parametreler ekleyemezsiniz. Bunu denerseniz ne olur, tarayıcının tuhaflıklarına bağlı olacaktır. Bir tarayıcıyla çalışsaydı, başka bir tarayıcıyla çalışmasaydı şaşırmazdım. Çalıştığı görünse bile, ona güvenmem, çünkü tarayıcının bir sonraki sürümü davranışı değiştirebilir.

"Ama diyelim ki sorgu dizesinde ve gizli girdilerde parametreler var, ne yapabilirim?" Yapabileceğiniz şey hatayı düzeltmektir. Keskin olmamak, ama bu biraz sormak gibi bir şey, "Diyelim ki URL'mde eğik çizgiler yerine yüzde işaretleri var, ne yapabilirim?" Tek olası cevap, URL'yi düzeltebilirsiniz.


Bu yanıtın tamamı teknik olarak doğrudur ("yanlış, düzelt") ama hiçbir işe yaramaz. OP zaten bir şeyin yanlış olduğunu biliyor ve burada nasıl düzeltileceğini soruyor.
Jason

Üzgünüm, net değil miydi? "Bir formun işlem değerine parametreler ekleyemezsiniz." Düzeltmek için, formun işlem değerinden parametreleri kaldırın.
Jay

@Jay Sorun açıkça kullanıcının kalmak için URL parametrelerine ihtiyacı olduğunu, bu yüzden "onları kaldırmak" demek yardımcı olmaz
Chuck Le Butt

@ChuckLeButt "Ama işe yaramayan bu şeyi yapmam lazım" demek faydalı bir şey değil. Birisi bana "Radyo düğmesini çevirmeye devam ediyorum ama arabam hareket etmiyor" derse, aklıma gelen tek yanıt "Radyo düğmesini çevirmek arabayı hareket ettirmez." kontak anahtarını çekin ve gaz pedalına basın. " Cevap vermek için, "ama radyo düğmesini çevirerek aracı hareket ettirmem gerekiyor" verimsiz bir tepkidir. Çalışmıyor. Çalışmaz.
Jay

-3

Bu Efx'in yukarıdaki yazısına yanıt olarak:

URL zaten değiştirmek istediğiniz değişkeni içeriyorsa, yine gizli bir alan olarak eklenir.

URL'de yinelenen değişkenleri önlemek için bu kodda yapılan bir değişiklik:

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

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

istek yöntemini 'GET' yerine 'POST' olarak değiştirin.


-4

Genellikle böyle bir şey yazarım:

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

Bu çalışıyor, ancak girdilerinizi XSS saldırılarına karşı sterilize etmeyi unutmayın!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.