Las aplicaciones web utilizan formularios HTML para recibir entradas del usuario. Los formularios HTML tienen un gran inconveniente: un usuario puede guardar el formulario en un archivo, editarlo y enviar el archivo del formulario editado al servidor. Este problema empeora porque las aplicaciones web son de naturaleza «sin estado». Las transacciones en HTTP no tienen conexión y se transmiten a la vez. Al recopilar datos del usuario a través de formularios, deben pasar por una serie de formularios de entrada para almacenar su información en el servidor. La información de «estado» se almacena en el navegador del usuario y se envía colectivamente al servidor en una transacción. Esta información de estado se puede almacenar de 3 maneras:
- ‘ Cookies ‘ en el navegador
- Etiquetas especiales en URL
- Campos ‘ ocultos ‘ en formularios HTML
El método más utilizado en los formularios HTML son los campos » ocultos «. Esto ayuda a ocultar la entrada en los formularios y es el más simple de usar y puede contener toneladas de datos. Sin embargo, al completar formularios, los datos se almacenan en el navegador web del usuario, son fáciles de manipular con los campos ocultos.
Ejemplo: Una aplicación web simple que permite a los usuarios ‘iniciar sesión’ y actualizar su ‘dirección de correo’ utilizando la biblioteca CGI en Perl.
Perl
#!/usr/bin/perl use CGI qw/:standard/; # Printing the MIME header: print "Content−type: text/html\n\n"; print '<html><body>'; print '<h1>Tampering Input Form Example</h1>'; # Assign some unchanged example values: $userid = 'GeeksforGeeks'; $credit_ok = 1; $form_expires = '40002002:10:53:50'; # Displaying a blank HTML form: if (! param('chaddr')) { print_form(); } else { print "You made this easy ", param('userid'), "<br>"; print "Your address information has been successfully updated."; } print "</body></html>"; ## SUBROUTINES: sub print_form { # Prints an example HTML form # with signature in the hidden field: print<<END_TEXT; <p><form action="http://netlify.app/cgi/Tampered-Input-Form.pl" method="post"> <table> <tr> <td><b>Address line A:</b></td><td><input type="text" name="addressA"></td> <tr> <td><b>Address line B:</b></td><td><input type="text" name="addressB"></td> <tr> <td><b>City:</b></td><td><input type="text" name="city"></td> <tr> <td><b>Prov:</b></td><td><input type="text" name="prov"></td> <tr> <td><b>Postal:</b></td><td><input type="text" name="postal"></td> <tr><td colspan="2" align="center"> <input type="hidden" name="userid" value="$userid"> <input type="hidden" name="credit_ok" value="$credit_ok"> <input type="hidden" name="form_expires" value="$form_expires"> <input type="submit" name="chaddr" value="Change address"> </td></tr> </table> </form> END_TEXT }
En la página de inicio de sesión anterior, hemos omitido una página de inicio de sesión para la aplicación web y el script tampoco hace nada con los datos del formulario. Cuando ejecutamos el formulario en nuestro navegador web y consideramos el código fuente HTML. Este formulario utiliza campos ‘ocultos’ para guardar la información en el proceso de inicio de sesión:
<tipo de entrada = «oculto» nombre = «ID de usuario» valor = «GeeksforGeeks»>
<tipo de entrada=”oculto” nombre=”crédito_ok” valor=”1″>
<tipo de entrada=”oculto” nombre=”formulario_caduca” valor=”40002002:10:53:50″>
Al completar alguna información en el formulario y al presionar el botón Enviar, una pantalla de confirmación utiliza el valor de ID de usuario del campo oculto, directamente desde el formulario HTML.
Manipulación del Formulario:
Para manipular un formulario HTML, presione ‘ Ctrl+S ‘ para guardar la página web del formulario HTML en su computadora. El formulario HTML contiene los campos » ocultos » y se puede editar con un editor de texto. Cambie el campo ‘ ID de usuario ‘ y luego guarde el archivo editado. Luego abra el mismo archivo en su navegador web y envíe el formulario. Aceptará el archivo editado porque la aplicación web confía en los campos ‘ ocultos ‘.
Ejemplo: manipulación de formularios HTML cambiando los campos ocultos.
- Formulario HTML:
- Guardando el formulario anterior con ‘Ctrl+S’
- Campos inicialmente ocultos en el formulario:
HTML
<input type="hidden" name="userid" value="GeeksforGeeks" type="hidden"/> <input type="hidden" name="credit_ok" value="1"/> <input type="hidden" name="form_expires" value="40002002:10:53:50"/>
- El ‘ID de usuario’ tiene el valor » GeeksforGeeks » y el tipo está oculto.
- Sobre la manipulación de los campos ocultos en el formulario:
HTML
<input type="hidden" name="userid" value="Geeks123" /> <input type="hidden" name="credit_ok" value="1" /> <input type="hidden" name="form_expires" value="40002002:10:53:50"/>
- El valor de ‘ userid ‘ se cambia de » GeeksforGeeks » a » Geeks123 «, usando un editor de texto. Luego guarde el archivo y ábralo en el navegador web, complete el formulario y presione el botón Enviar.
- Al presionar el botón enviar:
Prevención de la manipulación de formularios HTML:
Hay muchas soluciones para la manipulación de formularios HTML. Algunos se dan a continuación:
- Claves secretas : una solución para la manipulación de formularios HTML es el uso de claves secretas. Puede detectar los cambios realizados en los campos, pero no es completamente infalible. Este método se basa en una clave secreta, que se almacena en un servidor web. Sin embargo, si tiene una buena cantidad de seguridad contra los robos y modifica la clave regularmente en su servidor web, será lo suficientemente seguro.
- HTTP_REFERER : los desarrolladores senior podrían pensar que la manipulación puede detenerse mediante la verificación de la variable HTTP_REFERER. Muchos navegadores web envían un encabezado: HTTP_REFERER, que contiene la URL de la página que el usuario vio antes. Para algunas aplicaciones web simples, HTTP_REFERER contiene solo la URL de la aplicación. Cuando el usuario intenta manipular el formulario guardándolo y luego enviándolo, HTTP_REFERER se vuelve en blanco o contendrá una URL diferente.
- Romper/eliminar cookies : lenguajes como Java y PHP guardan cookies en el servidor web, que son los datos de nuestra sesión gastada en la web. En este caso, los datos no se almacenan en el navegador web del usuario, por lo que resulta difícil que el usuario altere los campos de datos. Los datos del lado del servidor están referenciados por un identificador de cliente-servidor, en forma de una ID de sesión que se almacena como una cookie. Las cookies son de dos tipos:
- Cookies transitorias (de sesión)- Que vienen sin fecha de caducidad.
- Cookies persistentes- Viene con una fecha de caducidad, establecida en el futuro.
- Uso de algoritmos de resumen: los algoritmos de resumen crean una string de ‘firma’ única para cualquier campo de entrada. Esto hace que sea imposible que el usuario manipule los campos de entrada de un formulario porque estos algoritmos producen la misma firma. Estos algoritmos se utilizan en VPN, conexiones de navegador SSL, etc. para ‘firmar’ datos. También se puede utilizar en aplicaciones web para firmar los campos ocultos. El algoritmo de resumen más utilizado es Message Digest 5 , también llamado MD5 . El mejor algoritmo de resumen es SHA1 HMAC .
- Message Digest 5 : es un algoritmo de resumen ampliamente utilizado, utilizado en casi todas las aplicaciones web para firmar los campos ocultos, pero también sufre ataques de manipulación. Mientras usa el MD5, un usuario puede crear una huella digital de los campos ocultos. Puede concatenar los valores de los campos ocultos en una string y obtener una huella digital al pasarla por el algoritmo de resumen y enviarla a otro campo oculto. Sin embargo, se puede evitar que esto se altere agregando un componente secreto a la huella digital que el usuario nunca conocerá.
- Estándar HMAC : la forma estándar de usar un algoritmo de resumen es HMAC. Este algoritmo oculta los campos de entrada usando dos claves y tres iteraciones, a través de MD5 o SHA1.
Ejemplo: una aplicación web para cambiar la ‘dirección’ del usuario usando el algoritmo de resumen ‘MD5’ en el formulario para hacerlo a prueba de manipulaciones usando la biblioteca CGI en Perl.
Perl
#!/usr/bin/perl −T # Tamper-proof-form.pl use Digest::MD5 qw(md5_base64); use CGI qw/:standard/; # Secret password to sign the form variables: $secretkey = 'Geeks_for_Geeks_123'; # Printing the MIME header: print "Content−type: text/html\n\n"; print '<html><body>'; print '<h1>Tamper proof form example</h1>'; # Assigning some unchanged example values: $userid = 'GeeksforGeeks'; $credit_ok = 1; $form_expires = '30004004:11:52:40'; # Displaying a blank HTML form: if ( ! param('chaddr') ) { # Creating an MD5 signature: $signature = sigMD5( 'create', $secretkey, '$userid', '$credit_ok', '$form_expires'); print_form(); } else { # Validating the signature: if ( sigMD5( 'check', $secretkey, 'userid', 'credit_ok', 'form_expires' ) eq param('signature') ) { print "You made this easy ", param('userid'), "<br>"; print "You've successfully updated your address information."; } else { print "ERROR: 'Hidden' fields were tampered with!"; } } print "</body></html>"; sub print_form { # Printing an example HTML form with signature: print<<END_TEXT; <p><form action="http://netlify.app/cgi/Tamper-proof-form.pl" method="post"> <table> <tr> <td><b>Address line A:</b></td><td><input type="text" name="addressA"></td> <tr> <td><b>Address line B:</b></td><td><input type="text" name="addressB"></td> <tr> <td><b>City:</b></td><td><input type="text" name="city"></td> <tr> <td><b>Prov:</b></td><td><input type="text" name="prov"></td> <tr> <td><b>Postal:</b></td><td><input type="text" name="postal"></td> <tr><td colspan="2" align="center"> <input type="hidden" name="userid" value="$userid"> <input type="hidden" name="credit_ok" value="$credit_ok"> <input type="hidden" name="form_expires" value="$form_expires"> <input type="hidden" name="signature" value="$signature"> <input type="submit" name="chaddr" value="Change address"> </td></tr> </table> </form> END_TEXT } sub sigMD5 { my $mode = shift; my $key = shift; my @names = @_; my $values = ''; my $fieldname; # Joining each variable name with it's value: foreach $fieldname (@names) { if ($mode eq 'create') { $values .= $fieldname . eval $fieldname; } else { $values .= '$' . $fieldname . param($fieldname); } } $values = $key . $values; return md5_base64($values); }
- En la página de inicio de sesión anterior, cuando ejecutamos el formulario en nuestro navegador web y consideramos el código fuente HTML. El formulario contiene un nuevo campo oculto » firma » que almacena una » huella digital » MD5.
<tipo de entrada =”nombre oculto” =”ID de usuario” valor = “GeeksforGeeks”>
<tipo de entrada =”oculto” nombre =”crédito_ok” valor = “1”>
<tipo de entrada =”oculto” nombre =”form_expires” valor = “30004004:11:52:40”>
<tipo de entrada =”oculto” nombre =”firma” valor = “OZ+1iYhIPiDw5hJdtjywQA”>
- El valor de huella digital/firma anterior se generó usando ‘nombres’ y ‘valores’ de los campos ocultos, y también de la ‘clave secreta’ que se almacena en el servidor.
- Al enviar el formulario por parte del usuario, los contenidos de los campos ocultos se combinan con la clave secreta, generando una huella digital MD5. Una forma de verificar que los campos no hayan sido manipulados es haciendo coincidir la ‘firma’ producida por un MD5 con la firma en el formulario original.
Los métodos anteriores se pueden utilizar para evitar que el formulario HTML se altere en gran medida, pero no son completamente infalibles.
Ejemplo: alteración del formulario HTML al cambiar los campos ocultos en el formulario, que utiliza el algoritmo de resumen MD5.
- Formulario HTML:
- Guardando el formulario anterior con ‘ Ctrl+S ‘
- Campos inicialmente ocultos en el formulario:
HTML
<input type="hidden" name="userid" value="GeeksforGeeks" type="hidden" /> <input type="hidden" name="credit_ok" value="1" /> <input type="hidden" name="form_expires" value="30004004:11:52:40" /> <input type="hidden" name="signature" value="OZ+1iYhIPiDw5hJdtjywQA" />
El ‘ userid ‘ tiene el valor » GeeksforGeeks » y el tipo está oculto.
- Sobre la manipulación de los campos ocultos en el formulario:
HTML
<input type="hidden" name="userid" value="Geeks123" type="hidden" /> <input type="hidden" name="credit_ok" value="1" /> <input type="hidden" name="form_expires" value="30004004:11:52:40" /> <input type="hidden" name="signature" value="OZ+1iYhIPiDw5hJdtjywQA" />
- El valor de ‘ userid ‘ se cambia de » GeeksforGeeks » a » Geeks123 «, usando un editor de texto. Luego guarde el archivo y ábralo en el navegador web, complete el formulario y presione el botón Enviar.
- Al presionar el botón enviar:
- Ahora verificando el código fuente HTML del formulario enviado.
HTML
<input type="hidden" name="userid" value="Geeks123" type="hidden" /> <input type="hidden" name="credit_ok" value="1" /> <input type="hidden" name="form_expires" value="30004004:11:52:40" /> <input type="hidden" name="signature" value="KJ+1oUbLiDqf9kWcymuvAL" />
La aplicación web utilizaba el algoritmo de resumen MD5 , que evita la manipulación de formularios HTML. La diferencia puede verse claramente al comparar la firma original: ‘OZ+1iYhIPiDw5hJdtjywQA’ con la firma obtenida: ‘KJ+1oUbLiDqf9kWcymuvAL’ después de enviar el formulario.
Publicación traducida automáticamente
Artículo escrito por ayushraghuwanshi80 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA