{: NES 0.9 none :} {: # ---------------------------------------------------------------------------- NES 0.9 beta by - Skriptke Copyright 2009 - 2010 Enrique F. Castañón Licensed under the GNU GPL. http://sourceforge.net/projects/nes/ Sample to use Nes; ---------------------------------------------------------------------------- :}
Ofusca los campos de un formulario y añade otras opciones de seguridad que dificultan que los robots accedan a los formularios.
Para cargar cualquier Plugin debemos añadirlo a la lista de script de nuestro archivo nhtml:
{: NES 1.0 ('{: * cfg_plugin_top_dir :}/plugin.pl','my_file.pl') :}El orden es importante, para Forms es necesario cargar primero:
{: NES 1.0 ('{: * cfg_plugin_top_dir :}/forms.pl','my_file.pl') :}Si se va a incluir un Captcha dentro de Forms es necesario cargar forms_captcha.pl en vez de forms.pl:
{: NES 1.0 ('{: * cfg_plugin_top_dir :}/forms_captcha.pl','my_file.pl') :}Que es lo mismo que hacer esto:
{: NES 1.0 ( '{: * cfg_plugin_top_dir :}/captcha.pl', '{: * cfg_plugin_top_dir :}/forms.pl', 'my_file.pl' ) :} (*Hemos partido aquí ésta linea por razones de legibilidad, pero es un error ya que NES es el único Tags que no permite partir lineas)Pero como hemos comentado el orden es importante, y en este caso sería necesario cargar primero captcha.pl y después forms.pl, para no tener que recordar estos detalles y simplificar las cosas hemos creado forms_captcha.pl que básicamente lo que hace es esto:
... do "$dir_plugin/captcha.pl"; do "$dir_plugin/forms.pl"; ... Ver: Plugins
archivo.nhtml:
{: NES 1.0 ('{: * cfg_plugin_top_dir :}/forms.pl','archivo.pl') :} <html> <head> <title>Nes sample/title> </head> <body> ... {: & form (form1) {: & check ( 'user: 4,30', 'password: 4,20' ) :} <form id="form1" name="form1" method="post" action=""> User: <input type="text" name="{: & obfuscated user :}" /> Password:<input type="password" name="{: & obfuscated password :}" /> </form> :} ... </body> </html>archivo.pl:
use Nes; my $nes = Nes::Singleton->new('archivo.nhtml'); # Obtenemos la dirección de Forms my $form = nes_plugin->get('forms_plugin','form1'); # Comprobamos que es correcto mediante is_ok if ( $form->{'is_ok'} ) { ... } else { ... } $nes->out();
{: & form (name,auto_submit,captcha_name,captcha_last,expire,expire_last,location,attempts) [{: & check ( 'field: nin,max,type', ... ) :}] [HTML] <input type="text" name="{: & obfuscated field :}" /> [HTML] :}
Sólo name es obligatorio, el resto de parámetros si no se indican se leeran de archivo de configuración o tomarán sus valores por defecto.
name:El nombre del formulario, debe conincidir con el valor de name en <form>
{: & form (the_name) ... <form name="the_name" method="post" action=""> ...auto_submit:
Los formularios de Forms se cargan en dos pasos, el último paso se carga solo (mediante javascript) si auto_submit es 1 que su valor por defecto. Cuando es 0 hay que pulsar en el botón de enviar para terminar el formulario. Puede ser necesario ponerlo a 0 en el caso de querer cargar un Captcha en el último paso.
captcha_name:Si se incluye un Captcha dentro de Forms es necesario indicar su nombre. Por defecto captcha_name no tiene valor.
{: & form (name,,captcha_name) ... {: & captcha (captcha_name,ascii) ...captcha_last:
Si se incluye un Captcha dentro de Forms y se va a mostrar en el último paso. Cualquier valor distinto de cero, por defecto captcha_last no tiene valor.
expire:Tiempo de expiración del formulario a partir del cual ya no será válido. El tiempo se indica con un sufijo; s: segundos, m: minutos, h: horas, d: dias, M: meses, y: años, ej.:
30s # 30 segundos 5m # 5 minutos 1M # 1 mesexpire_last:
En el último paso del formulario, expiración en el mismo formato que expire. Aumenta la seguridad del formulario, puesto que en el último paso el tiempo necesario para pulsar el botón o rellenar un Captcha es de unos segundos, la Cookie se puede hacer que caduque en esos segundos, en vez de en minutos como es necesario para rellenar un formulario completo. El valor por defecto se toma del archivo de configuración.
location:Página a la que se envía si el formulario da un error. Si se desea gestionar los errores de otra forma se puede indicar none. Por defecto es la misma página que lanza el formulario. Se envía en GET error_forms con el valor del error.
attempts:En formato: número de intentos / tiempo. Es el máximo de intentos permitido, una vez llegado al máximo, en cualquier tiempo, hay que esperar el tiempo indicado o dará error aunque los datos seán válidos. El valor por defecto se toma del archivo de configuración.
10/5 # Después de 10 intentos hay que esperar 5 minutos
El tiempo de expiración se controla mediante la variable forms_plugin_expire_attempts del archivo de configuración .nes.cfg
Ofusca el campo del formulario:
{: & form ... [HTML] <input type="text" name="{: & obfuscated field :}" /> [HTML] :}El nombre del campo tendrá un valor distinto cada vez que se carge la página.
Opcionalmente podemos chequear los campos del formulario antes de que estos sean enviados:
{: & form ... {: & check ( 'field: nin,max,type', ... ) :} [HTML] <input type="text" name="{: & obfuscated field :}" /> [HTML] :}field:
Nombre del campo de formulario a chequear. Despues hay que indicar dos puntos con las siguientes opciones:
nin:Caracteres mínimos que debe tener el campo.
max:Caracteres máximos que debe tener el campo.
type:Puede ser num que comprueba que el campo contenga un número, email y se comprueba que el contenido del campo sea una dirección email válida, o una expresión regular Perl encerrada entre barras: /regex/.
Cuando mezclamos los Plugins Forms y Captcha hay que tener en cuenta ciertas consideraciones:
El Captcha se va a mostrar a la vez que el resto camposSi el Captcha se muestra junto a los demás campos captcha_last debe se 0 ó estar vacío, se debe encerrar el Capcha en una expresión con la variable de entorno nes_forms_plugin_nameform_last_step:
{: & form (form_name,,captcha_name) {: # si NO es el último paso mostrar el Captcha :} {: ~ ( ! * nes_forms_plugin_form_name_last_step ) ... {: & captcha (captcha_name,ascii) ...El Captcha se va a mostrar en un segundo paso
Si deseamos que el Captcha se muestre una vez rellenados todos los campos del formulario, en el último paso, el valor de auto_submit debe ser 0, captcha_last debe tener un valor distinto de 0 y se debe encerrar el Capcha en una expresión con la variable de entorno nes_forms_plugin_nameform_last_step:
{: & form (form_name,0,captcha_name,last) {: # si es el último paso mostrar el Captcha :} {: ~ ( * nes_forms_plugin_form_name_last_step ) ... {: & captcha (captcha_name,ascii) ...Cargar el Plugin adecuado
El Plugin a cargar para mezclar los Plugins Forms y Captcha es forms_captcha.pl
{: NES 1.0 ('{: * cfg_plugin_top_dir :}/forms_captcha.pl','my_file.pl') :}
Último mensaje lanzado por Forms: (se incluye para depuración)
{: * nes_forms_plugin_(name_form)_error_last :}
Cuenta del número de intentos:
{: * nes_forms_plugin_(name_form)_attempts :}
Será 1 si el formulario es correcto:
{: * nes_forms_plugin_(name_form)_is_ok :}
Si existe un error en cualquier campo del formulario:
{: * nes_forms_plugin_(name_form)_error_field :}
Si existe un error en un campo concreto del formulario:
{: * nes_forms_plugin_(name_form)_error_field_(name_fiend) :}
Número de error de Forms, cualquier valor no 0 indica que el formulario no es válido:
{: * nes_forms_plugin_(name_form)_error_fatal :} 0: No hay error. (no supone que que el formulario sea correcto) 1: La Cookie ha expirado o no existe. 2: * Valor interno de la Cookie expirado, "posible" manipulacion. 3: * La clave hash de la Cookie no conincide, "posible" manipulacion. 4: No se ha defido la clave del formulario, ej. Javascript deshabilitado. 5: Se ha alcanzado el máximo de intentos. 6: * Se intenta usar una cookie válida ya usada. 7: * No se ha defido la clave del formulario, "posible" manipulacion. * El botón "Back" del Navegador puede dar este tipo de errores.
Estas variables están disponibles desde Perl como:
use Nes; my $nes = Nes::Singleton->new('archivo.nhtml'); # Obtenemos la dirección Forms my $form = nes_plugin->get('forms_plugin','the_name'); # {: * nes_forms_plugin_(name_form)_error_last :} $form->{'last_error'}; # {: * nes_forms_plugin_(name_form)_error_fatal :} $form->{'fatal_error'}; # {: * nes_forms_plugin_(name_form)_attempts :} $form->{'attempts'}; # {: * nes_forms_plugin_(name_form)_is_ok :} $form->{'is_ok'};
# tiempo suficiente para rellenar el formulario, 15m son 15 minutos # sufijo tiempo: s: segundos, m: minutos, h: horas, d: dias, M: meses, y: años forms_plugin_expire = 15m # tiempo suficiente para pulsar ok o rellenar el captcha (y que carge la página) # sufijo tiempo: s: segundos, m: minutos, h: horas, d: dias, M: meses, y: años forms_plugin_expire_last = 30s # nombre de la variable que controla el formulario forms_plugin_start = nes_secure_form_start # nombre de la variable que identifica el último paso del formulario forms_plugin_finish = nes_secure_form_finish # sufijo del archivo temporal forms_plugin_suffix = .forms_plugin_tmp # número maximo de intentos / minutos # 15/5 es 15 intentos cada 5 minutos, despues de 15 intentos tendrá # que esperar 5 minutos para volver a intentarlo o dará error forms_plugin_max_attempts = 20/5 # tiempo de expiración de los archivos temporales # guarda el valor de attempts durante el tiempo indicado aquí forms_plugin_expire_attempts = 1h
Puedes ver un ejemplo real: comentario