2010-08-09 13 views
5

cuando uso recv desde windows sockets ¿usar el recv puede provocar un ataque de denegación de servicio? ¿Si espera datos para siempre? Entonces, ¿cuál es la mejor manera de resolver esto (alarmas?)Evitar el ataque de denegación de servicio

Gracias & Regards,

Mousey.

Respuesta

3

Parece que no entiende lo que significa la denegación de servicio. Un ejemplo sería una gran cantidad de solicitudes HTTP a un solo servidor web que lleguen a una velocidad tal que el software del servidor web esté tan ocupado que no pueda aceptar nuevas conexiones TCP. Wikipedia tiene un artículo decente en DoS, léelo.

recv(2) es solo una API. El uso incorrecto de este, como cualquier otro error, puede provocar problemas, incluido el DoS. Pero eso no significa que debas evitarlo. Si su problema está bloqueando otras tomas mientras espera una lectura, busque en tomas sin bloqueo y multiplexión de E/S como en select(2), poll(2) y epoll(4).

+1

sí Quiero saber si uso recv() ¿puede conducir a DoS? Dado que el servidor puede esperar mucho tiempo. Por ejemplo, si el tamaño de mi mensaje es muy grande. – mousey

+0

Tenga en cuenta que puede establecer un tiempo de espera en el socket y un tamaño de búfer máximo en recv, por lo que las oportunidades de abuso pueden verse limitadas. Supongo que si tienes un solo proceso, un par no deseado podría enviarte muchos bytes lentamente como un ataque de denegación de servicio ... – MZB

1

Sí, recv() puede bloquear indefinidamente. Necesitas implementar algún tipo de tiempo de espera.

Yo recomendaría usar el boost asio library. Incluye cosas como temporizadores que funcionan a la perfección con conexiones de socket y eventos de recepción. Simplemente configure un socket asíncrono, agregue un temporizador y rompa si se acaba el tiempo.

Esto todavía no lo hace inmune a los ataques de DoS, ya que una gran cantidad de solicitudes aún podrían entrar durante la ventana de tiempo de espera. Pero podría ser útil si establece el tiempo de espera bastante bajo.

1

Si está utilizando sockets de bloqueo, busque ajustar los tiempos de espera de envío() y recv() con las opciones SO_SNDTIMEO y SO_RCVTIMEO setsockopt().

Existen muchas pequeñas complejidades en la creación de un servidor adecuado, buscaría adquirir rogando, pidiendo prestado o robando este. Aquí hay un sample multithreaded socket server.

Además, si tiene control sobre ambos lados (el cliente y el software de socket del servidor) crearía un protocolo que tiene la longitud del mensaje que se pasará como los primeros 2 o 4 bytes del mensaje, de esa manera solo tiene que bloquear para que decodifique el número y siga leyendo hasta que haya transcurrido el número de bytes. Haga eso tanto para el cliente como para el servidor y hará que su código sea mucho más simple.

Cuestiones relacionadas