Diseño de API PHP simple y seguro

6

Estoy tratando de diseñar un servicio web de API RESTful seguro con la menor cantidad posible de partes móviles. Tengo algunas preguntas y quiero asegurarme de que mi diseño sea seguro.

Para el nivel de seguridad de la transmisión de datos, usaré SSL / TLS para evitar la interceptación, MITM, ataques de reproducción, etc.

Lo que deja es el control de acceso.

No tengo ganas de luchar con OAuth. La razón es que no quiero confiar en un tercero, y configurar servidores locales como el "autenticador" (o como lo llame OAuth) no es factible.

Así que iba a confiar en un token aleatorio. Al usar una biblioteca CSPRNG (por ejemplo, $token = random_bytes(32) en PHP), planeo asignar a cada nombre de usuario / contraseña un $token , y almacenarlo en la base de datos usando una función de almacenamiento de contraseña (por ejemplo, PBKDF2 o bcrypt). El usuario también recuperará el token a través de SSL / TLS.

Luego, en cada solicitud, el usuario enviará el token junto con sus datos JSON. Si el token que pasan existe en la base de datos, se procesa la llamada a la API.

Esto me deja con algunas preguntas:

  • ¿El token puede ser coherente (sin revocación o actualización manual), o el token requiere ser "actualizado" con frecuencia? Si es así, ¿cuál es la forma viable de manejar eso? Forzar al usuario a iniciar sesión en una página web para obtener acceso al nuevo token parece anular el propósito de una API. Esto parece indicar que es lo mejor Un punto controvertido.
  • ¿Cuál es la ventaja de poner el token en un encabezado HTTP (por ejemplo, Authorization: Token SOMERANDOMVALUE ) en lugar de simplemente rellenarlo en el cuerpo de una solicitud JSON? De cualquier manera, no haré nada con la solicitud a menos que la autenticación sea exitosa. De todos modos, iba a ponerlo en el encabezado, pero tenía curiosidad.

Además, si alguien tiene fuentes confiables para aprender más sobre cómo crear API seguras, realmente me gustaría leerlas.

    
pregunta throwaway934 04.04.2016 - 22:22
fuente

1 respuesta

3
  

¿El token puede ser coherente (sin revocación o actualización manual), o el token debe ser "actualizado" con frecuencia? Si es así, ¿cuál es la forma viable de manejar eso?

Aunque no quiera implementar OAuth, recomiendo echar un vistazo a la forma en que se maneja el token hecho en OAuth (Párrafos 1.5 y 1.5) . Con los tokens de actualización, puede reducir la ventana de exposición si el token del portador se ve comprometido y evita pedir a los usuarios que proporcionen sus credenciales repetidamente.

  

¿Cuál es la ventaja de poner el token en un encabezado HTTP (por ejemplo, Autorización: token SOMERANDOMVALUE) en lugar de rellenarlo en el cuerpo de una solicitud JSON?

AFAIK se hace porque este campo de encabezado está destinado a este propósito. En la práctica depende mucho del caso de uso. Dado que existe el riesgo de que el encabezado Authorization sea enviado automáticamente por algunos navegadores, lo que podría generar una vulnerabilidad CSRF, es posible que no desee hacerlo de esta manera si no desea implementar un token CSRF. Así que agregar la información de autenticación al cuerpo o un campo de encabezado personalizado está totalmente bien.

Eche un vistazo a la REST Hoja de información de seguridad por OWASP para obtener más consejos sobre el diseño seguro de API. En realidad, todo el sitio es interesante: es un muy buen punto de partida para desarrollar una mejor comprensión de la seguridad de la información.

    
respondido por el Noir 05.04.2016 - 08:55
fuente

Lea otras preguntas en las etiquetas