請教一個 mysql 的 user 權限問題

edited 十月 2013 in 伺服器環境
我的 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 端的訪客盜取呢?

原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=590

評論

  • edited 六月 2005
    A1. 看了一下確實有這種情形,可以將mysql資料表中一筆只有指定位置為localhost而沒有帳號、密碼的資料刪除,這個權限設定意味著從本機可以透過任何帳號、密碼登入;Appserv一般用於測試環境建置,並不建議以此架設的網站對外正式經營。

    A2. 只有在伺服器安全出問題時才會被盜取,因為直接透過瀏覽器存取一般都只會取得結果。
  • edited 六月 2005
    我利用 PHPMYADMIN 介面的權限去看 USER1 發現其除了一些基本的權限如 SELECT , UPDATE , INSERT...等並無系統管理的權限啊...Why???

    我上文舉的 USER1 帳戶是我自己後來新增的,主要用來做為BLOG登入與連線資料庫專用,
    請問我該怎麼下指令才能讓 USER1 無權更改與查詢 MYSQL 這一個 DATABASE ,尤其是其下的 USER 這一個重要的 TABLE ...如下正確嗎?

    grant all on myblog.* to [email protected] identified by '12345';
  • edited 六月 2005
    原因在圖中那一筆資料,你可以用其他根本不存在的帳號、密碼測試,只要從本機登入,任何帳號都可以存取所有權限
  • edited 六月 2005
    可是我已將 User , Password 值為空字串的都刪除了!
    以我的 user 表來看,僅剩下兩筆資料亦即: root 與 user1

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

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

    照理說, user1 應該連:
    use mysql;
    select * from user;
    都作不了的...,不是嗎?
  • edited 六月 2005
    有沒有重新啟動呢?
  • edited 六月 2005
    當然有,可見您也覺得正常不會如此是嗎?

    我不管是下 flush privileges 指令,或者直接停掉再重啟動 mysql 皆一樣的結果!

    上文說過的被入侵一事不知有無關係?
    我原先檢查過了,只發現其改掉我的 root 密碼而已,倒是沒有刪我的資料...

    以下列出最終 user 表的查詢結果:
    file

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

    其次是 user1 根本就無"系統管理"的相關權限,而我上文也說過其權限僅限制在 mtblog.* 的所有資料表...真不知為何以 user1 登入 MySQL 後竟還可以改掉 root 的密碼???
  • edited 六月 2005
    appserv v2.5.x是否有這樣問題我不確定,但是我的環境中(appserv v2.4.x)在做了上述動作後,已經沒有你提到的問題

    你不妨把該使用者也刪除,然後測試看看還能否登入?如果不能就再新增同樣的帳號、密碼與權限再試一次。

    只是網站被逛過,其實哪些地方被改就沒有一定了。
  • edited 六月 2005
    Anyway,thanks a lot!
  • edited 六月 2005
    以下是我找到的答案,順便 post 上來給有同樣問題的人參考.
    ==========================================
    mysql.user table 裡的 priv 屬於 global level 權限,意謂可以針
    對server上的任何一個資料庫!!!

    而這也就是為何我以 user1 登入 MySQL 後竟還可以改掉 root 的密碼.
    而我原先執行過的權限設定:
    grant all on 資料庫.* to [email protected] identified by '密碼';
    並不會去動到 global level 的權限! 也就是 user 表中關於 user1 的所有 *_priv 欄位的值 "Y" 可能就是被入侵者改過的...


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

    grant select on myblog.* to [email protected] identified by '12345';
    只會變更 db level 權限, 並記錄在mysql.db! 另外,如原本即無此使用者
    user table 會預設 priv 欄位值皆為'N'喔!
    --
    權限的 level 總共有:
    global, db, table, column, Routine level
  • edited 六月 2005
    再請教一下:

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

    REVOKE ALL PRIVILEGES, GRANT OPTION FROM usera;
    ....不知我有無會錯意??




    Q2:
    drop user usera; ==>錯誤:Operation DROP USER failed for 'usera'@'%'
    drop user 'usera'; ==>錯誤同上
    到底需不需要單引號呢?

    drop user 'usera'@'localhost'; ==>錯誤同上




    Q3:
    delete from user,db where user.user=db.user and user.user='usera';
    ==>
    錯誤:You have an error in your SQL syntax;check the manual that corresponds to your MySQL server version for the right syntax to use near 'where user.user=db.user and user.user='usera'' at line 1

    ...
    我是用root進入,分別執行上述權限就出錯了,但書上是可以的!...還是我哪個動作有問題?




    Q4:
    如果把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 '帳號';的效果有何差別?
  • edited 六月 2005
    A1. 沒有在用

    A2. 要不要把MYSQL資料表的資料挖出來看看啊,語法看不到問題

    A3. 這樣子好像就可以了
    mysql> delete user from user, db where user.user = db.user and user.user = 'egroupware';
    

    但是mysql.db.egroupware好像還是在....

    A4. 一樣,後者比較方便而已。
  • edited 六月 2005
    呼! 總算搞清楚了...

    A2-1:
    少加了主機名稱與單引號如下:
    REVOKE ALL PRIVILEGES ON *.* FROM 'usera'@'localhost';

    ...因為使用者對於連入位置是可以有差別的,若不輸入則視為 @'%' ,也就是任何連入位置皆可.
    在我的 user 表中 usera 並無對應到空字串''或'%',所以才會出現錯誤訊息:
    There is no such grant defined for user 'usera' on host '%'


    A2-2:
    關於單引號的使用時機(以下是我在網上查到的資訊,但無法百分百確定):

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



    ====================================================================================
    A3:
    因為複數 table 必定要"指明"要對哪些 table 或全部來做刪除,所以:
    delete from user,db where user.user=db.user and user.user='egroupware';

    改成

    delete user,db from user, db where user.user=db.user and user.user='egroupware';

    或者

    DELETE FROM user,db USING user,db WHERE user.user=db.user AND user.user='egroupware';

    就沒問題了.



    ====================================================================================
    A4:
    關於刪除帳戶 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 [email protected](或其他明確主機名);

    B.刪除(方法)

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

    b2. drop user [email protected];
    (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 [email protected];
Sign In or Register to comment.