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

  1. 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.
  2. Protecció contra injeccions SQL

    • Utilitza variables vinculades i procediments emmagatzemats per evitar injeccions SQL.
    • Valida i neteja totes les entrades de l'usuari.
  3. 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.
  4. Auditoria i registre

    • Implementa mecanismes d'auditoria per registrar les operacions crítiques.
    • Analitza els registres periòdicament per detectar activitats sospitoses.
  5. 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

  1. Control d'accés i permisos

    • Crea un rol anomenat analista_dades amb permisos de SELECT sobre la taula vendes.
    • Assigna aquest rol a un usuari anomenat usuari_analista.
  2. 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.
  3. Xifrat de dades

    • Crea una taula transaccions amb una columna detalls que estigui xifrada.
    • Insereix una fila a la taula transaccions amb dades xifrades.
  4. Auditoria i registre

    • Activa l'auditoria per a les operacions INSERT i UPDATE sobre la taula clients.
    • Consulta els registres d'auditoria per veure les operacions realitzades.
  5. 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.

Solucions als exercicis

  1. Control d'accés i permisos
CREATE ROLE analista_dades;
GRANT SELECT ON vendes TO analista_dades;
GRANT analista_dades TO usuari_analista;
  1. 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;
  1. 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ó');
  1. Auditoria i registre
AUDIT INSERT, UPDATE ON clients;

SELECT * FROM dba_audit_trail WHERE obj_name = 'CLIENTS';
  1. 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.

© Copyright 2024. Tots els drets reservats