powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как ограничить доступ только хранимыми процедурами
9 сообщений из 9, страница 1 из 1
Как ограничить доступ только хранимыми процедурами
    #38700696
Styg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!

Задача:
Нужно, чтобы пользователю была доступна всего одна ХП и он не мог ее менять, а мог только запускать.

Даю права:

CREATE USER 'vladimir'@'%';
SET PASSWORD FOR 'vladimir'@'%' = PASSWORD ('1111');
INSERT INTO mysql.procs_priv (host, user, db, routine_name, routine_type, proc_priv)
VALUES ('%', 'vladimir', 'db', 'PROC_USER_GET_INFO', 'PROCEDURE', 'Execute');
FLUSH PRIVILEGES;

Проблема в том, что тогда юзер не может подцепиться к базе в принципе.
Методом тыка выяснил, что если я даю доступ на SELECT,
тогда пользователь отлично подключается к базе и может выполнить лишь одну процедуру PROC_USER_GET_INFO.

CREATE USER 'vladimir'@'%';
GRANT SELECT ON *.* TO 'vladimir'@'%';
SET PASSWORD FOR 'vladimir'@'%' = PASSWORD ('1111');
INSERT INTO mysql.procs_priv (host, user, db, routine_name, routine_type, proc_priv)
VALUES ('%', 'vladimir', 'db', 'PROC_USER_GET_INFO', 'PROCEDURE', 'Execute');
FLUSH PRIVILEGES;

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

Как запретить юзеру делать селекты, оставив ему при этом возможность подключаться к базе и выполнять нужную ХП?
...
Рейтинг: 0 / 0
Как ограничить доступ только хранимыми процедурами
    #38700708
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StygINSERT INTO mysql.procs_privИ чего же вы хотите после издевательств над базой?
Используйте нормальные команды для управления привилегиями (GRANT, REVOKE) и SQL SECURITY DEFINER при создании процедур.
...
Рейтинг: 0 / 0
Как ограничить доступ только хранимыми процедурами
    #38700715
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StygПроблема в том, что тогда юзер не может подцепиться к базе в принципе.Как пользователь подключается? Через консольного клиента?
...
Рейтинг: 0 / 0
Как ограничить доступ только хранимыми процедурами
    #38700719
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_StygПроблема в том, что тогда юзер не может подцепиться к базе в принципе.Как пользователь подключается? Через консольного клиента?
вряд ли это так. но что ему помешает ?
...
Рейтинг: 0 / 0
Как ограничить доступ только хранимыми процедурами
    #38700723
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netwindчто ему помешает ?То, что 99% программ при работе обращаются к системным таблицам
...
Рейтинг: 0 / 0
Как ограничить доступ только хранимыми процедурами
    #38700760
Styg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Действительно, изменил скрипт на:

DROP USER 'vladimir'@'%';
CREATE USER 'vladimir'@'%';
SET PASSWORD FOR 'vladimir'@'%' = PASSWORD ('1111');
GRANT EXECUTE ON PROCEDURE db.PROC_USER_GET_INFO TO 'vladimir'@'%';
FLUSH PRIVILEGES;

Проблема на 50% решилась. Действительно теперь можно подключиться к базе и выполнить только одну ХП.
Но это если использовать dbForge или консоль.

Но 50% проблемы все же осталось.

Запустить ХП из приложения не удается.
Приложение написано на Delphi и использует компонент TMyStoredProc из библиотеки MyDAC.

Ошибка вываливается в момент выставления параметра:

DM.procW.Close;
DM.procW.StoredProcName:='PROC_USER_GET_INFO';
DM.procW.ParamByName('inpLOGIN').AsString:=DM.DB.Username;
DM.procW.Open;

Пишет
Parameter inpLOGIN not found.

Если добавить GRANT на SELECT *.*, то все снова работает, но опять-таки селект можно делать на любые таблицы.

DROP USER 'vladimir'@'%';
CREATE USER 'vladimir'@'%';
SET PASSWORD FOR 'vladimir'@'%' = PASSWORD ('1111');
GRANT SELECT ON *.* TO 'vladimir'@'%';
GRANT EXECUTE ON PROCEDURE db.PROC_USER_GET_INFO TO 'vladimir'@'%';
FLUSH PRIVILEGES;

А если дать GRANT только на рабочую базу данных db.*, то приложение снова не работает - не может найти параметр ХП.

DROP USER 'vladimir'@'%';
CREATE USER 'vladimir'@'%';
SET PASSWORD FOR 'vladimir'@'%' = PASSWORD ('1111');
GRANT SELECT ON db.* TO 'vladimir'@'%';
GRANT EXECUTE ON PROCEDURE db.PROC_USER_GET_INFO TO 'vladimir'@'%';
FLUSH PRIVILEGES;

Это как бы намекает, что нужно дать GRANT на SELECT из какой-то системной БД или таблицы, которая хранит описания ХП.

Вопрос на какую БД или таблицу нужно дать GRANT, чтобы приложение могло считывать заголовки ХП и узнавать параметры ?
Сча попробую выяснить методом тыка :)
...
Рейтинг: 0 / 0
Как ограничить доступ только хранимыми процедурами
    #38700769
Styg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
О, пошел прогресс.

Дать доступ к information_schema не удалось. Не хватило прав. Странно, но да ладно.

Зато дал доступ на mysql.* и все заработало.

DROP USER 'vladimir'@'%';
CREATE USER 'vladimir'@'%';
SET PASSWORD FOR 'vladimir'@'%' = PASSWORD ('1111');

GRANT SELECT ON mysql.* TO 'vladimir'@'%';
GRANT EXECUTE ON PROCEDURE db.PROC_USER_GET_INFO TO 'vladimir'@'%';

FLUSH PRIVILEGES;

Ну осталось теперь методом тыка выяснить к какой именно таблице в БД mysql нужно дать доступ и все вообще будет красиво :)
...
Рейтинг: 0 / 0
Как ограничить доступ только хранимыми процедурами
    #38700776
Styg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Олееее, оле, оле, оле :)

Нужен был доступ к системной таблице mysql.proc

В общем, финальное решение выглядит вот так:

DROP USER 'vladimir'@'%';
CREATE USER 'vladimir'@'%';
SET PASSWORD FOR 'vladimir'@'%' = PASSWORD ('1111');

GRANT SELECT ON mysql.proc TO 'vladimir'@'%';
GRANT EXECUTE ON PROCEDURE db.PROC_USER_GET_INFO TO 'vladimir'@'%';

FLUSH PRIVILEGES;

Спасибо всем, кто участвовал в обсуждении!
...
Рейтинг: 0 / 0
Как ограничить доступ только хранимыми процедурами
    #38700778
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StygДать доступ к information_schema не удалось. Не хватило прав. Странно, но да ладно.Действительно, странно. Обычно по умолчанию он есть, насколько я помню.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как ограничить доступ только хранимыми процедурами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]