【求助】請教一個 mysql 的 user 權限問題



贊助商連結


b90220208
2005-06-01, 08:30 PM
我的 server 環境是:
xp pro + appserv v2.5.1(mysql4,php5..)

由於剛安裝完 appserv ,所以想改變 root 的密碼.
但在 xp 的文字命令模式下執行:
mysql -u user1 -p
後卻發現以 user1(非 root 帳戶)登入資料庫後,我竟然可"查詢"與"修改" database: mysql 的資料表,例如:
use mysql;
update user set password=password('12345') where user='root';

ps. user1 只是一般帳戶

----------------------------------------------------------------------------------------------
Q1:
請問這正常嗎...如此豈不很危險!?

Q2:
另外想請教 server side 的 *.php 在什麼情況下會被盜取?
是否完全無法被 client 端的訪客盜取呢?

贊助商連結


阿 土
2005-06-01, 10:35 PM
Appserv 預設權限本就是如此
你可進入 phpMyAdmin 點選 "權限" 去修改

或參考這篇文章去修改:
http://sfs.tceb.edu.tw/file/AppServ.htm

ps:這篇文張貼到防毒/防駭版有點不適當 , 應該扯不上關係吧

b90220208
2005-06-03, 01:13 AM
哪尼!
您是說 APPSERV 預設可讓其他帳戶去查詢與更改 ROOT 的密碼...這是真的嗎??


我利用 PHPMYADMIN 介面的權限去看 USER1 發現其除了一些基本的權限如 SELECT , UPDATE , INSERT...等並無系統管理的權限啊...Why???

我上文舉的 USER1 帳戶是我自己後來新增的,主要用來做為BLOG登入與連線資料庫專用,當初設定如下:
grant all on myblog.* to user1@localhost identified by '12345';
實在搞不懂為何其有那麼大的權限...還是我指令下的不周全呢?

===========================================
我剛剛試了一下發現即便下了以下權限指令:
grant select on myblog.* to user1@localhost identified by '12345';

user1 仍然可以更改 root 的密碼!.....Why???
我不是已經限定 user1 的權限只有在 myblog.* 了嗎...為何其可去動到位於mysql 資料庫中的 user 資料表裡的 root 的資料呢???

b90220208
2005-06-03, 02:32 PM
我已將 User , Password 值為空字串的都刪除了!
以我的 user 表來看,僅剩下兩筆資料亦即: root 與 user1

=========================================
我剛剛試了一下發現即便下了以下權限指令:
grant select on myblog.* to user1@localhost identified by '12345';

且資料庫有重新啟動,只是
user1 仍然可以更改 root 的密碼!
我明明已經限定 user1 的權限只有在 myblog.* ,為何其仍可去動到位於mysql 資料庫中的 user 資料表裡的 root 的密碼呢 ???

照理說, user1 應該連:
use mysql;
select * from user;
都作不了的...,不是嗎?


