El propósito de escapar de las entidades html

0

Por principios de seguridad, a menudo se nos enseña a desinfectar los campos de entrada para caracteres como & o ' para que no puedan usarse para inyecciones SQL, etc.

Sin embargo, ahora tengo un problema: realmente necesito almacenar una entrada de cadena que contendría estos caracteres. Es un requisito de negocio. Mis escáneres de código definitivamente marcarán esto en una alerta de advertencia ya que esta es una vulnerabilidad clásica de inyección de SQL si no desinfecto la entrada. Mi base de datos luego almacenaría la cadena &amp en lugar de & (solo un ejemplo). Pero esto no es lo que queríamos. Realmente queríamos el literal & o ' almacenado en la base de datos.

¿Cuáles son las buenas maneras de hacer esto?

    
pregunta Pang Ser Lark 21.08.2015 - 12:40
fuente

3 respuestas

4

Cualquier analizador de análisis estático decente no marcaría una vulnerabilidad si estuviera almacenando HTML sin procesar en su base de datos; después de todo, solo es una cadena.

Las secuencias de cadenas solo se vuelven peligrosas cuando se pasan a través de una "función de sumidero".

Por ejemplo, <script> es completamente seguro para almacenar en su base de datos. De hecho asi es Robert'); DROP TABLE Students;-- .

Este último solo es peligroso cuando se pasa de una variable de cadena y se concatena a una consulta codificada en la aplicación porque toda la cadena se pasa al servidor de la base de datos y no conoce la diferencia entre la consulta y los datos. Esta es la razón por la que debería usar consultas parametrizadas para pasar datos a su base de datos; entonces, la propia base de datos sabe qué interpretar como datos fuertemente tipados, y qué interpretar como la propia construcción de la consulta.

Al enviar al navegador, aquí es donde debe codificar según corresponda. Por lo general, se enviará a HTML, por lo que necesita codificación HTML ( & se convierte en &amp; como usted dice). Si está enviando a JSON o JavaScript (aunque no sea un campo minado), debe generar el texto con la codificación de entidad hexadecimal ( \x38 ).

    
respondido por el SilverlightFox 22.08.2015 - 09:23
fuente
0

Si va a persistir esos caracteres, asegúrese de utilizar variables de enlace (o declaraciones preparadas) para persistirlos.

También debe agregar la codificación HTML al mostrar la información en su interfaz de usuario.

    
respondido por el whoami 21.08.2015 - 13:19
fuente
0

Si puede evitar almacenar tales caracteres por las razones que mencionó (y otras), eso es lo mejor para usted. Sin embargo, si se ve obligado a considerar su modelo de negocio, aún tiene una opción: sea cual sea el lenguaje de programación que esté utilizando, siempre puede confiar en el concepto de consultas parametrizadas para cumplir ese objetivo. De esa forma, usted evita las inyecciones de SQL .

    
respondido por el user45139 21.08.2015 - 13:17
fuente

Lea otras preguntas en las etiquetas