phpMyAdmin и капча

Каждму, кто делает сайты хоть раз приходилось иметь дело с базой данных MySQL. И неудивительно, MySQL - чуть ли не самая популярная СУБД среди всех ресурсов Интернета. Она имеет кучу преимуществ, кучу сервисов, кучу встроенных функций. Ну и очевидно, что разрабатывая очередной движок порой приходится вручную менять данные в базе данных, чтобы проверить как это всё работает. Конечно есть куча клиентов, которые могут это делать, но любому автономному клиенту надо иметь возможность подключатся к порту 3306. А это возможно не всегда, ибо если сервер БД находится на той же машине, где и Веб-сервер, то админ, будучи параноиком, мог и закрыть его... во избежание... Но в случае с сервером БД на другой машине ситуация не обязательно будет лучше, ведь можно поместить в списки доступа в порту 3306 только IP той машины, которая в Веб-сервером... ну или вообще если весь хостинг находится в более мелкой сети, а из Интернета доступен только через реверсивный прокси...  Поэтому не случайно большинство начинающих Веб-мастеров использует phpMyAdmin для своих развлечений. Скорее всего Вы уже о нём слышали и даже пользовались им. А оно и впарвду удобно - сам клиент фактически лежит там, где и сайт, что гарантирует чуть более чем полную доступность СУБД. Но ведь лежащий на сервере phpMyAdmin может обнаружить какой-то недобрый человек и использовать его для взлома БД... Элементарным брутом, тут ничего не сделать... Хотя если у Вас статический IP, то можно ограничить доступ только с Вашего... Но зачастую это не так... Можно запаролить папку средствами Веб-сервера, но тут суть дела не изменится - можно взломать один пароль, значить можно взломать и второй... Правда это будет сложнее... Но не стоит забывать про то, что админ всегда прав и может запретить вытворять подобные вещи. Так что ограничение по IP и пароль никак не есть универсальными вариантами. Но можно усложнить процес брута тем, что придётся ещё и угадывать буквы с картинки... Да, да - о капче все слыхали ;)

Мы все кроем матом всякие буквы которые не может прочитать, когда регистрируемся на форумах, в LastFM или ещё где-то... Ну вот любой посягнувшый на Вашу БД будет испытывать то же самое...

jecky-chan

Что сказать про себя, то я думаю можно сделать авторизацию немного сложней во имя безопасности... Есстественно рассматриваем тип авторизации cookie, то есть тот, который предлагается из коробки...

Значит так... сначала создаём в корне phpMyAdmin'а папку captcha - туда мы положим всё дополнительное, что нужно для реализации... Самое главное там (и наверное единственное) - это скрипт, котрый выдаёт картинку. У меня он вот такой:

<?php
// Задаём тип выводимого содержимого, отключаем кеширование браузером
header('Content-Type: image/png');
header('Cache-control: no-cache, no-store');

// Подключаемся к сесси, созданной самим phpMyAdmin (ну или создаём её, если нету)
session_name('phpMyAdmin');
session_start();

$im = imagecreatetruecolor(120, 30); // Создаём картинку 120x30
$white = imagecolorallocate($im, 255, 255, 255); // Описываем белый цвет
$black = imagecolorallocate($im, 0, 0, 0); // Описываем чёрный цвет
$font = 'arialbd.ttf'; // Имя шрифта для отрисовки символов (он должен лежать рядом со скриптом)

imagefilledrectangle($im, 0, 0, 119, 29, $white); // Делаем картинку белый фон
$code = ''; // Сюда сгенерируем код
$j = 10;
$sym = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; // Символы, из которых будет сложен код
// Собственно процесс генерации кода
for($i = 0; $i < 5; $i++) {
$number = $sym[mt_rand(0, strlen($sym)-1)];
$color = imagecolorallocate($im, mt_rand(0, 200), mt_rand(0, 200), mt_rand(0, 200));
imagettftext($im, mt_rand(15, 25), mt_rand(-20, 20), $j, 25, $color, $font, $number);
$j += mt_rand(15, 23);
$code .= $number;
}
// Добавляем шум из чёрных точек
while($i < 500) {
imagesetpixel($im, mt_rand(0, 120), mt_rand(0, 30), $black);
$i++;
}

$_SESSION['code_session'] = md5($code); // Записываем хеш кода в сессию
imagepng($im); // Выводим что получилось
imagedestroy($im); // Очищаем память
exit(); // Выход
?>

Код прост как дверь, и то такое выражение может обидеть её ;) Понятно что скрипту надо поддержа GD в PHP, а также поддержка TrueType шрифтов. Мы рандомно генерируем код, пишем его в сессию к phpMyAdmin, чтобы с ним потом сравнить то, что ввёл пользователь. На сам phpMyAdmin нужно наложить патч. Сюда не выкладываю ибо впадло. Но в двух словах: он в блоке проверки логина и пароля делает ещё и проверку кода и если тот не такой как сгенерированый, авторизоция считается не валидной...

login-form

Код генерируется при обновлении картинки. Средствами javascript в патче реализировано обновление картинки при клике на ней. Тепер подобрать пароль к БД стало намного сложнее. Для приведённого патча скрипт генерации картинки дожен называться img.php.