En NodeJS, ¿cuál es una buena manera de garantizar que los datos enviados por el usuario en formularios (entrada de texto) no sean maliciosos?

4

Además de escanear los archivos cargados por el usuario, también me gustaría asegurarme de que los formularios para perfiles de usuario, comentarios, etc. no puedan ser utilizados incorrectamente para enviar un script malicioso. ¿Cuáles son algunos buenos métodos conocidos para hacerlo? ¿Debería realizarse la comprobación de los ataques de inyección de scripts en el lado del cliente o del servidor?

FWIW, he comprobado algunos módulos relacionados con la seguridad en NPM, pero en general parecen estar relacionados con la seguridad de otros módulos, y es posible que haya perdido algo útil.

Una forma que conozco, es eliminar todas las etiquetas HTML, pero creo que es un poco complicado y probablemente no sea efectivo en todos los casos.

Actualización: tal como se planteó la pregunta, probablemente dio la impresión de estar cerca de xss, a pesar de la etiqueta de inyección. Así que esto es solo para aclarar que se trata tanto de xss como de inyección de SQL.

    
pregunta Yogesch 17.08.2015 - 12:21
fuente

4 respuestas

1

SQL

La protección contra las inyecciones de SQL se realiza mediante declaraciones preparadas. En términos generales, es una práctica recomendada evitar la concatenación manual de cadenas generadas por el usuario en sentencias de SQL.

En su lugar, use la anotación ? y proporcione la cadena de entrada como parámetro. El controlador se asegura de bloquear cualquier intento de inyección de SQL, así como la entrada inesperada del usuario.

Ejemplo de MySQL -

PreparedStatement ps = connection.prepareStatement("INSERT INTO tbl VALUES (?)");
ps.setString(1, "'abc'); TRAUNCATE TABLE users; SELECT (1");
ps.executeUpdate();

El intento de inyección fallará.

XSS

Puede HTML escapar las cadenas generadas por el usuario o simplemente reemplazar < con &gt; y > con &lt; , antes de enviarlo al cliente o al escribirlo en la base de datos.

También, echa un vistazo a la falsificación de solicitud entre sitios (CSRF) Prevención Cheat Sheet guía.

    
respondido por el Kof 07.09.2015 - 22:59
fuente
6

Eliminar las etiquetas HTML no es un enfoque suficiente para protegerse de XSS. Considere la siguiente entrada:

<scri<script>pt>

Si elimina la etiqueta <script> , se creará otra etiqueta de secuencia de comandos. Este es solo un ejemplo: hay muchos otros ataques que podrían usarse.

Debería protegerse de XSS en el lado del servidor, de esta manera los usuarios no tienen la capacidad de modificar / omitir el código del lado del cliente.

Protegerse contra XSS es totalmente factible, pero debe asegurarse de estar usando el enfoque correcto. Como de costumbre, Las instrucciones de OWASP sobre cómo protegerse es probablemente la mejor manera de hacerlo.

    
respondido por el Abe Miessler 17.08.2015 - 18:15
fuente
1

Hay dos métodos principales que se discuten comúnmente cuando se trata de la entrada del usuario. Estos dos métodos son validación y desinfección .

Ambos deberían hacerse definitivamente en el lado del servidor. Las protecciones del lado del cliente no prevendrán ataques como las secuencias de comandos entre sitios o la inyección de SQL.

En particular, creo que estás hablando de ataques de scripts entre sitios. Parece que este módulo de nodo ( enlace ) puede ser adecuado para lo que estás tratando de lograr.

Eliminar todas las etiquetas HTML no es necesariamente una gran idea. Esto se debe a que los scripts entre sitios basados en eventos aún pueden ser posibles. Por ejemplo:

<a href="/yourprofilename">yourprofilename</a>

Si el usuario tiene la capacidad de cambiar la sección su nombre de archivo , considere la siguiente entrada:

" onfocus="prompt(document.location); autofocus"

Esto convertiría el enlace en esto:

<a href="/" onfocus="prompt(document.location);" autofocus">yourprofilename</a>

Esto provocaría secuencias de comandos entre sitios sin el uso de etiquetas HTML.

    
respondido por el infosec 17.08.2015 - 16:08
fuente
-1

Prueba el módulo npm strip-js . Elimina todo el código JavaScript de algún texto HTML haciendo lo siguiente:

  • Sanitizing HTML
  • Eliminando etiquetas de script
  • Eliminando atributos como "onclick", "onerror", etc. que contienen código JavaScript
  • Eliminando los atributos "href" que contienen código JavaScript

enlace

    
respondido por el Shivanshu Goyal 12.10.2016 - 17:34
fuente

Lea otras preguntas en las etiquetas