En aquest tema, explorarem les consideracions de seguretat que cal tenir en compte quan es treballa amb PL/SQL. La seguretat és un aspecte crític en el desenvolupament de programari, especialment quan es tracta de bases de dades que poden contenir informació sensible. A continuació, desglossarem els conceptes clau, proporcionarem exemples pràctics i oferirem exercicis per reforçar els coneixements adquirits.
Conceptes clau
-
Control d'accés i permisos
- Assegura't que només els usuaris autoritzats tinguin accés a les dades i funcionalitats.
- Utilitza rols i privilegis per gestionar l'accés.
-
Protecció contra injeccions SQL
- Utilitza variables vinculades i procediments emmagatzemats per evitar injeccions SQL.
- Valida i neteja totes les entrades de l'usuari.
-
Xifrat de dades
- Xifra les dades sensibles tant en repòs com en trànsit.
- Utilitza funcions de xifratge proporcionades per la base de dades.
-
Auditoria i registre
- Implementa mecanismes d'auditoria per registrar les operacions crítiques.
- Analitza els registres periòdicament per detectar activitats sospitoses.
-
Gestió d'excepcions segura
- Gestiona les excepcions de manera que no es reveli informació sensible.
- Proporciona missatges d'error genèrics per a l'usuari final.
Exemples pràctics
Control d'accés i permisos
-- Creació d'un rol amb permisos específics CREATE ROLE gestor_vendes; -- Assignació de permisos al rol GRANT SELECT, INSERT, UPDATE ON vendes TO gestor_vendes; -- Assignació del rol a un usuari GRANT gestor_vendes TO usuari_vendes;
Protecció contra injeccions SQL
-- Exemple d'ús de variables vinculades per evitar injeccions SQL DECLARE v_username VARCHAR2(50); v_password VARCHAR2(50); BEGIN v_username := :input_username; v_password := :input_password; EXECUTE IMMEDIATE 'SELECT * FROM usuaris WHERE username = :1 AND password = :2' USING v_username, v_password; END;
Xifrat de dades
-- Exemple de xifrat de dades en repòs CREATE TABLE usuaris ( id NUMBER PRIMARY KEY, username VARCHAR2(50), password VARCHAR2(50) ENCRYPT ); -- Inserció de dades xifrades INSERT INTO usuaris (id, username, password) VALUES (1, 'usuari1', 'contrasenya1');
Auditoria i registre
-- Activació de l'auditoria per a una taula específica AUDIT SELECT, INSERT, UPDATE ON usuaris; -- Consulta dels registres d'auditoria SELECT * FROM dba_audit_trail WHERE obj_name = 'USUARIS';
Gestió d'excepcions segura
BEGIN -- Codi que pot generar una excepció EXECUTE IMMEDIATE 'DELETE FROM usuaris WHERE id = 1'; EXCEPTION WHEN OTHERS THEN -- Gestió segura de l'excepció DBMS_OUTPUT.PUT_LINE('S'ha produït un error. Contacta amb l'administrador.'); END;
Exercicis pràctics
-
Control d'accés i permisos
- Crea un rol anomenat
analista_dades
amb permisos deSELECT
sobre la taulavendes
. - Assigna aquest rol a un usuari anomenat
usuari_analista
.
- Crea un rol anomenat
-
Protecció contra injeccions SQL
- Escriu un bloc PL/SQL que utilitzi variables vinculades per seleccionar dades de la taula
clients
basant-se en l'entrada de l'usuari.
- Escriu un bloc PL/SQL que utilitzi variables vinculades per seleccionar dades de la taula
-
Xifrat de dades
- Crea una taula
transaccions
amb una columnadetalls
que estigui xifrada. - Insereix una fila a la taula
transaccions
amb dades xifrades.
- Crea una taula
-
Auditoria i registre
- Activa l'auditoria per a les operacions
INSERT
iUPDATE
sobre la taulaclients
. - Consulta els registres d'auditoria per veure les operacions realitzades.
- Activa l'auditoria per a les operacions
-
Gestió d'excepcions segura
- Escriu un bloc PL/SQL que intenti actualitzar una fila inexistent a la taula
productes
i gestioni l'excepció de manera segura.
- Escriu un bloc PL/SQL que intenti actualitzar una fila inexistent a la taula
Solucions als exercicis
- Control d'accés i permisos
CREATE ROLE analista_dades; GRANT SELECT ON vendes TO analista_dades; GRANT analista_dades TO usuari_analista;
- Protecció contra injeccions SQL
DECLARE v_client_id NUMBER; BEGIN v_client_id := :input_client_id; EXECUTE IMMEDIATE 'SELECT * FROM clients WHERE client_id = :1' USING v_client_id; END;
- Xifrat de dades
CREATE TABLE transaccions ( id NUMBER PRIMARY KEY, detalls VARCHAR2(255) ENCRYPT ); INSERT INTO transaccions (id, detalls) VALUES (1, 'Detalls de la transacció');
- Auditoria i registre
- Gestió d'excepcions segura
BEGIN -- Intent d'actualitzar una fila inexistent EXECUTE IMMEDIATE 'UPDATE productes SET preu = 100 WHERE id = 9999'; EXCEPTION WHEN OTHERS THEN -- Gestió segura de l'excepció DBMS_OUTPUT.PUT_LINE('S'ha produït un error. Contacta amb l'administrador.'); END;
Conclusió
En aquesta secció, hem explorat diverses consideracions de seguretat en PL/SQL, incloent el control d'accés, la protecció contra injeccions SQL, el xifrat de dades, l'auditoria i la gestió d'excepcions segura. Aquests conceptes són fonamentals per assegurar que les aplicacions PL/SQL siguin segures i resistents a atacs. Practicar aquests principis ajudarà a desenvolupar aplicacions més robustes i segures.
Curs de PL/SQL
Mòdul 1: Introducció a PL/SQL
Mòdul 2: Fonaments de PL/SQL
- Estructura del bloc PL/SQL
- Variables i tipus de dades
- Estructures de control
- Cursors
- Gestió d'excepcions