l'invio di un modulo GET con i parametri della stringa di query e i parametri nascosti scompare


231

Considera questo modulo:

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

Quando si invia questo modulo (un modulo GET) i parametri aeb scompaiono. C'è una ragione per questo? C'è un modo per evitare questo comportamento?


3
Il tuo elemento di azione è malformato.
Adrian Godong,

Non dovrebbero scomparire, quindi penso che dovremo vedere il tuo modulo.
UnkwnTech,

2
Ciao, ecco il modulo completo, puoi semplicemente creare un HTML con questo modulo e vedere che i parametri che passo nell'azione stanno scomparendo: <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 = "submit" /> </form>

1
A proposito, sai che ti manca una citazione finale su quel valore di azione? Totalmente a parte il problema principale, ma ...
Jay

Ho pubblicato una possibile soluzione alternativa usando JavaScript qui: stackoverflow.com/questions/3548795/…
Jenny O'Reilly,

Risposte:


263

Non sono questi i parametri nascosti per iniziare con ...?

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

Non contare su alcun browser che conservi una stringa di query esistente nell'URL dell'azione.

Come indicato nelle specifiche ( RFC1866 , pagina 46; HTML 4.x sezione 17.13.3):

Se il metodo è "get" e l'azione è un URI HTTP, l'agente utente prende il valore dell'azione, aggiunge un `? ' ad esso, quindi aggiunge il set di dati del modulo, codificato utilizzando il tipo di contenuto "application / x-www-form-urlencoded".

Forse si potrebbe codificare in percentuale l'URL di azione per incorporare il punto interrogativo e i parametri, quindi incrociare le dita per sperare che tutti i browser lascino quell'URL così com'è (e confermare che anche il server lo capisce). Ma non farei mai affidamento su questo.

A proposito: non è diverso per i campi modulo non nascosti. Per POST l'URL dell'azione potrebbe contenere una stringa di query.


71

In HTML5, si tratta di un comportamento per specifica.

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

Guarda "4.10.22.3 Algoritmo di invio del modulo", passaggio 17. Nel caso di un modulo GET a un URI http / s con una stringa di query:

Consenti alla destinazione di essere un nuovo URL uguale all'azione, tranne per il fatto che il suo <query>componente è sostituito dalla query (aggiungendo un carattere U + 003F QUESTION MARK (?) Se appropriato).

Quindi, il tuo browser eliminerà la parte "? ..." esistente dell'URI e la sostituirà con una nuova in base al modulo.

In HTML 4.01, la specifica produce URI non validi - la maggior parte dei browser non lo ha effettivamente fatto.

Vedi http://www.w3.org/TR/html401/interact/forms.html#h-17.13.3 , passaggio quattro: l'URI avrà un? aggiunto, anche se ne contiene già uno.


questo significa: tutto dietro l' ?URL nell'azione viene rimosso? Quindi cos'è, se il parametro GET nell'URL dell'azione contiene la destinazione, dove deve essere elaborato il modulo? come: action="index.php?site=search". Non sono sicuro se inserire il parametro GET in campi di input nascosti sia un'idea divina.
Il Bndr,

cosa intendi per @xyphoid per specifica?
AmiNadimi,

@AmiNadimi: significa "conforme alle specifiche".
ricorsivo l'

14

Quello che puoi fare è usare un semplice foreach sulla tabella contenente le informazioni GET. Ad esempio in php:

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

23
Nota: non utilizzare mai questo codice di esempio esattamente come scritto. Sarebbe molto pericoloso. I valori di GET provengono dall'utente, quindi non dovrebbero essere scritti nella pagina senza prima salvarli.
Drewm,

16
Downvoting fino a quando il bug XSS in questo codice non viene corretto.
spookylukey,

1
Questa risposta fornisce una soluzione simile ma non votabile per XSS.
vvzh,

questo non gestisce i parametri dell'array
Andrew

5

È necessario includere i due elementi (aeb) come elementi di input nascosti e C.


