¿No es posible proteger esta API?

  • Autor Autor uncoderbyte
  • Fecha de inicio Fecha de inicio
U

uncoderbyte

Gamma
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Hola!, tengo una API sencilla que utilizo desde un sistema para obtener determinados registros, funciona correctamente, pero me gustaría que al utilizarla sea mediante un token. Se que Laravel tiene Sanctum, entre otros paquetes, pero noté que estos token podrían ser generados por cualquier usuario mediante POST. Entonces no entiendo cual sería la protección si cada usuario puede crear su propio token.

¿Alguien podría guiarme acerca de que sería mas recomendable utilizar?.
 
Lo importante con los tokens es que un atacante no los pueda reutilizar o generar.

Lo primero lo solucionas haciendo uso de tokens que expiran pasado un determinado número de horas o días. Lo segundo añadiendo en los tokens una firma cifrada que solo tú sepas como generarla.

Por suerte existen los JWT (https://jwt.io) como bien dice Hadrien Rivere y que sirven para generar este tipo de tokens. Existen librerías para utilizar JWT en prácticamente cualquier lenguaje de programación que necesites.
 
Lo importante con los tokens es que un atacante no los pueda reutilizar o generar.

Lo primero lo solucionas haciendo uso de tokens que expiran pasado un determinado número de horas o días. Lo segundo añadiendo en los tokens una firma cifrada que solo tú sepas como generarla.

Por suerte existen los JWT (https://jwt.io) como bien dice Hadrien Rivere y que sirven para generar este tipo de tokens. Existen librerías para utilizar JWT en prácticamente cualquier lenguaje de programación que necesites.
Gracias por su respuesta. De todas maneras no se si sería esto lo que necesito.
Pongo mas en contexto:
Tengo un panel de adminitracion el cual se conectamente con una web que obtiene y envía información desde y hasta el panel. Lo que necesito es que únicamente se puedan comunicar entre si.
 
Lo principal es que debes colocarle permisos o roles a esos usuarios, cosa que cualquiera que sea usuario pueda generar un token pero verificar si puede o no tener permisos para ejecutar alguna acción.

Lee un poco sobre Gates y Policies: https://laravel.com/docs/8.x/authorization También puedes usar una librería buenisima de spatie.
 
Lo principal es que debes colocarle permisos o roles a esos usuarios, cosa que cualquiera que sea usuario pueda generar un token pero verificar si puede o no tener permisos para ejecutar alguna acción.

Lee un poco sobre Gates y Policies: https://laravel.com/docs/8.x/authorization También puedes usar una librería buenisima de spatie.
Lo leeré 😎

supongamos que actualmente tienes:
que devuelve un json

tanto en el server como en el cliente
tu creas luna llave con md5("algoquetusolosabes".parametros_y_valores_uno_tras_otro);

entonces nueva llamada es:
si la llave calza... respondes con la data, en caso contrario no
Es decir, ¿se comprueba que el token que tiene el cliente sea el mismo que generé desde el lado del servidor?
 
supongamos que actualmente tienes:
que devuelve un json

tanto en el server como en el cliente
tu creas luna llave con md5("algoquetusolosabes".parametros_y_valores_uno_tras_otro);

entonces nueva llamada es:
si la llave calza... respondes con la data, en caso contrario no
siempre he tenido la duda de esto de la seguridad de las api's.

https://algo.com/algo/get_data.php?parametros=valores&llave=jdeiwhfufh348h293dh92

pero suponiendo que consigues el valor de LLAVE de "alguna manera", o de manera tan simple como revisar la consola de desarrollador.
Ya tienes ese token del usuario y puedes hacer todas las request's que quieras con su nombre hasta que el token expire.

Asi que no me convence ese tipo de seguridad.
 
Lo leeré 😎


Es decir, ¿se comprueba que el token que tiene el cliente sea el mismo que generé desde el lado del servidor?
eso es lo que hace JWT y si esta por expirar la vide util del token lo regenerara.

Busca info de JWT o tambien revisa documentación de OAUTH 2, hay varios paquetes en laravel que hacen eso pero es importante saber como funcionan ya que seguro alguna día tocaras python, js u otro lenguaje y siempre funciona igual.
 
eso es lo que hace JWT y si esta por expirar la vide util del token lo regenerara.

Busca info de JWT o tambien revisa documentación de OAUTH 2, hay varios paquetes en laravel que hacen eso pero es importante saber como funcionan ya que seguro alguna día tocaras python, js u otro lenguaje y siempre funciona igual.
Gracias por responder.
Finalmente decidí realizar una configuración en CORS de Laravel, permitiendo que solo autorize al dominio del cual necesito realizar los recursos.
 
Es decir, ¿se comprueba que el token que tiene el cliente sea el mismo que generé desde el lado del servidor?
ambos generan el token onfly, y se comprueba que sean iguales
 
ambos generan el token onfly, y se comprueba que sean iguales
Los CORS no me funcionaron, y los tokens no me sirven porque veo que el usuario puede solicitarlos mediante POST, por lot anto sigo sin poder resolver mi problema. 🙁
 
Los CORS no me funcionaron, y los tokens no me sirven porque veo que el usuario puede solicitarlos mediante POST, por lot anto sigo sin poder resolver mi problema. 🙁
por que no funciono CORS?
 
por que no funciono CORS?
por que depende del navegador cumplirlo y en caso de chrome creo que abriéndolo con unos argumentos se pueden desactivar xd

En crunchy, si o si requieres de un navegador para entrar a la pagina. en caso de que no sea un browser, te salta la pagina de cloudfare y requieres de javascript para hacer el captcha. (alguien que sabe podría guardarlo y abrir en un browser ligero para hacer el captcha y obtener la pagina al final, pero seria algo complicado xd)

si se pone eso quitarías los noobs, pero los que usan browser automatizados+ argumentos de desactivar cors igualmente podrían entrar al link que te da el token xd



edit: en realidad no requieres un navegador, pero mejor no decir como públicamente jeje xd
 
Última edición:
por que no funciono CORS?
Realmente no se, estuve 1 día entero intentando que funcione y siempre me deja hacer la petición desde mi navegador, aunque puse para únicamente se realiza si proviene desde un dominio determinado.
Incluso me fijo en los headers y puedo visualizar el dominio indicado.

por que depende del navegador cumplirlo y en caso de chrome creo que abriéndolo con unos argumentos se pueden desactivar xd

En crunchy, si o si requieres de un navegador para entrar a la pagina. en caso de que no sea un browser, te salta la pagina de cloudfare y requieres de javascript para hacer el captcha. (alguien que sabe podría guardarlo y abrir en un browser ligero para hacer el captcha y obtener la pagina al final, pero seria algo complicado xd)

si se pone eso quitarías los noobs, pero los que usan browser automatizados+ argumentos de desactivar cors igualmente podrían entrar al link que te da el token xd
De todas maneras tengo en claro que la seguridad en un 100% es CASI imposible lograrlo, por eso no me preocupo tanto. Mas que nada lo estoy haciendo para adquirir conceptos.

Lo que estoy intentando hacer es que desde una APP web 2 se conecte a una APP web 1 y botenga determinados registros de la BD.
Lo estoy haciendo mediante una API rest.
No entiendo como peude ser tan dificil proteger las rutas jajajaja
 
Lo que estoy intentando hacer es que desde una APP web 2 se conecte a una APP web 1 y botenga determinados registros de la BD.
Lo estoy haciendo mediante una API rest.
No entiendo como peude ser tan dificil proteger las rutas jajajaja
Tal vez haciendo que para cuando al entrar a ese link y te devuelva el token/algo, requieras las cookies/sesion de un usuario logeado en tu pagina.
Eso haría que en el backend del auth token puedas contar cuantas veces esta creando el token/algo un usuario, y ahí ya podrías poner lógica de limitar, no?
 
No es tan complicado:

asi haces la petición:
<?php $algo_que_solo_tu_conoces = "123"; $ahora = date("YmdH"); $parametro = // algo que viene de alguna parte que sirve para consultar a la base de datos; $key_correcto = md5($algo_que_solo_tu_conoces.$parametro.$ahora); $json_recibido = file_get_contents('https://tuaplicacion.com/get_datos?parametro=$parametro&key=$key_correcto'); // el resto de tu codigo

así la contestas:
<?php $algo_que_solo_tu_conoces = "123"; $ahora = date("YmdH"); $parametro = $_GET['parametro']; $key = $_GET['key']; $key_correcto = md5($algo_que_solo_tu_conoces.$parametro.$ahora); if ($key_correcto!=key) { echo "error"; exit; } $sql = "SELECT * FROM xxx WHERE parametro=$parametro"; $datos = mysql->sql($sql); return json_encode($datos);
 
Tal vez haciendo que para cuando al entrar a ese link y te devuelva el token/algo, requieras las cookies/sesion de un usuario logeado en tu pagina.
Eso haría que en el backend del auth token puedas contar cuantas veces esta creando el token/algo un usuario, y ahí ya podrías poner lógica de limitar, no?
No es tan complicado:

asi haces la petición:
<?php $algo_que_solo_tu_conoces = "123"; $ahora = date("YmdH"); $parametro = // algo que viene de alguna parte que sirve para consultar a la base de datos; $key_correcto = md5($algo_que_solo_tu_conoces.$parametro.$ahora); $json_recibido = file_get_contents('https://tuaplicacion.com/get_datos?parametro=$parametro&key=$key_correcto'); // el resto de tu codigo

así la contestas:
<?php $algo_que_solo_tu_conoces = "123"; $ahora = date("YmdH"); $parametro = $_GET['parametro']; $key = $_GET['key']; $key_correcto = md5($algo_que_solo_tu_conoces.$parametro.$ahora); if ($key_correcto!=key) { echo "error"; exit; } $sql = "SELECT * FROM xxx WHERE parametro=$parametro"; $datos = mysql->sql($sql); return json_encode($datos);
¡Muchas gracias por sus explicaciones! 😎
 
Con el middleware de auth ya te aseguras de que el usuario deba estar autenticado. Si además se gestionan tokens con Passport se pueden tener tokens para cada usuario. Por otra parte se puede usar el plugin de Spatie/laravel-permission para poder asignar permisos y roles a distintos usuarios con el que añadir más protecciones.
 
Atrás
Arriba