En los bits que he buscado sobre esto, he visto a algunas personas declarar como palabra de Dios que solo debes desinfectar las salidas y no las entradas. ¿Por qué? ¿No sería más seguro cubrir ambos extremos?
En los bits que he buscado sobre esto, he visto a algunas personas declarar como palabra de Dios que solo debes desinfectar las salidas y no las entradas. ¿Por qué? ¿No sería más seguro cubrir ambos extremos?
Al sanear la entrada, se arriesga a alterar los datos de manera que puedan inutilizarse. Por lo tanto, se evita el saneamiento de entrada en los casos en que se desconoce la naturaleza de los datos. Por ejemplo, tal vez algunos caracteres especiales tienen importancia en los datos y eliminarlos significa destruirlos.
Un escenario como este puede ser que su sistema almacena datos que luego pueden ser extraídos a un sistema de terceros, y en ese sistema esos caracteres tienen un significado. Al eliminarlos, ha alterado los datos de manera significativa. Por ejemplo, tal vez la cadena se usa como una clave para buscar un registro en el sistema de un tercero y al eliminar el símbolo, se modifica la clave para que no se pueda encontrar el registro.
El saneamiento de entrada se puede usar cuando se conoce esa naturaleza de los datos y el saneamiento no afectaría adversamente a los datos de ninguna manera.
Su decisión de sanear los datos de entrada es en parte una decisión comercial. ¿Dependerá el sistema de terceros de la entrada exactamente como se proporciona? Si es así, probablemente no sea una buena idea. Sin embargo, es posible que pueda configurar las expectativas de tal manera que los terceros entiendan que estará limpiando los datos de entrada en función de un criterio específico que comparta con ellos.
Gee ... "Desinfectar la salida". Nunca he escuchado ese término usado antes. He estado haciendo esto para, oh, no lo sé. Más de una década al menos ahora. No "desinfecta su salida", la codifica para el contexto adecuado dentro de la aplicación que se presenta. Usted codifica la salida para HTML, Atributo HTML, URL, JavaScript ... Nunca he visto ni escuchado a nadie decir que "desinfecta" su salida ... ¿quiere decir gente en el sentido de en la lista blanca o en la lista negra, ¿qué cadenas de caracteres en particular se pueden enviar por cable al navegador, por ejemplo? Nadie hace eso. De todos modos, no deberían hacerlo, por las razones enumeradas anteriormente: no sabe qué puede ser el uso legítimo de datos particulares para una aplicación determinada ... algunos sitios web (como, por ejemplo, este) deben permite que el código se cargue y luego se represente como código w / en el ciclo de vida de la solicitud-respuesta. Al no permitir el uso de, digamos, una etiqueta de script, ¿cómo podrían intercambiarse ejemplos de código en los sitios de código compartido?
Por cierto, "En retrospectiva, nunca puedes revisar la base de datos y ver cuántas publicaciones fueron maliciosas". simplemente no es verdad Hay depuradores disponibles para pasar por una base de datos y "limpiarlo" de código malicioso. Lo sé, lo hice el año pasado para una importante empresa de servicios financieros.
No sabe cómo para sanear los datos hasta que los genere, o más precisamente use .
En muchos casos puede parecer obvio; en tu motor de blogs quieres filtrar las etiquetas de script; siempre y siempre, así que simplemente elimínelos de la entrada y nunca vuelva a pensar en ellos.
En otros casos, puede que no sea tan fácil; Si los mismos datos se utilizan en diferentes contextos. "<" debe eliminarse a "& lt;" en html y es completamente inofensivo si se exporta como texto.
Pero incluso si es simple, eliminando < script > de su entrada usted pierde datos importantes. En retrospectiva, nunca puede revisar la base de datos y ver cuántas publicaciones fueron maliciosas.
Luego viene la posibilidad de mover las publicaciones de objetivos: alguien encuentra un nuevo exploit con el que tu filtro no trata. De repente, debe volver a aplicar un filtro fijo en toda su base de datos. ¿Qué sucede si hay un error falso positivo en tu corrección?
Pero incluso si está absolutamente seguro de que los datos publicados están completamente libres de virus, virus, etcétera, es completamente seguro mostrarlos en un navegador; simplemente no puedes meterlo en tu base de datos. Así es como nacen las inyecciones SQL.
La conclusión es que hasta que use los datos, no podrá saber cómo se ven los datos "malos", y cada cada vez que use los datos debe desinfectarlos. .
Intentar arreglar los datos por adelantado es como zurcir los calcetines antes de que haya un agujero en ellos.
Es un riesgo tener contenido XSS en su base de datos. Las bases de datos están destinadas a ser compartidas por las aplicaciones, y son de larga duración en comparación con las aplicaciones web.
Ejemplo: el nuevo interno comienza a trabajar en una nueva aplicación web para la db, muestra a su jefe y bam, su cookie de inicio de sesión está en San Petersburgo.
No desea alterar la entrada del usuario, quiere validar la entrada del usuario y rechazar si contiene el posible XSS. Esto es bastante fácil y rápido con un analizador HTML adecuado como JSoup. Está integrado en Hibernate Validator.
No estoy diciendo que no debas escapar de la entrada del usuario en la salida. Sin embargo, con la cantidad de problemas de XSS, obviamente es fácil perder algunos.
Recomendaría validar el imput y desinfectar la salida. De esa manera, puede asegurarse de que los datos válidos se almacenen en la base de datos y los datos inocuos se consuman en el extremo de los usuarios.
Si un campo espera una fecha, asegúrese de estar recibiendo una fecha. Puede validar fácilmente fechas, números, correos electrónicos, códigos postales, números de teléfono y muchos campos. Así que hazlo.
Hágalo en javascript, en el lado del cliente, Y hágalo nuevamente en el lado del servidor. Si realiza la validación en el lado del cliente, puede generar un mensaje de error mucho más rápido que esperar hasta el servidor, validarlo y enviarlo de vuelta. Vuelva a hacerlo en el servidor, porque si alguien desactiva la validación del lado del cliente, todavía está cubierto.
Desinfecte antes de almacenar los datos, no quiere que lo golpee una inyección de SQL. Use declaraciones preparadas, si es posible, y evite todos los caracteres de control si no es posible.
En el lado de salida, codifique los datos como inofensivos en el formato de servidor. Si está generando HTML, escape todos los caracteres HTML especiales. Si está generando json o XML, haga la codificación correspondiente.
Como han dicho otros, filtrar y codificar los datos en el tamaño de la entrada destruirá los datos y puede eliminar parte de los datos que serían inofensivos en algunos contextos, o mantener datos peligrosos. Validar la entrada y codificar la salida sería el mejor enfoque.
Lea otras preguntas en las etiquetas validation