Error interno luego de clickear en un evento con acción predefinida 'Vínculo'

Hola,

Hace unos días venimos experimentando un problema que antes no teníamos en una personalización que hice.
Empezamos a recibir reclamos de algunos usuarios que usando el sistema se encontraban con que de repente clickeaban en algún evento y los llevaba a una pantalla en blanco que dice “Error interno”.

Hace un rato me di cuenta que esto ocurre despues de haber clickeado en un evento en particular que tiene como acción predefinida un vínculo. Este vínculo lleva a un php plano que permite la descarga de un archivo que previamente subió el usuario.

Es decir, no falla el vínculo que permite bajar el archivo, sino que LUEGO de haber usado el vínculo, si quiero realizar cualquier otra operación, como cambiar de tab o clickear en cualquier otro evento, me lleva a la pantalla de “error interno”.

Esta funcionalidad no daba este problema hasta hace unas semanas, y no hicimos cambios sobre la misma por lo que me desconcierta un poco, y lo único con lo que puedo asociarlo es con que hace muy poco actualizamos la versión de guarani de 3.11 a 3.12, y con ello también la versión de toba, a 2.7.

Adjunto una imagen donde pueden ver como está configurado el evento para la descarga del archivo.

El siguiente es el código para la descarga:


function descarga_archivo($path_archivo, $nombre_descarga)
{
	if (substr($path_archivo,0,4)=='http')
	{
		$fileSize = array_change_key_case(get_headers($path_archivo, 1),CASE_LOWER);
		if ( strcasecmp($fileSize[0], 'HTTP/1.1 200 OK') != 0 ) { $fileSize = $fileSize['content-length'][1]; }
		else { $fileSize = $fileSize['content-length']; }
	} else { $fileSize = @filesize($path_archivo); }

	header("Pragma: public");
	$ctype = mime_content_type($path_archivo);
	header("Content-Type: $ctype");
	header("Content-Disposition: attachment; filename=\"".basename($nombre_descarga)."\";" );
	header("Content-Transfer-Encoding: binary");
	header("Content-Length: ".$fileSize);
	readfile("$path_archivo");
	exit();
}
// $path = ... 
// $nombre_original = ... 
descarga_archivo($path, $nombre_original);


El error que me aparece en los logs es :


web_1 | 
toba_error_seguridad: Error Interno Request Invalido
[TRAZA]exception 'toba_error_seguridad' with message 'Error Interno' in /var/local/gestion/lib/toba/php/nucleo/toba_nucleo.php:541
Stack trace:
#0 /var/local/gestion/lib/toba/php/nucleo/toba_nucleo.php(76): toba_nucleo->verificar_pedido_post()
#1 /var/local/gestion/www/aplicacion.php(27): toba_nucleo->acceso_web()
#2 {main}, referer: http://10.26.0.243:3000/guarani/3.10/aplicacion.php?ah=st57d1b13f37f0e3.13460987&ai=guarani||abm_grupos_oferta_examen


Tienen idea por donde puedo encarar una solución? porque estoy totalmente perdido con esto.

Editado: Encontré un workaround!
Si le tildo la opción de “Vínculo - es popup” , deja de suceder. Aún así no entiendo porque ocurre. Imagino que debe tener que ver con la toba::memoria(), pero no entiendo que cambió para que esto empiece a suceder.

Saludos y gracias desde ya


Screenshot - 080916 - 15:56:02.png

Screenshot - 080916 - 15:56:02.png

Hola Daniel,

ese error que te aparece, es porque esta saltando el contro para evitar ataques CSRF, lo extraño es que este saltando con un vinculo, ya que unicamente se chequean los pedidos post… y hasta donde se, el vinculo se navega via GET.
Luego de descargar el archivo que otra cosa hacen?

Saluduos

Hola Richard,

Claro, es que el error no aparece al clickear en el vínculo que te lleva a la descarga, sino que LUEGO de haber descargado el archivo (que eso funciona bien) , cualquier acción posterior falla, ya sea un cambio de tab, o click en cualquier evento.

Vale aclarar para darte unp oco de contexto, que el vínculo está puesto en un cuadro que está dentro de un tab. Y en ese mismo tab también hay un form. Sin embargo, como ya dije, el error no ocurre al enviarse el form, sino con cualquier otra acción.

Lo único que se me ocurre que puede estar ocasionando algún problema , es que algo esté jodiendo con la memoria cuando hay un php plano que se ejecuta en el medio, y que tal vez la opción “vínculo popup” maneje una celda de memoria diferente y por eso el problema se haya solucionado tildando esa opción.

Saludos

Hola Daniel,

te hago una consulta, el form que esta en la pantalla tiene un evento predefinido?.. si es asi, se dispara un post con cualquier interaccion (salvo que te vayas por el menu) y por eso podria estar saltando el chequeo.

Saludos

Hola Richard,

Efectivamente hay un evento implícito en el formulario, si a eso te referías con predefinido.

Saludos

Daniel,

si me referia a eso, le chingue con el termino :D.

El tema es el siguiente, cuando se va a hacer el download se esta regenerando el token… cuando viaja el form con el evento implicito, el token que presenta ya no es valido y por tanto sale el error.
El hecho de utilizar una celda de memoria diferente y que se desactive el reciclado de memoria (para el popup), hace que ese pedido de pagina sea ‘invisible’ y por tanto la modificacion del token tambien.

Saludos

Hola Richard,

Te hago una consulta más, se te ocurre algún otro workaround mejor que el de levantar un popup?
Principalmente para no molestar al usuario con la apertura de una ventana.

Desde ya, muchas gracias.

Saludos!

Hola Daniel,

podes intentar cambiando la celda de memoria del vinculo, aun cuando no se abra en popup… pero no se si funque, tendrias que desactivar el reciclado de memoria tambien.

Saludos