2009-09-10 7 views
12

Hola a todos, tengo un sitio web de alojamiento de imágenes y estoy diseñando una API para ello. Mi preocupación es que no quiero que nadie sea capaz de hacer algo como:¿Cómo protegería una API del abuso?

while(true) { 
    Upload(); 
} 

y spam/DoS al sitio.

Mi solución actual es limitar todas las direcciones IP a una cierta cantidad de cargas por día/hora. Creo que esto funcionará bien para las aplicaciones de escritorio que usarán la API, pero para los sitios web que deseen usarla, todos los usuarios tendrán la misma IP (del servidor).

Supongo que la mejor solución sería tener cuentas de usuario que se autentiquen con la API, y luego prohibir cada cuenta si abusan de ella. El problema con esto es que mi sitio no tiene ninguna cuenta de usuario, es completamente anónimo.

¿Qué más se puede hacer? Me gustaría mantener las cosas lo más abiertas posible, y al mismo tiempo tener la capacidad de prohibir usuarios/IP que obviamente están abusando del servicio.

+0

¿Quizás sus sitios colaboradores de terceros puedan decorar la solicitud con IP original, como X_FORWARDED_FOR encabezado HTTP? –

+0

¿Quizás las características anti-DoS están incorporadas en (el servidor web) (configurable) y, por lo tanto, no es necesario que estén en la aplicación web? – ChrisW

+0

ChrisW: No, DoS puede ocurrir en múltiples niveles de una aplicación; por ejemplo, bloquear todas las cuentas de usuario, etc. Necesita ser atendida en este nivel. –

Respuesta

9

Si no desea implementar cuentas de usuario, ¿qué hay de tener aquellos que desean utilizar la API para suscribirse a una clave/secreto api, que puede usar para calificar el límite con.

+1

+1 para claves de API. – LiraNuna

+0

LiraNuna: sugiero que también mires a OAuth. Es una especificación para tratar todo esto (claves de API, etc.) correctamente. –

+0

OAuth es una forma de implementar claves API. Como el OP no solicitó un servicio que lo hiciera por él, sino una idea de cómo administrarlo, creo que esta es una mejor respuesta. – LiraNuna

2

En una compañía para la que trabajé, implementamos la aceleración para todos los clientes que no pagaban, con un límite de un cierto número de solicitudes por día, teóricamente configurables por punto final API. Si tenía que proporcionar un ID único como clave de su aplicación en cada solicitud, en QueryString para API livianas o en el XML de solicitud POST para API más complejas. Para los usuarios finales que no usan una API pública, puedes pasar un token de autenticación en su lugar.

Si proporciona una API pública sin requerir algún tipo de autenticación o autorización, deberá recurrir a la regulación basada en la dirección IP. Pero no es difícil crear una página web de aprovisionamiento liviana que permita a las personas registrarse para acceder a la API.

La lógica de su aplicación puede acelerarse según el número de solicitudes, como hicimos nosotros, o el ancho de banda diario, como lo hace Flickr.

0

Requerir un token para cargar y restringir el token con un CAPTCHA. El código de consumo sería algo así como:

// 1st request 
var uploadToken = api.RequestToken(sessionIdFromUser); 
if (uploadToken.RequireChallenge) { 
    // requires challenge due to per IP limiting 
    // uploadToken.Captcha could be a URL 
    DisplayView(uploadToken.Captcha, uploadToken.SessionId); 
    return; 
} 
api.Upload(uploadToken, captchaFromUser, byte[]); 
1

Como han mencionado otros en este hilo, las claves de API suelen ser el camino a seguir en tales situaciones. El hecho de que su sitio no tenga cuentas de usuario no importa: una clave API identifica una aplicación , y no un usuario . (De hecho, si tu sitio tuviera usuarios, necesitarías mecanismos separados para identificar la aplicación y el usuario en una llamada API, aquí es donde OAuth es muy útil).

Si no desea crear su propio proceso de registro de desarrollador, proceso de emisión de clave API, código de aceleración, etc., le animo a que consulte mi empresa, WebServius (www.webservius.com), que proporciona una capa de administración de API alojada encima de una API que usted proporciona.

3

Echa un vistazo a una herramienta de administración de API de código abierto como apiGrove; apiGrove.net o en GitHub al apigrove.github.com/apigrove. apiGrove admite una variedad de enfoques para la protección API, incluida la lista blanca de IP y la autorización por clave.

Cuestiones relacionadas