type script llamar insertar externo ejemplos desde cómo codigo archivo javascript html regex parsing code-injection

llamar - Cómo prevenir ataques de inyección de Javascript dentro del HTML generado por el usuario



llamar javascript desde html (7)

¿Crees que es eso? Mira esto .

Cualquiera que sea el enfoque que tome, definitivamente necesita usar una lista blanca. Es la única manera de acercarse a estar seguro de lo que está permitiendo en su sitio.

EDITAR :

No estoy familiarizado con .NET, desafortunadamente, pero puedes ver la batalla de stackoverflow con XSS ( http://blog.stackoverflow.com/2008/06/safe-html-and-xss/ ) y el código que fue escrito para analizar el HTML publicado en este sitio: enlace de Archive.org - obviamente, es posible que deba cambiar esto porque su lista blanca es más grande, pero eso debería ayudarlo a comenzar.

Estoy guardando HTML enviado por el usuario (en una base de datos). Debo prevenir ataques de inyección de Javascript. Lo más pernicioso que he visto es el guión en un estilo = "expresión (...)".

Además de esto, una buena cantidad de contenido de usuario válido incluirá caracteres especiales y construcciones XML, por lo que me gustaría evitar un enfoque de lista blanca si es posible. (Listado de todos los elementos y atributos de HTML permitidos).

Ejemplos de cadenas de ataque Javascript son:

1)

"Hola, tengo un problema de alerta de <script> (" bad! ") </ Script> con el elemento <dog> ..."

2)

"Hola, este <b style =" width: expression (alert (''bad!'')) "> Dog </ b> es negro."

¿Hay alguna forma de evitar dicho Javascript y dejar el resto intacto?

La única solución que tengo hasta ahora es usar una expresión regular para eliminar ciertos patrones. Soluciona el caso 1, pero no el caso 2.

Editar: Lo siento, olvidé mencionar el entorno: básicamente es la pila de MS:

  • SQL Server 2005
  • C # 3.5 (ASP.NET)
  • Javascript (obviamente) y jQuery.

Me gustaría que el punto clave sea la capa ASP.NET, cualquiera puede crear una mala solicitud HTTP.

Editar 2:

Gracias por los enlaces a todos. Asumiendo que puedo definir mi lista (el contenido incluirá muchos constructos matemáticos y de programación, por lo que una lista blanca será muy molesta) Todavía tengo una pregunta aquí:

¿Qué tipo de analizador me permitirá eliminar las partes "malas"? La parte mala podría ser un elemento completo, pero ¿qué pasa con estos scripts que residen en los atributos? No puedo eliminar <a hrefs> de cualquier manera.


¿Qué código del lado del servidor estás usando? Dependiendo de la cantidad de maneras en que se puede filtrar el script malicioso, pero es un territorio peligroso. Incluso profesionales experimentados quedan atrapados: http://www.codinghorror.com/blog/archives/001167.html


Actualmente, la mejor opción es usar un encabezado de política de seguridad de contenido como este:

Content-Security-Policy: default-src ''self'';

Esto evitará que se carguen tanto scripts en línea como externos, estilos, imágenes, etc., de modo que solo los recursos del mismo origen serán cargados y ejecutados por el navegador.

Sin embargo, no funcionará en navegadores antiguos.


Básicamente, como dijo Paolo, debes tratar de enfocarte en lo que los usuarios pueden hacer, en lugar de tratar de filtrar las cosas que se supone que no deben hacer.

Mantenga una lista de etiquetas HTML permitidas (cosas como b, i, u ...) y filtre todo lo demás. Probablemente también quiera eliminar todos los atributos de las etiquetas HTML permitidas (debido a su segundo ejemplo, por ejemplo).

Otra solución sería introducir el llamado código BB, que es lo que muchos foros usan. Tiene una sintaxis similar a HTML, pero comienza con la idea de una lista blanca de código permitido, que luego se transforma en HTML. Por ejemplo, [b] ejemplo [/ b] daría como resultado un ejemplo . Asegúrese de usar código BB para filtrar las etiquetas HTML de antemano.


La única manera realmente segura de ir es usar una lista blanca. Codifique todo, luego convierta los códigos permitidos.

He visto intentos bastante avanzados de solo desautorizar código peligroso, y todavía no funciona bien. Es toda una hazaña intentar capturar de forma segura todo lo que cualquiera pueda pensar, y es propenso a hacer reemplazos molestos de algunas cosas que no son peligrosas en absoluto.


La lista blanca de elementos y atributos es la única opción aceptable en mi opinión. Cualquier cosa que no esté en su lista blanca debe ser eliminada o codificada (cambie <> & "a entidades). También asegúrese de verificar los valores dentro de los atributos que permite.

Algo menos y te estás abriendo a problemas: hazañas conocidas o las que se descubrirán en el futuro.


Puede usar esta función de restricción.

function restrict(elem){ var tf = _(elem); var rx = new RegExp; if(elem == "email"){ rx = /[ ''"]/gi; }else if(elem == "search" || elem == "comment"){ rx = /[^a-z 0-9.,?]/gi; }else{ rx = /[^a-z0-9]/gi; } tf.value = tf.value.replace(rx , "" ); }