2009-07-12 12 views
178

consideran este formulario:enviar un formulario GET con params cadena de consulta y params ocultos desaparecen

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

Al enviar este formulario (una forma GET) los parámetros a y b están desapareciendo. ¿Hay alguna razón para eso? ¿Hay alguna manera de evitar este comportamiento?

+3

Su elemento de acción está mal formado. –

+0

No deberían desaparecer, así que creo que tendremos que ver su formulario. – UnkwnTech

+2

Hola, aquí está el formulario completo, puedes simplemente crear un HTML con este formulario y ver que los parámetros que paso en la acción están desapareciendo:

Respuesta

214

¿No son para qué son los parámetros ocultos para empezar ...?

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

No esperaba que ningún navegador retuviera ninguna cadena de consulta existente en la URL de acción.

Como las especificaciones (RFC1866, página 46; HTML 4.x sección 17.13.3) Estado:

si el método es "llegar" y la acción es un URI HTTP, el agente de usuario toma el valor de la acción , agrega un `? ' a él, luego agrega el conjunto de datos del formulario, codificado utilizando el tipo de contenido "application/x-www-form-urlencoded".

Tal vez uno podría ciento a codificar la acción-URL para incrustar el signo de interrogación y los parámetros, y luego cruzar los dedos para esperar todos los navegadores dejaría a esa URL, ya que (y validar que el servidor entiende que también) . Pero nunca confiaría en eso.

Por cierto: no es diferente para campos de formulario no ocultos. Para POST, la URL de acción podría contener una cadena de consulta.

5

Debe incluir los dos elementos (a y b) como elementos de entrada ocultos, así como C.

+0

Sí, por supuesto que haría esto si es posible. Pero digamos que tengo parámetros en cadena de consulta y en entradas ocultas, ¿qué puedo hacer? –

+0

Creo que su única opción es analizar los pares de nombre/valor de cadena de consulta y producir campos de entrada ocultos. Tal vez si describió un poco más el contexto de la página y la URL, podríamos sugerir una solución de trabajo. –

+0

Como alternativa, tome los datos de los elementos de formulario ocultos y añádalos a la URL y a los parámetros de consulta adicionales, luego reemplace el botón de envío de formulario con un enlace de anclaje simple, o un servidor 'Localización:' redirigir si no desea interacción con el usuario final. – Jason

1

que tenía un problema muy similar en la que por acción del formulario, que tenía algo así como:

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

El botón lleva al usuario al sitio, pero la información de la consulta desaparece para que el usuario acceda a la página de inicio en lugar de a la página de contenido deseada. La solución en mi caso fue descubrir cómo codificar la URL sin la consulta que llevaría al usuario a la página deseada. En este caso mi objetivo era un sitio de Drupal, por lo que resultó que /content/something también funcionó. También podría haber usado un número de nodo (es decir, /node/123).

2

Su construcción es ilegal. No puede incluir parámetros en el valor de acción de un formulario. Lo que sucede si prueba esto va a depender de las peculiaridades del navegador. No me sorprendería si funciona con un navegador y no con otro. Incluso si parecía funcionar, no confiaría en él, porque la próxima versión del navegador podría cambiar el comportamiento.

"Pero digamos que tengo parámetros en cadena de consulta y en entradas ocultas, ¿qué puedo hacer?" Lo que puedes hacer es arreglar el error. No es una burla, pero esto es un poco como preguntar: "Pero digamos que mi URL utiliza signos de porcentaje en lugar de barras, ¿qué puedo hacer?" La única respuesta posible es que puedes arreglar la URL.

+0

Toda esta respuesta es técnicamente correcta ("está mal, así que arréglalo") pero no sirve para nada. El OP ya sabe que algo está mal, y aquí está preguntando cómo solucionarlo. – Jason

+0

Lo siento, ¿no estaba claro? "No puede incluir parámetros en el valor de acción de un formulario". Para solucionarlo, elimine los parámetros del valor de acción del formulario. – Jay

14

Lo que puede hacer es usar un simple foreach en la tabla que contiene la información GET. Por ejemplo, en php:

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

Nota: nunca use este código de ejemplo exactamente como está escrito. Sería muy peligroso. Los valores de GET provienen del usuario, por lo que no deben escribirse en la página sin escaparse primero. – drewm

+10

Downvoting hasta que se solucione el error XSS en este código. – spookylukey

+0

[Esta respuesta] (http://stackoverflow.com/a/7201286/3206908) proporciona una solución similar pero no vunerable para XSS. – vvzh

57

En HTML5, este es el comportamiento por especificación.

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

vistazo a "4.10.22.3 algoritmo de envío de formulario", paso 17. En el caso de una forma GET a un servidor HTTP/s URI con una cadena de consulta: destino

Let ser una nueva URL que es igual a la acción excepto que su componente <query> es reemplazado por consulta (agregando una U + 003F PREGUNTA carácter de MARCA (?) si es apropiado).

Por lo tanto, su navegador tachará la parte "? ..." existente de su URI y la reemplazará por una nueva basada en su formulario.

En HTML 4.01, la especificación produce URI no válido - la mayoría de los navegadores en realidad no hacer esto, sin embargo ..

Ver http://www.w3.org/TR/html401/interact/forms.html#h-17.13.3, el paso cuatro - el URI tendrá una? anexado, incluso si ya contiene uno.

+0

this mean: todo lo que está detrás de '?' En la url de acción se elimina? Entonces, ¿qué ocurre si el parámetro GET en la url de acción contiene el destino, donde se debe procesar el formulario? como: 'action =" index.php? site = search "'. No estoy seguro, si poner el parámetro GET en campos de entrada ocultos es una idea de Dios. –

+0

¿qué quieres decir con @xyphoid por especificación? – AmiNadimi

0

Si necesitan solución, ya que esta forma se puede colocar en sistemas de 3 ª parte, puede utilizar el mod_rewrite de Apache como esto:

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

entonces su nueva forma se verá así:

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

y Apache añadirá tercera parámetro para consultar

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

cambio del método de la petición de 'post' en lugar de 'GET'.

-3

que suelo escribir algo como esto:

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

Esto funciona, pero no se olvide de desinfectar sus entradas contra los ataques XSS!

-2

Esto es en respuesta al post anterior por EFX:

Si la URL ya contiene el var desea cambiar, a continuación, se añadió una vez más como un campo oculto.

Aquí es una modificación del código que se evite la duplicación de Vars en la URL:

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