¿Podemos cambiar una parte de la salida en Varnish en cada respuesta?
Digamos que queremos proporcionar un token CSRF único para cada respuesta almacenada en caché por Varnish.
¿Existe alguna manera de enganchar la salida de Varnish para que podamos cambiar una parte específica del contenido de manera programática?
davy.ai
Sí, es posible enganchar la salida de Varnish y modificar partes específicas del contenido de forma programática. Varnish proporciona un lenguaje flexible llamado VCL (Varnish Configuration Language) que se puede utilizar para implementar lógica personalizada para interceptar y modificar solicitudes y respuestas.
Para implementar la funcionalidad deseada de proporcionar un token CSRF único para cada respuesta caché, podemos utilizar la subrutina
vcl_deliver
, que se llama antes de enviar la respuesta al cliente. En esta subrutina, podemos generar un token CSRF único y modificar la parte relevante del contenido de la respuesta utilizando la función integradaregsub
de Varnish.Aquí hay un ejemplo de fragmento de código VCL que demuestra cómo se puede lograr esto:
“`
sub vcl_deliver {
# Generar un token CSRF único
set req.http.x-csrf-token = randomstr(32);
# Modificar el contenido para incluir el token CSRF
if (resp.http.content-type ~ “text/html”) {
# Reemplazar la primera aparición de la etiqueta ‘
<
form’ con=””></form’>
set resp.http.content = regsub(resp.http.content, “<form”,></form”,><form …=”” csrf_token=” + req.http.x-csrf-token);
}
# Caché la respuesta modificada
set resp.http.cache-control = ” public,=”” max-age=”3600";” return=”” (deliver);=”” }=”” “`=”” este=”” código:=”” -=”” establece=”” un=”” token=”” csrf=”” único=”” en=”” el=”” encabezado=”” http=””
x-csrf-token
=”” de=”” la=”” solicitud=”” -=”” verifica=”” si=”” el=”” tipo=”” de=”” contenido=”” de=”” la=”” respuesta=”” es=”” html=”” -=”” utiliza=”” la=”” función=””regsub
=”” para=”” modificar=”” la=”” primera=”” aparición=”” de=”” la=”” etiqueta=””><form` en el contenido de la respuesta, agregando el token csrf generado como atributo– establece encabezados de control de caché apropiados para cachear la respuesta modificada
de esta manera, cada respuesta caché tendrá un token csrf único, proporcionando seguridad adicional contra ataques csrf. en=”” el=”” contenido=”” de=”” la=”” respuesta,=”” agregando=”” el=”” token=”” csrf=”” generado=”” como=”” atributo=”” -=”” establece=”” encabezados=”” de=”” control=”” de=”” caché=”” apropiados=”” para=”” cachear=”” la=”” respuesta=”” modificada=”” de=”” esta=”” manera,=”” cada=”” respuesta=”” caché=”” tendrá=”” un=”” token=”” csrf=”” único,=”” proporcionando=”” seguridad=”” adicional=”” contra=”” ataques=””></form` en el contenido de la respuesta, agregando el token csrf generado como atributo
– establece encabezados de control de caché apropiados para cachear la respuesta modificada
de esta manera, cada respuesta caché tendrá un token csrf único, proporcionando seguridad adicional contra ataques csrf.>