Configuración de las cabeceras de seguridad
Para ayudar a mejorar la seguridad de las aplicaciones web, configura los encabezados de seguridad HTTP en el perímetro o en tu aplicación. El siguiente ejemplo de JavaScript muestra cómo implementar estas cabeceras. Al modificar los encabezados de respuesta sobre la marcha, puedes añadir protecciones como estos encabezados de seguridad habituales sin necesidad de cambiar tu aplicación de back-end.
- X-XSS-Protection
- Impide que se cargue una página si se detecta un ataque XSS. Más información Por ejemplo:
"X-XSS-Protection": "1; mode=block",
- X-Frame-Options
-
Ayuda a prevenir ataques de clickjacking. Más información Por ejemplo:
"X-Frame-Options": "DENY", - X-Content-Type-Options
-
Evita que los navegadores puedan MIME-sniffing una respuesta fuera del tipo de contenido declarado. Más información Por ejemplo:
"X-Content-Type-Options": "nosniff", - Política de permisos
-
Permite controlar el acceso a las funciones del navegador. Por ejemplo, para no participar en el aprendizaje federado de cohortes ( FLoC ):
"Permissions-Policy": "interest-cohort=()", - Política de referenciador
-
Controla cuánta información de referencia se incluye en las solicitudes. Por ejemplo:
"Referrer-Policy": "strict-origin-when-cross-origin", - Estricto-Transporte-Seguridad
-
Impone conexiones seguras ( HTTPS ) a su servidor. Estas cabeceras no se establecen automáticamente porque su sitio web podría añadirse a la lista de precarga de Chrome HTTP Strict Transport Security ( HSTS ). Por ejemplo:
"Strict-Transport-Security" : "max-age=63072000; includeSubDomains; preload", - Política de seguridad de contenidos
-
Permite el contenido de un dominio de confianza y de todos sus subdominios. Más información Por ejemplo:
"Content-Security-Policy": "default-src 'self' example.com *.example.com",
Ejemplo de Javascript
export default {
async fetch(request) {
const DEFAULT_SECURITY_HEADERS = {
"X-Content-Type-Options": "nosniff",
"Referrer-Policy": "strict-origin-when-cross-origin",
"Cross-Origin-Embedder-Policy": 'require-corp; report-to="default";',
"Cross-Origin-Opener-Policy": 'same-site; report-to="default";',
"Cross-Origin-Resource-Policy": "same-site",
};
const BLOCKED_HEADERS = [
"Public-Key-Pins",
"X-Powered-By",
"X-AspNet-Version",
];
let response = await fetch(request);
let newHeaders = new Headers(response.headers);
const tlsVersion = request.cf.tlsVersion;
console.log(tlsVersion);
// This sets the headers for HTML responses:
if (
newHeaders.has("Content-Type") &&
!newHeaders.get("Content-Type").includes("text/html")
) {
return new Response(response.body, {
status: response.status,
statusText: response.statusText,
headers: newHeaders,
});
}
Object.keys(DEFAULT_SECURITY_HEADERS).map((name) => {
newHeaders.set(name, DEFAULT_SECURITY_HEADERS[name]);
});
BLOCKED_HEADERS.forEach((name) => {
newHeaders.delete(name);
});
if (tlsVersion !== "TLSv1.2" && tlsVersion !== "TLSv1.3") {
return new Response("You need to use TLS version 1.2 or higher.", {
status: 400,
});
} else {
return new Response(response.body, {
status: response.status,
statusText: response.statusText,
headers: newHeaders,
});
}
},
};