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_dadesamb permisos deSELECTsobre 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
clientsbasant-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
transaccionsamb una columnadetallsque estigui xifrada. - Insereix una fila a la taula
transaccionsamb dades xifrades.
- Crea una taula
-
Auditoria i registre
- Activa l'auditoria per a les operacions
INSERTiUPDATEsobre 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
productesi 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