以下列出最終 user 表的查詢結果:
file (http://home.pchome.com.tw/family/b90220208//user.html)

首先,我上文的權限設定指令只給了user1 "select" 的權限,但此查詢結果的 user1 根本就天差地遠地多了許多權限.

其次是 user1 根本就無"系統管理"的相關權限,而我上文也說過其權限僅限制在 mtblog.* 的所有資料表...真不知為何以 user1 登入 MySQL 後竟還可以改掉 root 的密碼???

b90220208
2005-06-04, 06:33 PM
以下是我找到的答案,順便post上來給有同樣問題的人參考.
===================================
mysql.user table 裡的 priv 屬於 global level 權限,意謂可以針
對server上的任何一個資料庫!!!

可以用
REVOKE ALL PRIVILEGES ON *.* FROM user
來移除所有 global level 權限

grant select on myblog.* to user1@localhost identified by '12345';
只會變更 db level 權限, 並記錄在mysql.db! 另外,如原本即無此使用者
user table 會預設 priv 欄位值皆為'N'喔!
--
權限的 level 總共有:
global, db, table, column, Routine level

b90220208
2005-06-04, 06:54 PM
大致上有較了解了,再請教一些事以確定我的觀念正確與否.....感激不盡!


Q1:
在 user 表中的欄位 *_priv (如 Select_priv) 是否都算是 global level 權限?


Q2:
若是,
則執行 grant all on 論壇.* to 帳戶@localhost identified by '密碼';
是否只會變更db level 權限, 並記錄在 mysql.db,亦即如此做並不會有 global level 權限的安全性問題?

也就是執行 grant all on 論壇.* to 帳戶@localhost identified by '密碼';
與 user 表中的欄位 *_priv 之值無關?


Q3:
若是,
請問執行 grant all on 論壇.* to 帳戶@localhost identified by '密碼';
後,在 user 表中的所有 *_priv 欄位的值是 "Y" 或 "N" 呢?


Q4:
請教如設定與更改某帳戶的 global level 權限 ?


Q5:
該如何完整刪除某個已存在帳戶呢?

b90220208
2005-06-06, 01:08 PM
A1:yes
A2:yes,yes
A3:user中的*_priv預設都會為N
A4:以root權限進入作設定,如:grant select on *.* to 帳號@localhost;
A5:
以root權限進入:
DROP USER user;
或者
delete from user where user.user='帳號';
delete from db where db.user='帳號';

b90220208
2005-06-06, 06:05 PM
嗯,再請教:

Q1:
如果把MYSQL資料庫中的資料表:user,db,user_info,tables_priv,procs_priv,columns_priv中的User欄位有欲刪除帳號的資料逐一刪除如下:
delete from user where user='帳號';
...
...
delete from columns_priv where user='帳號';

如此與DROP USER '帳號';的效果有何差別?


Q2:
官網有提到:自MySQL 4.1.2後可以如下指令完整刪除包含---
all global, database-, table-, and column-level privileges 的帳戶:

REVOKE ALL PRIVILEGES, GRANT OPTION FROM usera;

....為怕我會錯意,想先確定再來執行,謝謝!

b90220208
2005-06-07, 01:55 AM
自問自答:

a1:
一樣,後者比較方便!

至於 DROP USER 有幾點要注意:
"5.0.1版本以前"只能 drop 沒有任何權限的 user ,所以要先用以下指令移除權限:
REVOKE ALL PRIVILEGES, GRANT OPTION FROM usera@localhost;
再執行:
DROP USER usera@localhost;


a2:
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user1@localhost;
以上的指令做完後,只需再做完如下指令就完成刪除user1的所有工作!
DELETE FROM USER WHERE USER='user1';

b90220208
2005-06-08, 12:11 AM
:) 關於單引號的使用時機(以下是我在網上查到的資訊,但無法百分百確定):

->單引號問題只有在例如:'USER-1'@'%'才需強制加上.
帳戶若無"-",主機若無"-"或"%"則可加可不加.




:circle: 關於刪除帳戶 usera 我做了以下整理:

------------------------------------------------------------------
首先釐清:
下行指令只會移除 usera 的所有 global權限
(亦即位於 mysql.user 表中的所有權限欄位設定)
REVOKE ALL PRIVILEGES ON *.* FROM 'usera'@'localhost'

------------------------------------------------------------------
若要完整刪除帳戶 usera (亦即包含'該帳戶資料'及'所有表相關的權限設定'),自從
MySQL v4.1.2 後,有以下 3 個方法可用:


1.先移除權限再刪除

A.移除權限(all global, database-, table-, and column-level privileges)
.如果user資料表的Host為%
REVOKE ALL PRIVILEGES, GRANT OPTION FROM usera;

.否則(方法)
revoke all privileges ,grant option from usera@localhost(或其他明確主機名);

B.刪除(方法)

b1. DELETE FROM USER WHERE USER='usera';

b2. drop user usera@localhost;
(5.0.1版本以前只能 drop 沒有任何權限的 user ,所以須先執行上述 [A.移除權限] 之步驟)
(若版本 >= 5.0.1 ,則建議採用下述的方法3較快)



2.直接刪除 (較麻煩,需逐一刪除 user,db,user_info,tables_priv,procs_priv,columns_priv
表中的資料與權限設定)

delete from user where user='usera';
...
...
delete from columns_priv where user='usera';



3."一步"即搞定刪除一個帳戶之所有工作(需要在5.0.1及以上版本)
drop user usera@localhost;