Показаны сообщения с ярлыком mysql. Показать все сообщения
Показаны сообщения с ярлыком mysql. Показать все сообщения

21 июля 2015 г.

Копируем таблицу MySQL из консоли

CREATE TABLE newtable LIKE oldtable;
INSERT newtable SELECT * FROM oldtable;

17 апреля 2011 г.

PHP: Защита процесса авторизации от SQL-инъекций

Раньше, при разработки сайтов, никогда особо не акцентировал свое внимание на защиту от т.з. "SQL-инъекций". Что это такое думаю много говорить не стоит, просто процитирую, что об этом пишут на сайте php.net:

Принудительное внедрение вредоносных инструкций в SQL-запросы - методика, в которой взломщик создает или изменяет текущие SQL-запросы для работы со скрытыми данными, их изменения или даже выполнения опасных команд операционной системы на сервере базы данных. Атака выполняется на базе приложения, строящего SQL-запросы из пользовательского ввода и статических переменных.

Когда проект достигает определенного уровня популярности среди пользователей сети, появляются и "доброжелатели", которые всяческим образом пытаются найти уязвимости сайта. Жертвой одну из таких уязвимости и стал один из моих проектов.

Уязвимость была обнаружена в функции, обеспечивающий процесс авторизации администратора на сайте.  Для управления проектом был предусмотрен доступ для администратора через веб-форму на сайте приложения. Форма не отличалась особой оригинальностью: поле E-mail и поле Пароль. На серверной стороне для проверки валидности адреса єл. почты и пароля использовалась очень простая процедура: проверка наявности соответствующей записи в таблице пользователей базы данных. SQL-запрос имел следующий вид:


$email = $_POST['email']  
$password = $_POST['password'];
$query = "SELECT * FROM `users` WHERE `email`='" . $email . "' 
AND password='" . dohash($password) . "'"; 

Далее, если запрос возвращал хотя бы одно поле - пользователю автоматически давались права на управления контентом сайта. Если вы используете подобный метод авторизации последующая информация будет для вас полезной.

Ошибкой данного подхода есть отсутствие какой либо проверки значения вводимого в поле e-mail. Для того чтобы получить доступ к управлению сайта, при хорошем знании SQL, было достаточно воспользоваться следующей инъекцией: ввести в поле E-mail следующее значение "any@mail.ru' or 1=1 --" и указать произвольный пароль. При таком значении переменной $email, запрос гарантированно возвращал результат.

Самым простым способом избавиться от такого рода инъекций является использование хеш-функций для преобразования вводимых данных как на стороне PHP так и на стороне SQL-сервера. Например, можно использовать функцию MD5 MySQL () для создания хэш данных на стороне сервера, а также аналогичные функции на стороне PHP.

Таким образом, маленькие изменения запроса обеспечат защиту от инъекций.


$query = "SELECT * FROM `users` WHERE MD5(`email`)='" . md5($email) . "' 
AND password='" . dohash($password) . "'

24 марта 2011 г.

Как создать дамп базы MySQL, включающий триггеры и хранимые процедуры


Как известно в MySQL 5 была включена потдержка таких возможностей как создание хранимых процедур (stored procedures) и триггеров (triggers).

При попытке создать дамп базы, используя mysqldump, обнаружил в нем отсутствие комманд для создания хранимых процедур.

Как оказалось это было вызвано тем, что mysqldump по-умолчанию сохраняет только триггеры, пропуская хранимые процедуры. Существует два параметра, которые управляют этим поведением:
  • --routines – по-умолчанию имеет значение FALSE
  • --triggers – по-умолчанию имеет значение TRUE 
Это означает, что для того чтобы включить в существующий сценарий резервного копирования триггеры и хранимые процедуры, нам нужно только к вызову комманды mysqldump добавить параметр --routines:
mysqldump -u root -p --routines [ИМЯ_БАЗЫ_ДАННЫХ] > dump.sql
Еслы же необходимо сохранить только хранимые процедуры и триггеры, без MySQL-таблиц и данных (скажем, чтобы импортировать их в другую базу данных), для этого можно использовать что-то вроде:
mysqldump -u root -p --routines --no-create-info --no-data 
          --no-create-db --skip-opt [ИМЯ_БАЗЫ_ДАННЫХ] > dump.sql
