Хорошим примером защиты данных в разных базах является их шифрование. Для хранения паролей используют лишь хеш. А хеш, как известно, необратим. Нижепредложенный perl-скрипт хорош для огораживания структуры полей таблиц баз данных под управлением MySQL 5.x. Обфускация полей базы вкупе с шифрованием данных может минимизировать потери в случае эксплуатации sql-injection уязвимостей и утечки данных.
В качестве аргументов передаётся файл с SQL-дампом структуры БД и "соль" к хэшу. На выходе формируется файл с полями, заменёнными на нечитаемые наборы символов, что затрудняет определение суть хранимых в полях данных (если данные в БД хранятся в зашифрованном виде).Код ниже:
use Digest::SHA qw(sha256_hex);
print "-------------------------------------\n";
print "db_obfuscator started\n";
if (($#ARGV + 1)<2)
{
print "run $0 db_name.sql pass\n";
print "-------------------------------------\n";
die;
}
my $db_filename = $ARGV[0];
my $db_filename_out = $ARGV[0];
$db_filename_out =~ /(\w+)\.(\w+)/;
$db_filename_out = $1 . "_out." . $2;
my $base_hash = sha256_hex($ARGV[1]);
my $hash_str = $base_hash . "test_str";
my $text;
$q = sha256_hex($hash_str);
#print "$hash_str = $q\n";$filesize = -s $db_filename;
open DB,"<", $db_filename or die "could not open $db_filename\n";
my $filesize_test = read (DB, $text, $filesize);
print "read $filesize_test bytes from $db_filename\n";
close DB;
my @matches = ($text =~ /\`[a-z,_,0-9]+\`/g);
#print "found @matches.lenght() \n";
foreach $abc(@matches)
{
$q = sha256_hex($base_hash.$abc);
$text =~s/$abc/\`$q\`/g;
# print "$abc = $q\n";
}
open (outfile, ">", $db_filename_out);
printf outfile $text or die "could not write $db_filename_out\n";
close(outfile);
my $filesize_out = -s $db_filename_out;
print "wrote $filesize_out bytes into $db_filename_out\n"
URL:
Обсуждается: http://www.opennet.me/tips/info/2935.shtml
Отличный пример говнокода, уважаемый, если уж постите что-то, то хоть хелпу вбейте в код, иначе проще самостоятельно написать.
Вы не поняли, это видимо юмор такой, типа "обфускация кода для обфускации". Старая школа, респект за ($#ARGV + 1)<2 и @matches = ($text =~ /\`[a-z,_,0-9]+\`/g).
И что здесь неясного?
if (($#ARGV + 1)<2)гениально
Да и say уже пора использовать, не зря же за разрабы беспокоятся, кол-во символах в популярных командах уменьшают :)
perl -e "use v5.10; if (scalar @ARGV < 2) {say \"Is bad\";};"
> кол-во символах в
> уменьшают :)
> perl -e "use v5.10; if (scalar @ARGV < 2) {say \"Is bad\";};""...\"...\"..." => '..."..."...' //Что ты сделал в свои годы для ш-ш-перла?
Вы уверены, что я не из самодельного интерпретатора передаю строку с коммандами, который не понимает обработку одинарных кавычек?
В файле программы слешей не было бы.
(@ARGV < 2) было бы чуть короче, но по-моему не принципиально.
Мне тоже понравилась эта строча ))) Так за то и любим перл - что можешь писать как захочется )))
Коллеги, не пинайте студента. Сейчас руки отобьёте, озлобится и пойдёт семки грызть по подъездам с охотой крепкой.
Человек решил для себя конкретную задачу. Молодец.Но автору: однако, комментировать код полезно не только лишь для тех, кто не смотрит в завтрашний день ...
:-)
> Коллеги, не пинайте студента. Сейчас руки отобьёте, озлобится и пойдёт семки грызть
> по подъездам с охотой крепкой.
> Человек решил для себя конкретную задачу. Молодец.
> Но автору: однако, комментировать код полезно не только лишь для тех, кто
> не смотрит в завтрашний день ...
> :-)Наоборот, пристыдят и он на зло всем хихикающим, пойдёт и плюсы по Страуструпу выучит!
p.s. хорошая книжка http://www.ozon.ru/context/detail/id/25227935/ а потом вот эту интересно читать http://www.ozon.ru/context/detail/id/4289407/
Мало перереименовать поля в дампе БД, нужно ведь и клиентский код исправить, чтобы там использовались новые имена полей. Не будешь же везде писать
$sql = "SELECT " . sha256_hex($base_hash."name") . ", " . sha256_hex($base_hash."bdate") . " FROM user";
вместо
$sql = "SELECT name,bdate FROM user";
В том то весь и замут. В клиенском коде пиши имена в кавычках
char *sql_str= "select `name` from `users`;";
И парсер так-же всё обработает.
> В том то весь и замут. В клиенском коде пиши имена в
> кавычках
> char *sql_str= "select `name` from `users`;";
> И парсер так-же всё обработает.Я одного не пойму. А что, просто взять Green SQL и адекватно его настроить - или просто проверять передаваемые в предикат поля на предмет наличия там UNION - это не комильфо? Обязательно надо вот так, автогеном, через ж.пу, без наркоза - и при этом надеяться, что _вот это вот_ поможет?
> В том то весь и замут. В клиенском коде пиши имена в
> кавычках
> char *sql_str= "select `name` from `users`;";
> И парсер так-же всё обработает.Тогда где здесь защита от sql-injections?
>Тогда где здесь защита от sql-injections?Слонопок? Защита от защиты же.
Базу тырят и вместо структуры видят антиструктуру. База коллапсирует, все коллапсируют.
Конечно, хакеры взломавшие сервер настолько глупые что совсем не поймут что это у них тут в базе. А зачем они вообще сервер ломали?