Премахване на поверителната информация от базата от данни

Представете си, че сте собственик на голям онлайн магазин. За вас работят екип програмисти, които непрекъснато добавят нова и нова функционалност към вече съществуващата или пък поправят бъговете, който изникват непрестанно. И програмистите са хора, има бъгове – има работа, няма бъгове – няма работа. Бизнеса Ви се развива и Вие имате много клиенти. Съответно и Вашата база от данни е пълна с информацията въведена от клиентите. Често това са трите имена, адрес, телефон. Понякога дори номер на лична карта или пък номер на кредитна карта, без значение – всяко едно от изброените може да се счита за поверителна информация. Във Ваш интерес е, като собственик на магазина, да пазите тази информация. Предполага се, че базата от данни на магазина е добре защитена и е много трудно да се достъпи отвън, ако не и невъзможно, в този случай хората които имат достъп до тази информация са програмистите, които работят за Вас. На тях им е необходим достъп до базата, за да видят какво точно се е случило докато проследяват някой от бъговете.
Добра практика е преди да се предостави достъп до базата, да се премахне поверителната информация от нея. В общия случай „идеално“ решение няма. Един от възможните варианти е, да заменим полетата с поверителна информация, с NULL стойности. Удобно е, защото става много бързо и много лесно, лошото е че по този начин нарушаваме целостта на базата. Представете си, че имаме две таблици свързани посредством полето номер на лична карта. Когато въведем NULL в това поле ще загубим връзката между таблиците.
Друг вариант е да хешираме всички полета с поверителна информация, например с MD5. По този начин ще запазим релациите. Неприятностите идват, когато се опитаме да инсталираме локално базата от данни, за да я използваме докато разработваме проекта. Причината е, че хишираната вече информация няма да премине валидирането в сайта. Начини има още много, аз ще се опитам да опиша още една от възможностите за премахване на тази информация от базата. Идеята е отново да се използва MD5 хеширане, но в полето с поверителна информация да не се слага хеша ами така избрана от нас стойност, която да преминава през съответните правила за валидиране в сайта. Например:

Таблица clients с колони id, име и фамилия:

1 Иван Иванов
2 Петър Христов
3 Георги Христов

Таблица clients (след премахване на поверителната информация):

1 First_Name_1 Last_Name_1
2 First_Name_2 Last_Name_2
3 First_Name_3 Last_Name_2

За целта използваме спомагателна таблица, в която ще съхраняваме всички хешове. Ето как би изглеждала една такава таблица:

CREATE TABLE db_hashes(
hash VARCHAR(50) NOT NULL,
prefix VARCHAR(250) NOT NULL,
counter BIGINT(11) DEFAULT NULL,

PRIMARY KEY (hash)
) ENGINE=InnoDB;

В полето hash, ще записваме съответният hash за името, полетата prefix и counter, заедно ще образуват новата стойност. Ето и една примерна функция, която може да се използва за „изчистване“ на текстови полета от базата.

DELIMITER |
DROP FUNCTION IF EXISTS sanitize_string |
CREATE FUNCTION sanitize_string(
input_data VARCHAR(255),
input_prefix VARCHAR(255),
input_salt VARCHAR(50)
)
RETURNS VARCHAR(255)
DETERMINISTIC
BEGIN

DECLARE result VARCHAR(255);
DECLARE result_prefix VARCHAR(255);
DECLARE result_counter BIGINT;

— check for existing data, which has the same hash
SELECT prefix, counter INTO result_prefix, result_counter
FROM db_hashes
WHERE hash = MD5(CONCAT(input_data, input_salt));

IF result_prefix IS NOT NULL THEN
IF result_counter IS NOT NULL THEN
SET result = CONCAT(result_prefix, result_counter);
ELSE
SET result = result_prefix;
END IF;

RETURN result;
END IF;

— get the last counter if exist and write the new row with
— the new combination of prefix and counter
SELECT MAX(counter), prefix INTO result_counter, result_prefix
FROM db_hashes
WHERE prefix = input_prefix
GROUP BY prefix;

IF result_prefix IS NULL THEN
SET result_counter = 1;
ELSE
SET result_counter = result_counter + 1;
END IF;

INSERT INTO db_hashes
VALUES(MD5(CONCAT(input_data, input_salt)), input_prefix, result_counter);

RETURN CONCAT(input_prefix, result_counter);
END|
DELIMITER ;

Ето как би изглеждала една заявка за премахване на поверителната информация от таблицата clients:

UPDATE clients SET
first_name = sanitize_string(first_name, ‘First_Name_’, ‘salt’),
last_name = sanitize_string(last_name, ‘Last_Name_’, ‘salt’);

Лесно можем да напишем и други такива функции, например за модифициране на числа, дати и т.н. Не твърдя че това е единственото решение, нито че е най-оптималното или най-подходящото, бих се радвал ако някой сподели и други начини за премахване на поверителната информация.

Сподели:
Edno23 Favit Svejo Twitter Facebook Google Buzz Delicious Google Bookmarks Digg
Публикувано в SQL. Постоянна връзка.

Вашият коментар

Вашият email адрес няма да бъде публикуван Задължителните полета са отбелязани с *

*

Можете да използвате тези HTML тагове и атрибути: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>