2012-01-18 27 views
20

Sé que hay muchas preguntas similares publicadas, pero ninguna se refiere a una aplicación HTML/javascript donde el usuario puede acceder al código.Cómo proteger una API REST privada en una aplicación AJAX

Tengo una API REST privada escrita en nodejs. Es privado porque su único propósito es server mis aplicaciones de clientes HTML5 (aplicación Chrome y aplicación Adobe Air). Entonces, una clave API no es una buena solución ya que cualquier usuario puede ver el código javascript.

Quiero evitar que los bots creen cuentas en mi servidor y consuman mis recursos.

¿Hay alguna manera de lograr esto?

+2

No estoy seguro de si alguna de las respuestas satisfizo su pregunta. Comparta amablemente cómo se acercó al problema que describió. Estoy construyendo una aplicación web basada en REST + AJAX que puede usarse para usuarios no registrados. Al igual que usted, quiero proteger los recursos de los bots. –

+0

Lógicamente, no hay forma de que una API sea realmente privada si se la llama desde una página web donde cualquiera puede ver la fuente y/o controlar los datos que se envían al servidor. Para atrapar bots tienes los trucos habituales como Captcha, pero en última instancia necesitas soporte de back-end (WAF, escalado automático rápido, etc.) para lidiar con la posibilidad de ataques automatizados de tipo DDOS. Siempre que detecte los posibles ataques de DDOS lo antes posible (antes de hacer conexiones de DB, etc.), no es diferente al manejo de los bots que intentan descargar la página en primer lugar. –

Respuesta

15

Una clave API es una solución decente especialmente si requiere restricciones en el origen de la solicitud de la clave API; considere que solo debe aceptar una clave API si la solicitud web de origen proviene de una fuente autorizada, como su dominio privado. Si una solicitud web proviene de un dominio no autorizado, simplemente puede denegar el procesamiento de la solicitud.

Puede mejorar la seguridad de este mecanismo mediante la utilización de un esquema de codificación especializado, como un código de autenticación de mensajes basado en hash (HMAC). El siguiente recurso explica este mecanismo claramente:

http://cloud.dzone.com/news/using-api-keys-effectively

+2

También es importante observar que la solución de clave API funciona para docenas de otras API, como Google Maps, Flickr, Facebook, etc. El truco está en la implementación. –

+0

No puedo controlar de dónde vienen mis usuarios, es una aplicación pública. Google maps, Flickr, etc. usan claves API, pero no estoy seguro de si están preocupados acerca de quién usa las claves. Creo que puedo copiar y usar cualquier clave de Google Maps (no lo he probado). – aartiles

+0

No puede simplemente copiar una clave de API de Google Maps y usarla en otro dominio, porque la API de Google Maps vincula cada clave API generada a una clase de dominio específica (es decir, midominio.com), y cada solicitud que entra se compara con el URL de referencia y otra información codificada en la clave API. De nuevo, un mecanismo de codificación típico es HMAC. Las claves API serían inútiles de lo contrario. –

1

Lo que se quiere hacer es emplear SSL autenticado mutuamente, de manera que el servidor sólo aceptará conexiones entrantes de su aplicación y su aplicación sólo se comunicará con el servidor .

Aquí está el enfoque de alto nivel. Cree un certificado SSL de servidor autofirmado e impleméntelo en su servidor web. Si usa Android, puede usar la herramienta de claves incluida con el SDK de Android para este fin; si está utilizando otra plataforma de aplicaciones, también existen herramientas similares para ellos. Luego, cree un cliente autofirmado e impleméntelo dentro de su aplicación en un almacén de claves personalizado incluido en su aplicación como recurso (keytool también lo generará). Configure el servidor para que requiera autenticación SSL del lado del cliente y solo acepte el certificado del cliente que haya generado. Configure el cliente para que use ese certificado del lado del cliente para identificarse y solo acepte el certificado del lado del servidor que instaló en su servidor para esa parte del mismo.

Si alguien/algo además de su aplicación intenta conectarse a su servidor, la conexión SSL no se creará, ya que el servidor rechazará las conexiones SSL entrantes que no presenten el certificado del cliente que ha incluido en su aplicación.

Un paso a paso para esto es una respuesta mucho más larga de lo que está garantizado aquí. Sugeriría hacer esto en etapas, ya que hay recursos en la web sobre cómo lidiar con el certificado SSL autofirmado en Android (no estoy tan familiarizado con cómo hacerlo en otras plataformas móviles), tanto del lado del servidor como del lado del cliente. También hay un recorrido completo en mi libro, Application Security for the Android Platform, publicado por O'Reilly.

+0

Mi aplicación web es javascript puro y HTML, no android – aartiles

+0

Y este enfoque todavía funciona. Haga cumplir SSL de autenticación mutua entre el servidor web de su aplicación y los clientes con los que quiera comunicarse. – jeffsix

+0

¿Cómo puedo hacer eso para un navegador web estándar? Digamos Google Chrome. – aartiles

Cuestiones relacionadas