Sì, ovviamente lo farei se possibile. Ma diciamo che ho parametri nella stringa di query e in input nascosti, cosa posso fare?

Penso che la tua unica opzione sia analizzare le coppie nome / valore della stringa di query e produrre campi di input nascosti. Forse se descrivi un po 'di più il contesto della pagina e dell'URL, potremmo essere in grado di suggerire una soluzione funzionante.
Bernhard Hofmann,

In alternativa, prendi i dati dagli elementi del modulo nascosto e aggiungili all'URL e ai parametri di query aggiuntivi, quindi sostituisci il pulsante di invio del modulo con un semplice collegamento di ancoraggio o un Location:reindirizzamento del server se non desideri alcuna interazione con l'utente finale .
Jason,

1

Ho avuto un problema molto simile in cui per l'azione del modulo, ho avuto qualcosa di simile:

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

Il pulsante porta l'utente al sito, ma le informazioni sulla query scompaiono, quindi l'utente accede alla pagina iniziale anziché alla pagina di contenuto desiderata. La soluzione nel mio caso era scoprire come codificare l'URL senza la query che avrebbe portato l'utente alla pagina desiderata. In questo caso il mio obiettivo era un sito Drupal, quindi alla fine /content/somethingha funzionato. Avrei anche potuto usare un numero di nodo (es /node/123.).


0

Se hai bisogno di soluzioni alternative, poiché questo modulo può essere inserito in sistemi di terze parti, puoi utilizzare Apache mod_rewrite in questo modo:

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

quindi il tuo nuovo modulo sarà simile al seguente:

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

e Apache aggiungerà il terzo parametro da interrogare


-3

La tua costruzione è illegale. Non è possibile includere parametri nel valore di azione di un modulo. Cosa succede se provi questo dipenderà dalle stranezze del browser. Non sarei sorpreso se funzionasse con un browser e non con un altro. Anche se sembra funzionare, non mi affiderei a questo, perché la prossima versione del browser potrebbe cambiare il comportamento.

"Ma diciamo che ho parametri nella stringa di query e in input nascosti, cosa posso fare?" Quello che puoi fare è correggere l'errore. Non essere sgarbato, ma è un po 'come chiedere "Ma supponiamo che il mio URL utilizzi i segni di percentuale anziché le barre, cosa posso fare?" L'unica risposta possibile è che puoi correggere l'URL.


Tutta questa risposta è tecnicamente corretta ("è sbagliata, quindi correggila") ma non serve a nulla. L'OP sa già che qualcosa non va e sta chiedendo come risolverlo.
Jason,

Mi dispiace, non era chiaro? "Non è possibile includere parametri nel valore di azione di un modulo." Per correggerlo, rimuovere i parametri dal valore dell'azione del modulo.
Jay,

@Jay Il problema è chiaramente che l'utente ha bisogno che i parametri URL rimangano, quindi dire che "rimuovili" non aiuta
Chuck Le Butt

@ChuckLeButt Dire "ma devo fare questa cosa che non funziona" non è una cosa utile da dire. Se qualcuno mi dice "Continuo a girare la manopola della radio ma la mia auto non si muoverà", l'unica risposta che mi viene in mente sarebbe quella di dire: "Ruotare la manopola della radio non fa muovere la macchina. Devi girare la chiave di accensione e premere il pedale dell'acceleratore ". Per rispondere, "ma devo far muovere la macchina girando la manopola della radio" è una risposta improduttiva. Non funziona Non funzionerà
Jay,

-3

Questo è in risposta al post sopra di Efx:

Se l'URL contiene già la var che si desidera modificare, viene nuovamente aggiunto come campo nascosto.

Ecco una modifica di quel codice per impedire la duplicazione di variabili nell'URL:

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>

cambia il metodo di richiesta in 'POST' invece di 'GET'.


-4

Di solito scrivo qualcosa del genere:

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

Funziona, ma non dimenticare di disinfettare i tuoi input contro gli attacchi XSS!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.