Come proteggere la tabella dei dati della sessione Web basata su MySQL?

3

Ho il seguente schema di sessione MySQL:

CREATE TABLE 'SessionData' (
  'id' varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  'data' text COLLATE utf8_unicode_ci,
  'date' datetime DEFAULT NULL,
  PRIMARY KEY ('id'),
  KEY 'date' ('date')
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

Quindi voglio impedire agli utenti di leggere i reciproci dati di sessione tramite ad es. SQL Injection. Voglio proteggerlo usando la vista MySQL, la procedura o qualcosa del genere. C'è un modo comune e sicuro per farlo? Penso che sia una cosa comune da fare, poiché con questa shell remota è difficile sovrascrivere qualsiasi cosa sul server, tranne che per i propri dati di sessione, ma non per i file e per la sessione SQL e SQL, quindi è come sola lettura, ma con scrittura solo per la propria riga.

Creo una singola colonna, serie di dati a riga singola:

CREATE TABLE 'SessionId' (
  'id' varchar(50) COLLATE utf8_unicode_ci DEFAULT '',
  UNIQUE KEY 'id' ('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Inserisco una stringa vuota in esso:

INSERT INTO SessionId (id) VALUES ('');

Quindi posso creare una vista. In questo caso sta usando "frontuser", come utente MySQL.

DELIMITER $$
DROP VIEW IF EXISTS 'SessionView'$$

CREATE ALGORITHM=UNDEFINED DEFINER='root'@'%' SQL SECURITY DEFINER VIEW 'SessionView' AS (
SELECT
  'SessionData'.'id'   AS 'id',
  'SessionData'.'data' AS 'data',
  'SessionData'.'date' AS 'date'
FROM ('SessionId'
   JOIN 'SessionData'
     ON (('SessionId'.'id' = 'SessionData'.'id'))))$$

DELIMITER ;

Come INSERIRE la sessione:

INSERT INTO SessionView (id, 'data', 'date')
VALUES (
    HEX(AES_ENCRYPT("Cookie Value", "Random Key from Config")),
    HEX(AES_ENCRYPT("128bit random block + Session Data", "Random Key from Config")),
    NOW());

Come controllare la sessione

BEGIN;
UPDATE SessionId SET id = HEX(AES_ENCRYPT("Cookie Value", "Random Key from Config"));
SELECT AES_DECRYPT(UNHEX('data'), "Random Key from Config") FROM SessionView;
UPDATE SessionId SET id = '';
COMMIT;

Quindi concedo solo SELECT, UPDATE e INSERT alla vista SessionView. Poiché le chiavi sono casuali e non c'è modo di estrarre tutte le chiavi, posso creare la sessione ma non riesco a sfogliarle tutte.

    
posta Andrew Smith 17.07.2012 - 19:47
fonte

1 risposta

6

Una delle più grandi minacce alla sicurezza dell'archiviazione dei dati di sessione nel database è che un utente malintenzionato può utilizzare SQL Injection per ottenere la percentuale id e usarlo per autenticare invece di scomporre un hash della password. La soluzione è crittografare l'ID di sessione. Il aes_encrypt() di MySQL non è una cattiva scelta per questo tipo di dati, anche se la sua modalità ECB. Poiché l'id della sessione è casuale, non devi preoccuparti di un semplice testo ripetuto con la tua chiave di crittografia (CBC + Random IV solitamente risolve questo problema).

Tieni presente che devi mantenere la chiave di crittografia da qualche parte e che un utente malintenzionato potrebbe leggerlo utilizzando la funzione load_file() di MySQL con SQL Injection. Assicurati che file_privs sia disabilitato per l'account utente MySQL utilizzato dall'applicazione Web.

Tuttavia, data è forse sensibile. Se questo è il caso, allora potrebbe anche essere necessario crittografarlo e aes_encrypt() sarebbe una scelta sbagliata per questo tipo di dati. CBC + Random IV è una buona scelta. MySQL non consente l'impilamento delle query, quindi a un utente malintenzionato non sarà mai consentito inserire un record di sessione. Se questo era MS-SQL, allora dovresti preoccuparti di questo attacco.

    
risposta data 17.07.2012 - 19:58
fonte

Leggi altre domande sui tag