martes, 22 de abril de 2025

Python(XXVII). Beforeware. Aplicando el ENI (II). Comprobación de las entradas de datos. FastHTML beforeware

 1. Beforeware en FastHTML

Cuando creamos una aplicacion FastHTML utilizando app = FastHTML(), podemos pasar un parámetro que es "before=Beforeware(función)" siendo "función" el nombre de una función que hemos definido para ejecutarse justo antes de ejecutar una ruta. Si la función devuelve "None", la petición sigue normalmente. Andreas Stokl lo explica muy bien.

Uno de nuestros objetivos a verificar es que el "tab_id" sea el correcto y que tengamos un usuario correcto.Para ello, sino se cumplen estos requisitos, se redirigirá a la pantalla de login.

Para ello se define una función que será la del beforeware:

#2. Beforeware function to be executed in all endpoints
def my_before_function(req, tab_id, sess):
	'''
	Beforeware function: checks that the user is authenticated
	'''
	print('Des de beforeware, la URL es:', req.url)
	# 1. Validem que haja tab_id i que l'usuari estiga en la sessió de la BD
	my_response,myerror=xmsession.validate(tab_id=tab_id, req=req)
	if (len(myerror.strip())>1):
		print ("redirecting from my_before_function " )
		return my_response

Otra cosa importante, es decirle al beforeware que regex hay que saltarse "skip"para que no haga comprobaciones en cada caso. En AnswerDotAi se puede ver mirando el comentario del código.

# To create a Beforeware object, we pass the function itself, and optionally a list of regexes to skip.
my_before_function = Beforeware(my_before_function, skip=[r'/favicon\.ico', r'/static/.*', r'.*\.css', '/login'])

Ahora hay que indicarselo a la aplicación:

app = fh.FastHTML(
	hdrs=my_headers, 
	before=my_before_function,
	secret_key=xmother.new_id(25), 
	exception_handlers=exception_handlers)

 2. Lo que se puede hacer con beforeware:

Se puede:
  • Guardar para auditar en la BD, las peticiones (url, usuario, fecha y hotra, IP ...)
  • Verificar si el usuario tiene permisos para acceder a dicha URL
  • Detectar si hay código malicioso en la petición (inyección de SQL ...)



No hay comentarios :

Publicar un comentario