Hola, tengo una duda, estoy pensando en realizar una aplicación, y desde que estoy en las prácticas de una empresa de Almería he visto algunas cosillas interesantes que me gustaría llevar a la práctica, pero claro, soy novato y me gustaría saber como de segura sería la siguiente implementación.
Os pongo en situación:
Hace unos meses estuve pensando en una aplicación, la cual ofrecía un panel con diversas funcionalidades (frontend) para los clientes/usuarios de dicha aplicación. Y esta a su vez, tenía que comunicarse con una base de datos. Así que, por temas de seguridad, lo que acabe haciendo, fue una aplicación en C# (backend) que se comunicaba con la base de datos lanzando sentencias SQL contra ella, una API vaya.
Entonces, claro, mi duda está en que si podría saltarme este paso intermedio, y obviar la aplicación backend, ya que es un rollo implementarla.
Lo que se me ha ocurrido, desde que estoy en esta empresa, es que lo más común es usar procedimientos almacenados (Stored Procedures) que están en SQL Server, en Oracle y en MySQL (no es algo especifico de unos cuantos softwares propietarios).
Y he visto, que todas las aplicaciones, llaman a sus procedimientos almacenados desde una API integrada en el mismo frontend. Y sí lo hacen así supongo que será porque es seguro.
Y tiene lógica, ya que realmente tu no estás viendo la sentencia SQL que se está ejecutando, simplemente, el procedimiento almacenado te trae datos, o los inserta, pero de forma controlada.
Es decir, que un hacker, no podría borrar o alterar la base de datos a sus anchas, si no conociese los procedimientos almacenados. Y no tuviese los permisos correspondientes para cada ejecucción.
Con permisos me refiero a que si, el usuario el cual realiza la petición no tiene dentro de una tabla X (donde hay una columna que especifica su rango de permisos) la cual no tiene permisos, este no podría hacer nada.
La idea está en que dentro del mismo procedimiento almacenado, se llame a otro procedimiento almacenado, el cual haga comprobación de credenciales, de rango, etc etc (para el caso de lectura de datos sensibles, insertar, modificar, borrar o alterar la estrctura de tablas (esto último debería de hacerse desde la propia base de datos)).
Ahora, lo que me sigue fallando es el tema del login.
Lo que se me había ocurrido, es lo siguiente, hacer 3 usuarios de SQL:
- Invitado: Este solo tendria acceso a comprobar los credenciales en la tabla correspondiente. Una vez realizada la conexión se le devolveria una string de conexión como usuario. Y se le crearía una string de conexion en otra tabla la cual no tendria acceso.
- Usuario: Este tendria los permisos estandar de un usuario.
- Administrador: Si se requiriese que la propia aplicación tuviese un panel de administración, pues este seria el usuario de conexion a la base de datos.
No me mola el hecho de devolver strings de conexión. Lo que me gustaría sería, que al conectarse el usuario, se le devolviese un objeto con la conexión la cual solo podria usar desde esa propia sesión.
Y lo mejor de todo, es que me gustaría implementar todo esto que digo de forma que un usuario cualquiera solo pudiese acceder a la cuenta de otro usuario si conociese sus credenciales. Por que sería muy sencillo pasarle en vez de una ID de usuario otra ID de usuario y santas pascuas, por ello lo de la string de conexión.
Pero son conceptos que están muy en el aire y no se muy bien como aplicarlos.
Asi que cualquier guía ayuda no estaría de más.
Un saludo y gracias.