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.