Chose Language:
Author: Admin/Publisher |not finished |not checked

CSP en PHP

Las siglas de CSP significan Content security policy esta es una capa adicional de seguridad, en este caso veremos como aplicar CSP en PHP.

La CSP nos permite inhabilitar la carga de varios tipos de scripts, css, archivos, etc; así también como habilitarlos.

La razón principal de la existencia del CSP es el intento de evitar el Cross Site Scripting (XSS).

El tener un CSP en tu página reducirá notoriamente el ataque a tu página web.

Directivas

https://blastcoding.com/csp-en-php/#directivas

CSP pose muchas directivas las cuales podemos utilizar, estas nos permiten definir donde estamos aplicando una limitación o permitiendo una acción.

Las directivas determinan que procedimientos o acciones se realizaran con respecto a una url dada

podemos ver todas las directivas en https://content-security-policy.com/

Veamos las directivas mas utilizadas

default-src

es la directiva predefinida para(JavaScript, imágenes, CSS, fuentes, solicitudes AJAX, marcos, medios HTML5). Esto quiere decir que si una la una de las siguientes directivas no esta presente default se encargara (script-src, style-src, img-src, font-src, connect-src, media-src y object-src)


script-src

Define las fuentes de Javascript


style-src

fuentes para estilos en linea o CSS


connect-src

fuentes para XMLHttpRequest (AJAX), WebSocketfetch()<a ping> or EventSource


font-src

Procedencia de las fuentes


object-src

fuente o procedencia valida para plugins, eg <object><embed> o <applet>


media-src

Define la procedencia de videos y audios <audio><video>


frame-src

este estuve en duda si ponerlo ya que los frame no están tan bien visto que se usen pero google muchas veces lo usa cuando estamos usando alguna de sus apis por ejemplo google maps, google adsense, analytics u otra.

Define la procedencia valida para carga los frames


form-action

fuente valida para un formulario HTML


base-uri

Define las urls permitidas para el uso en el atributo src de una etiqueta HTML.

herramientas que nos puede ayudar al crear nuestro CSP

https://blastcoding.com/csp-en-php/#herramientas

Herramientas:

  • inspector (herramienta del navegador firefox)
  • https://csp-evaluator.appspot.com/ o similar

Como usaríamos el inspector, pues su uso es simple, abrimos el inspector de firefox con click derecho > inspecionar. Una vez abierto el inspector debemos saber como obtener nuesto CSP.

Para obtener la CSP debes ir a Red o network dependiendo en que idioma tengas el navegador.

Cuando entremos a una página recargaremos la página e iremos al primer GET dentro de network(red), dentro de la pestaña de red deberíamos tener otra ventana con las siguientes pestañas (cabeceras, cookies, solicitud, respuesta, tiempos y seguridad). Clickea en cabecera

dentro de cabeceras buscaremos content-security-policy y su contenido.

este contenido podremos copiarlo y pasarlo por el evaluator.

Crear el CSP en PHP

https://blastcoding.com/csp-en-php/#creacion

Para PHP podemos usar la función header para crear nuestro content security policy(CSP). Mi recomendacion es ponerla dentro de una función y así usarla directamente en nuesto header o si estamos usando wordpress utilizar algo como

add_action('wp_headers', 'add_content_security_policy_header',1);
function add_content_security_policy_header() {
    global $nonce;
	header("Content-Security-Policy:".
	"default-src 'self' ".
		"https://*.web1.com/ ".
		"https://www.web2.com; ".
	"script-src ".
		base()." ".
		"'nonce-$nonce'; ".
	"style-src 'self' ". 
		"'unsafe-inline' ".
		"'nonce-".$nonce."'; ".
	"img-src 'self' ".
		"https://* data: ; ".
	"font-src 'self' ".
		"data: ".
		"https://ka-f.fontawesome.com; ".
	"connect-src 'self' ".
		"https://www.google-analytics.com ".
		"https://*.googlesyndication.com/ ".
		"https://www.google.com/ ".
		"https://fundingchoicesmessages.google.com ".
		"https://ka-f.fontawesome.com/; ".
	"base-uri 'self'; ".
		"");
}
  • el nonce es un numero aleatorio solo usado una vez. este se usa para los script en linea, ya que no deberíamos usar inline-unsafe sino un nonce o un hash.
  • en caso de usar estilos deberemos usar inline-unsafe, nonce no funciona en los estilos
  • La idea del nonce es que este no se pueda saber por el atacante, crear un numero random puede servir como nonce, el numero debe ser grande, no haga números random pequeños.
  • En el caso de usar nonce en nuestro proyecto debemos hacer que este sea único, recuerda que PHP tiene algunas funciones q cumplen con esto, no uses el tiempo como nonce, eso seria u n grave error.
  • Por otro lado, también hay paquetes de terceros que se encargan de esto.
Category: php
Something wrong? If you found an error or mistake in the content you can contact me on Twitter | @luisg2249_luis.
Last 4 post in same category