2011-07-18 15 views
17

Si uso el módulo http de nodejs para hacer un servidor http simple, ¿cuánto de validación/verificación debo hacer?¿Cuán robusto es nodejs como servidor http?

¿El módulo se ocupa de problemas de seguridad, como solicitudes mal formadas y solicitudes con valores de encabezado maliciosos? ¿El módulo se asegura de que todo siga las especificaciones http, o tengo que hacer muchas comprobaciones para asegurarme de que mi servidor no se cuelgue fácilmente?

Editar: Digamos que nodejs no hace ninguna validación real, que estoy bastante seguro de que es el caso. ¿Qué debo hacer para asegurarme de que mi servidor no se pueda bloquear fácilmente?

+0

[fuente del módulo http] (https://github.com/joyent/node/blob/master/lib/http.js) – Raynos

+1

@Raynos: parece que prácticamente no contiene ninguna validación, solo analiza la solicitud en el encabezados y cuerpo ¿Estás de acuerdo? – shelman

+0

No sé nada sobre la seguridad/lagunas del servidor HTTP o la piratería. Así que no puedo comentar sobre qué debería validar. – Raynos

Respuesta

1

¿Qué es un valor de encabezado malicioso? El nodo es de bajo nivel, por lo que muchas cosas no se verifican. Pero tienes que mirar esas cosas. Pero no es como si alguien pudiera enviar "execute 0xFA894224" o algo así. Los únicos agujeros que es probable que tenga son cosas como permitir una solicitud malformada (por ejemplo, tal vez podría obtener request.location: "\*\*\* CHINAAA \*\*\*", olvidarse de lanzar un evento de cierre de socket, o lanzar un error de JavaScript y terminar graciosamente.

Siempre puede verificar esto cosas, o use un bloque try catch, process.on, etc. Por supuesto, no es para decir que no puede haber un desbordamiento de búfer o algo por el estilo, pero es poco probable considerando que el nodo está construido sobre el v8, y muchos de los Las bibliotecas son puros JavaScript

Editar: cómo dejar de bloqueos aleatorios:

process.on('uncaughtException',function() { 
/* ignore error */ 
}); 
+3

Además, aunque esto detendrá el 99% de los bloqueos aleatorios, el 99% de los bloqueos aleatorios son causados ​​por JavaScript, no por el nodo. Por ejemplo, podría hacer obj [request.location] = request.headers, que podría bloquearse si alguien lograra deslizar '\ _ \ _ proto \ _ \ _' allí de alguna manera. Sin embargo, esto es solo consideraciones generales de JavaScript. –

+5

Para el registro '/ * ignorar error * /' es una idea muy estúpida. Si lo implementa, reemplácelo por un manejo de errores razonable. – Raynos

-1

NodeJS no fue hecho para ser utilizado como un servidor HTTP de cara al mundo. Sin embargo, sus capacidades HTTP pueden usarse para enviar solicitudes de proxy a un servidor web adecuado.

Fuera de tema, pero Nginx es realmente bueno haciendo esto, ya que tiene una cantidad constante de subprocesos.

+0

¿Por lo tanto, es una mala idea en general atender las solicitudes POST y GET directamente utilizando un servidor nodejs? – shelman

+2

La configuración más común que he escuchado es utilizar Nginx como una puerta de enlace a una o más instancias de node.js. No creo que sea correcto decir que "no fue hecho para ser ..." cuando no está hecho. Los desarrolladores del proyecto parecen apuntar a un servidor de aplicaciones orientado a la web, para mí. –

+1

Nodo puede iniciar más procesos de nodo, imho, usar nginx no es útil. –