Чтобы импортировать данные в другую БД используя полученный дамп, следует воспользоваться следующей коммандой:
mysql -u root [ИМЯ_БАЗЫ_ДАННЫХ] < dump.sql

9 марта 2011 г.

Как создать новую базу в MySQL и пользователя для нее


Небольшой пост о том, как создавать из командной строки mysql новую базу данных и нового пользователя mysql с полными правами на только что созданную базу.

mysql -uroot -p
<enter_mysql_root_pass>
CREATE DATABASE <DB_NAME>;
GRANT ALL PRIVILEGES ON <DB_NAME>.* TO 'my_user'@'localhost'
 IDENTIFIED BY 'my_password' WITH GRANT OPTION

Для того чтобы выставить новому пользователю полные права на все базы данных используем следующую команду:

GRANT ALL PRIVILEGES ON *.* TO 'my_user'@'localhost'
 IDENTIFIED BY 'my_password' WITH GRANT OPTION;

Доступ к базе для данного пользователя возможен только с localhost. Если вы хотите дать ему доступ к базе с любого хоста, используете % вместо localhost:

GRANT ALL PRIVILEGES ON <DB_NAME>.* TO 'my_user'@'%' 
  IDENTIFIED BY 'my_password' WITH GRANT OPTION;


Выше приведены простые, но часто используемые команды mysql. 
Для дополнения и использования более сложных команд читайте документацию к mysql.

Сброс пароля пользователя root MySQL-сервера в Ubuntu


1. Останавливаем mysql сервер

/etc/init.d/mysql stop

2. Запускаем mysql следующей командой:

/usr/bin/mysqld_safe --skip-grant-tables &

3. Соединяемся как root без пароля:
mysql --user=root mysql

4. Обновляем пароль:
mysql> update user set Password=PASSWORD('новый пароль') WHERE    User='root';
mysql> flush privileges;

Завершаем работу mysqld_safe: "Ctrl+c"

Подробнее можно прочитать здесь.

16 сентября 2010 г.

Как скачать дамп базы данных имея доступ по ftp?

Столкнулся с задачей, когда доступ к файлам проекта открыт только по ftp, при этом база данных находиться на другом сервере и доступ к ней ограничен. Возник вопрос: возможно ли получить дамп базы имея доступ по ftp?
Ответ очень прост: “Всё возможно верующему” (Евангелие от Марка 9:14-29)


Итак, что нам нужно будет сделать:


Шаг 1. Загружаем и устанавливаем последнюю версию программы EMS SQL Manager (http://www.sqlmanager.net/)


Шаг 2. В папке установленной программы (обычно c:\Program Files\EMS\SQL Manager for MySQL\) находим скрипт emsproxy.php и копируем его на наш хост по ftp. Единственное условие - чтобы была возможность прямого обращения к скрипту через УРЛ (напр.: http://www.myhost.com/emsproxy.php).

Шаг 4. Запускаем EMS SQL Manager и регистрируем новый хост ():
Указываем где установлена БД (ip-адрес или localhost - если доступно на том же сервере), а также логин и пароль для доступа к базе данных.
Соглашаемся использовать туннелирование (ставим галочку Use tunneling) и выбираем HTTP протокол для этого дела (HTTP tunneling). Далее...
Указываем URL к скрипту.
Далее...
Выбираем нужную нам базу данных.
Далее... переходим к следующему окну и заканчиваем (Finish).

Шаг 5. Делаем экспорт данных нашей базы.
Здесь все очень просто. В главном меню выбираем Tools > Extract Database, выбираем нужную базу и сохраняем в файл (не забыв при этом поставить галочку в поле Extract all metadata and data of the database).

С задачей справились - дамп получен. Помимо дампа, теперь имеем возможность управлять удаленной базой данных, что весьма и весьма полезно :)

P.S. Если на удаленном сервере используется СУБД Postgres можно аналогичным способом добыть доступ к БД используя программу SQL Manager for Postgres