Использую MySQL 5.5.8 без SSL...
Все пользователи наделены только привилегией EXECUTE.
Они вызывают хранимые процедуры и функции (SECURITY
DEFINER), созданные под другим пользоваетелем, имеющим
необходимые права на БД и таблицы. Вроде обычно все
так и делают, но в самом начале столкнулся с трудностью.
Хочу дать пользователю менять свой пароль, но если делать
SET PASSWORD = PASSWORD('new_password');
то строка с новым паролем может быть перехвачена, не важно,
сниффером, или администратором БД...
1) Тут сразу лирическое отступление: выражение вида
SELECT PASSWORD('new_password');
выполняется на сервере или все-же libmysql справляется
с этим самостоятельно?
В общем, захотелось написать ХП, принимающий шифрованный
пароль, но тут засада: оба нижеприведенных варианта не
работают!!!
DECLARE strPassHash CHAR(41);
SET strPassHash=...;
1) SET PASSWORD = PASSWORD(strPass);
2) SET PASSWORD = strPassHash;
Конечно, можно прямо в MySQL.User сделать что-то типа
UPDATE mysql.user SET Password=strPassHash
WHERE User=strUserName AND Host=strHostName;
FLUSH PRIVILEGES;
Однако, это возбраняемый хак, а главное, что должно
быть в strHostName?
Например, если в таблице стоит "%", и я, допустим,
подключился с 192.168.0.2 и в mysql.User есть несколько
записей для strUserName как узнать какую из них модифицировать?
Таким образом, я добрел до такого (упрощенно) динамического SQL:
DELIMITER //
DROP PROCEDURE IF EXISTS SET_PASSWORD//
CREATE PROCEDURE SET_PASSWORD(IN NewPassword CHAR(32))
LANGUAGE SQL NOT DETERMINISTIC SQL SECURITY DEFINER COMMENT ''
BEGIN
DECLARE strPass CHAR(41);
SET strPass=PASSWORD(NewPassword);
SET @szSQL_Query=CONCAT("SET PASSWORD='",strPass,"'");
PREPARE SQL_Query FROM @szSQL_Query;
EXECUTE SQL_Query;
DEALLOCATE PREPARE SQL_Query;
END//
DELIMITER ;
Нои тут не обошлось без проблем. Созданная с SECURITY DEFINER,
эта процедура меняет пароль не вызывающего, а создавшего ХП
пользователя. Пришлось поставить SECURITY INVOKER.
Это баг MySQL, или так задумано?
И вообще, как это делается по-нормальному? Как правильно
реализовать защиту от неправильного аргумента (возможно инъекции)?
Как лучше шифровать пароль?
Здравствуйте, mika747, Вы писали:
m> 1) Тут сразу лирическое отступление: выражение вида
m> выполняется на сервере или все-же libmysql справляется
m> с этим самостоятельно?
На сервере. И может быть записано (а потом и прочитано) в бинарный лог.
m> Конечно, можно прямо в MySQL.User сделать что-то типа
m> Однако, это возбраняемый хак, а главное, что должно
m> быть в strHostName?
m> Например, если в таблице стоит "%", и я, допустим,
m> подключился с 192.168.0.2 и в mysql.User есть несколько
m> записей для strUserName как узнать какую из них модифицировать?
CURRENT_USER?
m> И вообще, как это делается по-нормальному?
Использовать SSL.
m> Как правильно реализовать защиту от неправильного аргумента (возможно инъекции)?
Не использовать хранимки для данных целей, а проводить проверку внешними средствами (например, какой-нибудь веб-сервис).
m> Как лучше шифровать пароль?
В файле libmysql/password.c функция make_scrambled_password — там что-то типа "*" + SHA1(SHA1("password"))
Здравствуйте, Anton Batenev, Вы писали:
AB>На сервере. И может быть записано (а потом и прочитано) в бинарный лог.
Понятно.
AB>CURRENT_USER?
За CURRENT_USER отдельное спасибо! Как-то проглядел я его
AB>Использовать SSL.
Знать бы как
Подкиньте ссылочку для начального уровня, пожалуйста. Очень желательно на русском
AB>Не использовать хранимки для данных целей, а проводить проверку внешними средствами (например, какой-нибудь веб-сервис).
Да я и внешними средствами хочу, и в ХП. Дело в том, что сейчас планируется через клиентское ПО на Си, потом, возможно, будет
реализован веб-интерфейс... Хочу по-максимуму все напихать в ХП
AB>В файле libmysql/password.c функция make_scrambled_password — там что-то типа "*" + SHA1(SHA1("password"))
Попробую разобраться...
Спасибо.
Здравствуйте, mika747, Вы писали:
m> AB>Использовать SSL.
m> Знать бы как Подкиньте ссылочку для начального уровня, пожалуйста. Очень желательно на русском
Можно по
официальной документации настроить — там не сложно. Единственное, надо иметь ввиду, что включение SSL ≡ замедление работы