[инструкция] Управление доступом к базам Mysql
В последнее время часто возникаю вопросы по управлению доступом к базе MySQL, и чтоб их не задавали снова и снова - выкладываю краткую инструкцию.
Система управления базами данных MySQL очень часто применяется для хранения важной информации на веб-сайтах. Если это обычный сайт или форум – в базе могут храниться сообщения пользователей, данные для динамических страниц, данные о посещениях, если это какой-либо интерактивный сервис, то кроме данных про доступ (конфиденциальных), там хранится и другая информация о пользователе и его действиях. Все это приводит к тому, что общая безопасность сайта, вернее всей веб-системы, зависит от того, насколько защищен именно сервер базы данных.
На обычных виртуальных хостингах каждый клиент получает свой логин и пароль, и ему доступна только одна база, в которой он может создавать произвольное количество таблиц. Один и тот же физический сервер БД используют разные клиенты, каждый из которых имеет доступ только до одной определенной базы данных. Ситуация, когда у пользователя одна база, за владение которой сражаются и "движок" форума (которому требуется создать сотню и больше таблиц), и скрипты списков рассылки, новостей, поисковый скрипт, а если еще установлена система управления контентом (CMS) или электронный магазин – тогда в этой базе возникает такое огромное количество различных таблиц, порой с очень странными и ничего не обозначающими названиями (хорошо, если два скрипта не используют таблицы с одинаковыми названиями, но разной структурой). В таких случаях очень желательно иметь возможность создать несколько отдельных баз данных, и выделить их для разных приложений (к примеру, одна база для форума, другая для электронного магазина).
Кроме сложностей с управлением несколькими сотнями таблиц в одной базе, вы столкнетесь с необходимостью ограничивать доступ разных пользователей к таблицам, базам и даже отдельным столбцам конкретной таблицы. Спешим вас успокоить – разработчики СУБД MySQL уже позаботились о подобной ситуации – в MySQL есть очень гибкий и мощный механизм управления и разграничения доступа пользователей к базам и таблицам.
Работает этот механизм, естественно, через служебные таблицы. В списке баз данных есть одна служебная база под названием "mysql", в которой хранятся в нескольких таблицах все служебные данные, необходимые для работы сервера. Пока нас интересует только управление правами доступа, за которые отвечают следующие таблицы:
# columns_priv – доступ на уровне столбцов таблицы;
# db – доступ к отдельным базам данных;
# host – доступ к базам с конкретных хостов/IP;
# tables_priv – доступ к отдельным таблицам базы данных;
# user – глобальные настройки доступа для конкретных пользователей. 
Давайте детально рассмотрим таблицу user и специфику работы с ней, работа же с остальными таблицами аналогична и не будет сложнее.
Права, определяемые в таблице user, являются глобальными, это значит, что они применяются ко всем базам данных, к которым имеет доступ конкретных пользователь. Также в этой таблице хранятся сами имена пользователей и их пароли. Причем имена пользователей хранятся в виде открытого текста, а пароли зашифрованы функцией PASSWORD(). Сервер MySQL применяет свой метод шифрования вместо системного (если такая функция предоставляется ОС, к примеру, Linux/UNIX).
Поскольку MySQL предназначена для работы через сеть, то к серверу могут подключаться клиенты с различных хостов. Поэтому в таблице привилегий есть столбец host, в котором можно задать конкретный компьютер, IP или диапазон адресов, с которых определенный пользователь (или все, любые пользователи) могут подключаться, или же им полностью запрещен доступ. К примеру, если ваш тестовый сервер находится в локальной сети, то можно выборочно разрешить доступ к нему с отдельных компьютеров, а для всех остальных полностью заблокировать доступ.
Если для одного и того же пользователя надо разрешить доступ с различных компьютеров, то в таблице привилегий надо создать две (три или больше – сколько понадобится) записей, определяя в каждой отдельный параметр доступа. К примеру, для доступа пользователя root с компьютеров localhost и 192.168.1.138 надо в таблицу user внести две одинаковые записи, которые различаются только полем host. Хотя можно, конечно, и не делать их одинаковыми – тогда тот же пользователь, но в зависимости от места, откуда он подключился, будет иметь разные привилегии.
Значение столбца host можно задавать в различных форматах. Это может быть как имя хоста – localhost, так и IP-адрес – 192.168.1.138. При необходимости, можно применять символы подстановки. Они аналогичны тем же. Что применяются в синтаксисе SQL-запросов. Символ "_" означает любой символ, а "%" - любое количество символов. К примеру, для разрешения доступа с любого компьютера, содержащего в имени hostinfo.ru надо прописать %.hostinfo.ru в столбце host. Таким же способом можно задавать и диапазоны IP-адресов. Для задания маски сети доступен также вариант написания через слеш – 192.168.1/255. Для глобального задания доступа можно в столбце host прописать только символ "%" или оставить его пустым, что равнозначно. 
Следующие поля – user и password, определяют имя и пароль пользователя. Эти поля уже, в отличие от host, различают регистр введенных символов, поэтому пользователь Root и root – это два разных пользователя. Знаки подстановки в этом поле уже не работают – имя пользователя %" означает не "любой пользователь", а именно "пользователь с именем %". Для задания анонимного пользователя надо просто оставить поле пустым, иначе любой символ будет считаться именем пользователя. Так же и в поле password – пароль хранится в зашифрованном виде, знаки подстановки недействительны, а пустое поле означает, что пользователь вовсе не должен указывать пароль, а не то, что пароль может быть произвольным. Напомним, что просто пароль (пусть и зашифрованный) нельзя помещать в поле password, предварительно его надо шифровать функцией PASSWORD("пароль_открытым_текстом"). Например:
Следующим полем является поле базы данных – db. В других таблицах оно также присутствует, поэтому во всех таблицах правила написания имен баз данных должны быть одинаковыми. Разрешается использовать символы подстановки "%" и "_", пустое значение соответствует "все базы". Поле чувствительно к регистру!
Далее идет целый набор столбцов, разрешающие те или иные действия для пользователя. К примеру, Select_priv, Insert_priv, Update_priv, Delete_priv, Index_priv и Alter_priv стоит установить в "Y" (разрешено) для обычного пользователя, так как такие запросы чаще всего встречаются в обычных приложениях. Остальные возможности для большей безопасности надо отключить для всех пользователей (особенно, если есть учетная запись анонимного пользователя). Поэтому в следующих столбцах - Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv, File_priv, Grant_priv и References_priv надо выставить значение "N"(запрещено), а при необходимости разрешить действия только администратору и максимально ограничить возможности подключения такого пользователя – указать конкретный IP-адрес или имя компьютера, выбрать длинный и сложный для подбора пароль.
Аналогична таблице user и таблица db, в которой можно задавать отдельные привилегии для конкретных баз данных. Таким образом, можно разрешить пользователям создавать новые таблицы только в своих базах данных и запретить даже простой просмотр чужих баз. Синтаксис всех полей полностью аналогичный таблице user.
При подключении пользователя сервер MySQL сначала обрабатывает таблицу user (записанные там правила доступа глобальные), а потом, если прав недостаточно или нельзя определить права доступа к конкретной базе – тогда уже поиск продолжается в таблице db. Если же и во второй таблице нет соответствующих привилегий, сервер пробует найти их в таблицах tables_priv и columns_priv. И только когда на основании информации со всех доступных таблиц сервер определяет, что клиенту не разрешено запрошенное действие, он отвергает клиентский запрос.
Таблица host также аналогична описанным выше, только вместо имен и паролей пользователей для идентификации привилегий служит имя хоста или IP-адрес. На первый взгляд, есть существенное дублирование информации. Ведь таблицы db и host почти равнозначны и содержат одинаковые данные. На самом деле это немного не так. Таблица host недоступна для изменения через операторы SQL GRANT и REVOKE, ее можно только править непосредственно. Когда сервер принимает решение о допуске клиента к базам, он сначала ищет упоминание имени хоста или IP в таблице host. Если там присутствует соответствующая запись, то тогда права из таблиц host и db обьединяються и клиент получает некоторые привилегии. Если же в таблице host нет указаний на счет хоста или IP, то сервер даже не рассматривает дальше таблицу db, так как если клиенту не разрешено подключение с хоста, то тогда бессмысленно искать права на доступ к отдельным базам.
И, напоследок, давайте остановимся на одном нюансе при определении привилегий. Сервер MySQL, когда ищет и сравнивает привилегии, не сравнивает их напрямую. К примеру, символьное обозначение параметра имеет больший приоритет, чем использование символов подстановки. Пример: если есть две записи - %.hostinfo.ru и admin.hostinfo.ru, то вторая запись имеет больший приоритет. Поэтому если для одного пользователя существуют разные привилегии в зависимости от хоста или других параметров, то будет выбираться первой та запись, где более точно и однозначно указан параметр. Это же касается и IP-адресов.
Источник: _http://www.hostinfo.ru/
WebDeveloper сервера DARKWORLD
Блин всё вроде делаю и всё равно мне пишет
Warning: mysql_connect() [function.mysql-connect]: Host '94.181.96.48' is not allowed to connect to this MySQL server in L:\home\localhost\www\config\_config_procs.php on line 2
Couldn't connect to MySQL
Warning: mysql_connect() [function.mysql-connect]: Host '94.181.96.48' is not allowed to connect to this MySQL server in L:\home\localhost\www\config\_config_procs.php on line 2
Couldn't connect to MySQL
У меня такая же проблема! помогите плиз! может дело в ip адресе?
Перевод:
Хосту 'xxx.xxx.xxx.xxx' не разрешен коннект к MySQL на этом сервере
Делайте выводы - скорее всего ваш юзер БД не имеет разрешения к коннекту к базе.
На Форуме я тоже Radar!
Я везде Radar!
Радар же тебе всё подробно написал...
Вот ещё подробнее:
1. Заходишь в навикат.
2. Коннектишься к mySql.
3. Жмёшь Manage Users.
4. В списке юзверей выбираешь нужного.
5. Правый клик мыши > Edit User.
6. В поле host пиши знак процента `%` без ковычек.
You can't feeling! No you can't feeling! And you can't feeling!
— People = Shit
Warning: mysql_connect(): Can't connect to MySQL server on '94.178.102.100' (1) in /home/l/la2ericc.h18.ru/WWW/inc/config.php on line 47
Datenbankserver nicht erreichbar
Блин терь база не конектится к моему айпи
ну, блин
Ложишь майадмин в _папка с учтановленным апачем_htdocsmyadmin
дальше в конфигеconfig.inc.php ищешь эти строчки:
cfgServersiauth_type = config; // Authentication method config, http or cookie based?
cfgServersiuser = root; // MySQL user
cfgServersipassword = ; // MySQL password only needed with config auth_type
и меняешь там данные на те что указал при установки мускула... все
Привет Всем.
У меня к вам Вопрос !
У меня стоить сервер l2j, и сайт на appser Все пашет, сайт видит сервер, Статус сервера показывает.
Но вот я решил создать сайт в инете, все поставил установил туда такую же обвязку как на компе, настроил.
А в поле где должен быть статус сервера пишет Warning: mysql_connect() [function.mysql-connect]: Lost connection to MySQL server at 'reading initial communication packet', system error: 111 in /users/la2/www/scoria/config/_config_procs.php on line 3
Couldn't connect to MySQL
Прошу помочь.
Заранее спасибо.
origammi: Привет Всем.
У меня к вам Вопрос !
У меня стоить сервер l2j, и сайт на appser Все пашет, сайт видит сервер, Статус сервера показывает.
Но вот я решил создать сайт в инете, все поставил установил туда такую же обвязку как на компе, настроил.
А в поле где должен быть статус сервера пишет Warning: mysql_connect() [function.mysql-connect]: Lost connection to MySQL server at 'reading initial communication packet', system error: 111 in /users/la2/www/scoria/config/_config_procs.php on line 3
Couldn't connect to MySQL
Прошу помочь.
Заранее спасибо.
<?php
$host="хостбд";
$fp = fsockopen($host, 3306, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
echo "Ok";
}
fclose($fp);
}
?>
Запусти скажи что показывает...
No Connect
выдает вот такую ошибку, в чем проблемма?
такая ошибка:
Warning: mysql_connect() [function.mysql-connect]: Can't connect to MySQL server on '95.31.4.35' (4) in /www/ax3.net/l/a/la2halin/home/site/l2top.php on line 37
Нет соединения с базой данных.
ВОТ СКРИПТ:
///*** <b><a href=http://la2halin.ax3.net/Главная</a><br>
<center>
<b>1. Проголосуй за нас в l2top<br>
</center>
<center>
<a href="http://l2top.ru/?voteme=8888" target="_blank"><img src="http://l2top.ru/vb/8888.pgif" width="88" height="31" border="0" alt="L2top.ru: Рейтинг-каталог серверов Lineage2"></a>
</center>
<center>
<?
if(!isset($_POST['name'])){
echo '<form action="l2top.php" method="post">';
echo '2. Ввести ник персонажа<br/>
<input type="text" name="name"/><br/><br/>
<input type="submit" value="Получить бонус"/>
</form>';
}else{
$bonus_id=6664; // ID вещи
$cols_for_vote=1; // Колличество зачисляемых вещей за одно голосование
$id_l2top=8888; // Ваш ID в L2Top
$host=''; // сервер на котором установлена база данных
$user=''; // имя пользователя от базы данный
$pass=''; // пароль пользователя от базы данный
$db=''; // название базы данных
$mc = mysql_connect($host, $user, $pass);
if($mc){
$db = mysql_select_db ($db);
}
if(!$mc || !$db){
echo 'Нет соединения с базой данных.';
exit;
}
$name=mysql_escape_string($_POST['name']);
$ch=mysql_query("SELECT obj_Id FROM characters WHERE char_name = '$name';");
$chd=mysql_fetch_assoc($ch);
$char_id=$chd['obj_Id'];
$total=0;
$your_ip = $_SERVER['REMOTE_ADDR'];
$dip=explode('.',$your_ip);
$your_ip1 = $dip[0].'.'.$dip[1].'.'.$dip[2].'.xxx';
$html = @file_get_contents('http://l2top.ru/?servID='.$id_l2top.'&act=info');
if (!$html || !preg_match_all('/<td>([^<]+)<\/td>/', $html, $matches))
$error .= 'Не удалось получить информацию с L2Top.ru!<br/>';
else
{
foreach ($matches[1] as $id => $nick)
{
if (strtolower(trim($nick)) === strtolower(trim($name))) {
$voters[] = $matches[1][$id-2];
}
}
if ($voters != array())
{
foreach ($voters as $time)
{
$result = mysql_query("SELECT * FROM `l2top` WHERE `nick` = '".mysql_escape_string($name)."' AND `time` = '".mysql_escape_string($time)."'");
$row = mysql_fetch_assoc($result);
if ($row == array())
{
$result = $result = mysql_query("SELECT * FROM `items` WHERE `owner_id` = ".mysql_escape_string($char_id)." AND `item_id` = ".$bonus_id."");
$row = mysql_fetch_assoc($result);
if ($row == array())
{
$result = mysql_query("SELECT MAX(`object_id`)+1 AS `id` FROM `items`");
$row = mysql_fetch_assoc($result);
$ins_id = $row['id'];
/*
mysql_query("INSERT INTO `items` (`owner_id`, `object_id`, `item_id`, `count`, `enchant_level`, `loc`, `loc_data`, `price_sell`, `price_buy`, `time_of_use`, `custom_type1`, `custom_type2`, `mana_left`)
VALUES(".mysql_escape_string($char_id).", ".$ins_id.", $bonus_id, ".$cols_for_vote.", 0, 'INVENTORY', 0, 0, 0, NULL, 0, 0, -1)");
данный запрос необходимо переделывать взависимости от того, какая структура таблицы items у вас на сборке сервера. Данный запрос отвечает за добавление бонусной вещи за голосование в инвентарь, если у вас её еще нет.
*/
mysql_query("INSERT INTO `items` (`owner_id`, `object_id`, `item_id`, `count`, `enchant_level`, `loc`, `loc_data`, `price_sell`, `price_buy`, `time_of_use`, `custom_type1`, `custom_type2`, `mana_left`)
VALUES(".mysql_escape_string($char_id).", ".$ins_id.", $bonus_id, ".$cols_for_vote.", 0, 'INVENTORY', 0, 0, 0, NULL, 0, 0, -1)");
}
else
mysql_query("UPDATE `items` SET `count` = `count` + ".$cols_for_vote." WHERE `owner_id` = ".mysql_escape_string($char_id)." AND `item_id` = ".$bonus_id." ");
mysql_query("INSERT INTO `l2top` (`nick`, `ip`, `time`) VALUES ('".$name."', '".mysql_escape_string($your_ip1)."', '".mysql_escape_string($time)."')");
$total += $cols_for_vote;
$error .= 'Голос за '. $time.' зачислен.<br/>';
}
else
$error .= 'Голос за '. $time.' уже был зачислен.<br/>';
}
}
else
$error .= 'Ваш голос на сайте L2Top.ru не найден.<br>';
}
echo $error.'<br><b>'.$total.'</b> Бонус зачислен вашему персонажу!<br/>';
}
?>
</center>
ПОМОГИТЕ ПЛЗ в навикете вписал хост свой айпи пользователя и пасс....
При чем тут скрипт если ошибка говорит что не может подключиться к Базе на сервере '95.31.4.35'?
Ищи ошибки в подключении а не в скрипте!
На Форуме я тоже Radar!
Я везде Radar!
А что "всё" вы перепробовали?
База открыта для доступа из вне?
У пользователя есть соответствующие права?
Хостинг поддерживает коннект к удаленным БД?
На Форуме я тоже Radar!
Я везде Radar!
СРочно прошу помощи установил ubuntu server 8.10 . Все сделал все настроил как мне с моего компа приконнектиться к мускулу на линуксе. ??









