Мдаааа... MySQL-ски потребители, или "тука има, тука нема!"
Поредният случай, в който се убеждавам, че не трябва да разрешавам на близките си приятели да ползват тази бледа имитация на сървър за бази данни

Днес в един момент установих, че на един от сървърите ми има база данни, към която има потребител, на когото НЕ МОГА да сменя паролата, защото MySQL сървърът НЕ ГО НАМИРА в списъка си от акаунти
Такааа... започваме сесията:
roam's console wrote:Script started on Fri Jun 13 23:08:38 2008
Setting up interactive shell params..
[roam@straylight ~]$ mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 38
Server version: 5.0.51a FreeBSD port: mysql-server-5.0.51a
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
Ако някой се интересува, ето пълните настройки на сървъра:
- Spoiler: show
The MySQL server wrote:mysql> \s
--------------
mysql Ver 14.12 Distrib 5.0.51a, for portbld-freebsd6.3 (i386) using 5.2
Connection id: 38
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: /usr/bin/less
Using outfile: ''
Using delimiter: ;
Server version: 5.0.51a FreeBSD port: mysql-server-5.0.51a
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: cp1251
Db characterset: cp1251
Client characterset: cp1251
Conn. characterset: cp1251
UNIX socket: /tmp/mysql.sock
Uptime: 11 hours 52 min 46 sec
Threads: 1 Questions: 190 Slow queries: 0 Opens: 6 Flush tables: 1 Open tables: 5 Queries per second avg: 0.004
--------------
Такаааа... и забавленията започват

Я да видим какво мисли сървърът за потребителя "testowa" (уф, не питайте, имаме си и ние едни програмисти и едни QA-и, не си е работа

)...
The MySQL server wrote:mysql> SHOW GRANTS FOR 'testowa'@'%';
+-------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for testowa@% |
+-------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'testowa'@'%' IDENTIFIED BY PASSWORD '18a2f9611fa3f604' |
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES ON `vily`.* TO 'testowa'@'%' |
+-------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
Аааа-ха. Значи ако има акаунт "testowa", той има право да си играе с две от базите. Я да видим имаме ли изобщо такъв акаунт? (в спойлер, че редът със заглавието е малко дългичък)
- Spoiler: show
The MySQL server wrote:mysql> SELECT * FROM mysql.user WHERE user = 'testowa';
+------+---------+------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+
| Host | User | Password | Select_priv | Insert_priv | Update_priv | Delete_priv | Create_priv | Drop_priv | Reload_priv | Shutdown_priv | Process_priv | File_priv | Grant_priv | References_priv | Index_priv | Alter_priv | Show_db_priv | Super_priv | Create_tmp_table_priv | Lock_tables_priv | Execute_priv | Repl_slave_priv | Repl_client_priv | ssl_type | ssl_cipher | x509_issuer | x509_subject | max_questions | max_updates | max_connections |
+------+---------+------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+
| % | testowa | 18a2f9611fa3f604 | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | | | | | 0 | 0 | 0 |
+------+---------+------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+
1 row in set (0.00 sec)
Имаме нещо такова, да.
Следващите две-три заявки може да ви се видят малко странни ("откъде ли пък му хрумна да прави *такива* неща?"), но потърпете, смисъл има

Я да видим все пак *точно* откъде може да се върже някой с този акаунт?
The MySQL server wrote:mysql> SELECT Host, User FROM mysql.user WHERE User = 'testowa';
+------+---------+
| Host | User |
+------+---------+
| % | testowa |
+------+---------+
1 row in set (0.00 sec)
mysql> SELECT Host = '%', User FROM mysql.user WHERE User = 'testowa';
+------------+---------+
| Host = '%' | User |
+------------+---------+
| 1 | testowa |
+------------+---------+
1 row in set (0.00 sec)
"Aaaaand now, ladies and gentlemen, the moment you've all been waiting for!" В таблицата mysql.user има ред, в който User = "testowa", и за този ред изразът Host = "%" има стойност 1, демек верно, истина ти казвам! И тогава...
...тогава...
...тогава КАКВО, ПО ДЯВОЛИТЕ, ЗНАЧИ ТОВА?!
The MySQL server wrote:mysql> SELECT Host = '%', User FROM mysql.user WHERE User = 'testowa' AND Host = '%';
Empty set (0.00 sec)
И, да, заявката, от която тръгна всичко:
The MySQL server wrote:mysql> SET PASSWORD FOR 'testowa'@'%' = PASSWORD('foo');
ERROR 1133 (42000): Can't find any matching row in the user table

:<
Ами... това беше. Сървърът си играе с акаунтите на "тука има, тука нема". И, да, ако се чудите, този акаунт *може* да се свърже със сървъра с досегашната си парола. И, не, НЕ МОЖАХ да пресъздам такава ситуация с новосъздадена база и нов акаунт за нея. Нямам представа точно как се е стигнало дотук, но самият факт, че *може* да се стигне до ситуация, в която потребител може да се свърже със сървъра, а администраторът НЕ МОЖЕ да му смени паролата... ами, как да ви кажа, не ми харесва
И, да, знам, че мога да направя някоя щуротия като "UPDATE mysql.user SET `Password` = PASSWORD('foo') WHERE User = 'testowa' AND Host LIKE '_'; FLUSH PRIVILEGES;"... ама... как да ви кажа... ЗАЩО Е НУЖНО?!
