2012-07-14 22 views
5

¿Hay algún encabezado HTTP para deshabilitar Javascript para una página específica? Mi sitio web ofrece contenido HTML generado por el usuario (es por eso que no puedo usar htmlenitities) y me gustaría evitar la creación de scripts (inyecciones de JavaScript).Deshabilitar la ejecución de JavaScript en páginas específicas (HTML/PHP)

Ya utilizo HttpOnly-cookies para autenticación en el dominio principal solamente, mientras que el contenido del usuario solo se muestra en subdominios donde la cookie no se puede leer. El problema es que todavía hay demasiadas posibilidades para ejecutar JavaScript, por ejemplo, usando atributos de eventos como onclick e Internet Explorer tiene incluso una propiedad en CSS para permitir ejecuciones de JavaScript (expression) de las que nunca antes había oído hablar. Otra idea interesante de la que he leído, fue acerca de lanzar una excepción para bloquear el siguiente código. Una idea más sería definir una lista que contenga todas las etiquetas permitidas y, además, una matriz con cada nombre de atributo permitido, pero este es un trabajo muy difícil y supongo que esto no cubriría todas las posibles inyecciones.

Supongo que no soy la única persona que tiene este problema, por lo que alguien sabe una posibilidad que cubre todo posible código dañino, al menos en los navegadores modernos?

Un simple encabezado imaginario similar a X-Scripting: disabled haría la vida mucho más fácil!

+0

¿Alguna vez has pensado en bloquear las etiquetas 'script' y ciertos atributos en la entrada del usuario? –

+0

A eso me refería con: "Una idea más sería definir una lista que contenga todas las etiquetas permitidas y, además, una matriz con cada nombre de atributo permitido, pero este es un trabajo muy difícil y creo que esto no cubriría todas las inyecciones posibles". (Así que, por ejemplo, permitiría etiquetas inofensivas como "div" o "span" y deshabilitaría atributos como "onclick", "onmouseover", pero esto no cubriría todas las inyecciones ya que los navegadores tienen diferentes propiedades y atributos específicos del navegador) –

Respuesta

2

Sí, hay un encabezado HTTP experimental llamado Content Security Policy que le permite controlar de dónde viene JavaScript, lo que puede hacer que XSS sea imposible. Sin embargo, actualmente solo es compatible con Chrome y Firefox.

Es una buena idea activar HTTPOnly-cookies, sin embargo esto evitará exactamente CERO ataques. Aún puede explotar XSS por reading CSRF tokens, and carrying out requests with an XHR.

Existen muchas formas de obtener XSS, y un escáner de vulnerabilidades como ShieldSeal encontrará (casi) todas ellas. Skipfish es un escáner de vulnerabilidad de código abierto que es muy primitivo, pero es gratuito. Así es como la mayoría de las aplicaciones web manejan vulnerabilidades ampliamente extendidas. (Trabajo para SheildSeal y ayudo a construir su escáner de vulnerabilidades y me encanta mi trabajo.)

Cuando se encuentra un problema, debe usar htmlspecialchars($var) o htmlspecialchars($var,ENT_QUOTES) para desinfectar la entrada. ENT_QUOTES puede evitar que un atacante introduzca un onclick u otro evento de JavaScript.

+0

El único problema es que los usuarios deben ser lo más libres posible al generar su contenido HTML, pero sin ejecutar un código dinámico del lado del cliente. Las inyecciones de SQL o las inyecciones de PHP no son un problema porque el código se almacena en una base de datos, no en archivos .php y todos los parámetros se limpian antes de cualquier uso en las declaraciones de SQL. Como por ejemplo, hay atributos necesarios como 'src' para' img'-tags. No puedo usar 'ENT_QUOTES' y desinfectar todas las entradas. Pero leeré más sobre la Política de seguridad de contenido para asegurar mi sitio, al menos para Firefox/Chrome-Users. –

+0

@Birk oah Lo leí mal, entonces quieres usar HTMLPurifier. También, por lo general, debe desinfectarse en el momento del uso, así que desinfecte la salida de xss.Sin embargo, HTMLPurifier utiliza una gran cantidad de recursos, por lo que es mejor usar que antes de introducir a la base de datos. – Mikey

+0

@Birk, también puede consultar el proyecto de Google Caja para una incrustación segura de HTML/CSS. https://developers.google.com/caja/ – JackWink

Cuestiones relacionadas