Agregar encabezados CSP en Django Project

La seguridad del sitio web ha sido un factor importante al desarrollar sitios web y aplicaciones web. Muchos marcos vienen con sus propias políticas de seguridad y los desarrolladores también intentan implementar las máximas políticas de seguridad mientras desarrollan sus aplicaciones. Aun así, incluso después de tanto trabajo duro, los piratas informáticos encontrarán nuevas formas de penetrar en nuestra aplicación y explotar nuestro código para detectar vulnerabilidades. En este artículo, vamos a implementar un encabezado de seguridad, a menudo denominado encabezados CSP para una aplicación Django.

Terminología

  • CSP : Content-Security-Policy es un encabezado de respuesta HTTP que los navegadores modernos usan para mejorar la seguridad de la página web al permitirle restringir cómo carga el navegador recursos como JavaScript, CSS o casi cualquier cosa.
  • Encabezado HTTP : los encabezados HTTP permiten que el cliente y el servidor pasen información adicional con una solicitud o respuesta HTTP como el tipo MIME, el código de estado de la solicitud, información de cookies y proxy, y más
  • XSS : también abreviado como Cross Side Scripting, los ataques XSS permiten a los atacantes inyectar scripts del lado del cliente en páginas web vistas por otros usuarios en palabras simples, si se explota puede cambiar la apariencia y el comportamiento de la página web.
  • Django: Django es un marco de aplicación web basado en Python que se utiliza para crear una variedad de aplicaciones web.

¿Qué es la política de seguridad de contenido?

Content-Security-Policy es un encabezado de respuesta HTTP que los navegadores modernos usan para mejorar la seguridad de la página web al permitirle restringir cómo los recursos como JavaScript, CSS o casi cualquier cosa que cargue el navegador están diseñados para prevenir ataques XSS. que permiten a los atacantes inyectar secuencias de comandos del lado del cliente en páginas web vistas por otros usuarios en palabras simples, si se explotan pueden cambiar el aspecto y el comportamiento de la página web. También se le llama el sucesor de los encabezados X-Content-Security-Policy o X-Webkit-CSP. CSP también se puede implementar mediante la metaetiqueta.

Cierta terminología de encabezado CSP es

  • default-src: la fuente predeterminada para cargar todo
  • style-src: fuente para cargar estilos
  • script-src: fuente para cargar javascript o generalmente scripts
  • img-src: fuente para cargar imágenes
  • object-src: fuente para cargar medios
  • report-to: URI para enviar informes por violar CSP
  • ‘self’: cargar desde el mismo host
  • ‘inseguro en línea’: permitir estilos y scripts en línea
  • ‘unsafe-eval’: permite eval() y métodos similares para crear código a partir de strings
  • ‘nonce’: una string aleatoria que debe ser única por solicitud

¿Cómo funciona la política de seguridad de contenido?

CSP funciona bloqueando la ejecución de estilos, scripts y otras cosas a menos que estén permitidos en la política. CSP no permite la ejecución de scripts y estilos en línea, lo que significa que no podemos usar las etiquetas <script/> y <style/> para javascript y estilos.

Un ejemplo de encabezados CSP es

Content-Security-Policy: default-src 'self';
style-src: 'self' stakpath.bootstrapcdn.com;
script 'self' *.cloudflare.com;
img-src 'self' imgur.com;

En este encabezado de CSP, le decimos al navegador que la fuente predeterminada para todos los estilos, secuencias de comandos, imágenes y objetos debe ser el dominio que se pasa en el encabezado, junto con eso, también permitimos la hoja de estilo de stackpath.bootstrapcdn.com que es CDN para estilos de arranque. También estamos permitiendo que los scripts se carguen desde todos los subdominios de Cloudflare usando un subdominio comodín y para las imágenes, el navegador puede permitir la carga desde imgur.com. Aparte de esto, si la página web intenta cargarse desde otros dominios como Twitter, el navegador bloqueará las requests.

Implementando encabezados CSP en Django

Django no viene con encabezados CSP en su núcleo, pero gracias a Mozilla, han creado un paquete Django-CSP para agregar encabezados CSP.

# installing django-csp
pip3 install django-csp

agregue CSP al middleware en nuestro archivo setting.py del proyecto Django y luego configuraremos nuestros encabezados

Python3

MIDDLEWARE = (
    # ...
    'csp.middleware.CSPMiddleware',
    # ...
)

Configuración de encabezados de CSP

Vaya al archivo de configuración del proyecto Django y agregue lo siguiente en el último o en cualquier lugar que desee

Python3

# uri to report policy violations
# uri to report policy violations
CSP_REPORT_URI = '<add your reporting uri>'
  
# default source as self
CSP_DEFAULT_SRC = ("'self'", )
  
# style from our domain and bootstrapcdn
CSP_STYLE_SRC = ("'self'", 
    "stackpath.bootstrapcdn.com")
  
# scripts from our domain and other domains
CSP_SCRIPT_SRC = ("'self'",
    "ajax.cloudflare.com",
    "static.cloudflareinsights.com",
    "www.google-analytics.com",
    "ssl.google-analytics.com",
    "cdn.ampproject.org",
    "www.googletagservices.com",
    "pagead2.googlesyndication.com")
  
# images from our domain and other domains
CSP_IMG_SRC = ("'self'",
    "www.google-analytics.com",
    "raw.githubusercontent.com",
    "googleads.g.doubleclick.net")
  
# loading manifest, workers, frames, etc
CSP_FONT_SRC = ("'self'", )
CSP_CONNECT_SRC = ("'self'", 
    "www.google-analytics.com" )
CSP_OBJECT_SRC = ("'self'", )
CSP_BASE_URI = ("'self'", )
CSP_FRAME_ANCESTORS = ("'self'", )
CSP_FORM_ACTION = ("'self'", )
CSP_INCLUDE_NONCE_IN = ('script-src', )
CSP_MANIFEST_SRC = ("'self'", )
CSP_WORKER_SRC = ("'self'", )
CSP_MEDIA_SRC = ("'self'", )

Puede agregar el nombre de host requerido según sus necesidades

Instrucciones para agregar configuraciones de encabezado CSP en Django Project

Aquí hay algunas instrucciones para implementar perfectamente CSP en sus aplicaciones web

  • Trate de evitar agregar nombres de host innecesarios
  • Verifique tantas veces como sea posible mientras agrega o elimina nombres de host
  • Hasta que sea absolutamente necesario, no agregue ‘inseguro en línea’, debilitará nuestra política de seguridad
  • Trate de evitar el estilo y los guiones en línea
  • Es mejor no usar CSP en el servidor de desarrollo desde el principio.
  • Siempre trate de usar HTTPS mientras carga scripts, estilos, imágenes.

Publicación traducida automáticamente

Artículo escrito por kushwanthreddy y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *