程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> MySQL安全性指南(3)(轉)

MySQL安全性指南(3)(轉)

編輯:關於MYSQL數據庫
2.4 不用GRANT設置用戶
如果你有一個早於3.22.11的MySQL版本,你不能使用GRANT(或REVOKE)語句設置用戶及其訪問權限,但你可以直接修改授權表的內容。如果你理解GRANT語句如何修改授權表,這很容易。那麼你通過手工發出INSERT語句就能自己做同樣的事情。

當你發出一條GRANT語句時,你指定一個用戶名和主機名,可能還有口令。對該用戶生成一個user表記錄,並且這些值記錄在User、Host和Password列中。如果你在GRANT語句中指定全局權限,這些權限記錄在記錄的權限列中。其中要留神的是GRANT語句為你加密口令,而INSERT不是,你需要在INSERT中使用PASSWord()函數加密口令。

如果你指定數據庫級權限,用戶名和主機名被記錄在db表的User和Host列。你為其授權的數據庫記錄在Db列中,你授予的權限記錄在權限列中。

對於表級和列級權限,效果是類似的。在tables_priv和columns_priv表中創建記錄以記錄用戶名、主機名和數據庫,還有相關的表和列。授予的權限記錄在權限列中。

如果你還記得前面的介紹,你應該能即使不用GRANT語句也能做GRANT做的事情。記住在你直接修改授權表時,你將通知服務器重載授權表,否則他不知道你的改變。你可以執行一個mysqladmin flush-privileges或MySQLadmin reload命令強迫一個重載。如果你忘記做這個,你會疑惑為什麼服務器不做你想做的事情。

下列GRANT語句創建一個擁有所有權的超級用戶。包括授權給別人的能力:

GRANT ALL ON *.* TO anyname@localhost IDENTIFIED BY "passwd"
    WITH GRANT OPTION
該語句將在user表中為anyname@localhost創建一個記錄,打開所有權限,因為這裡是超級用戶(全局)權限存儲的地方,要用INSERT語句做同樣的事情,語句是:

INSERT INTO user  VALUES("localhost","anyname",PASSWord("passwd"),
    "Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y")
你可能發現它不工作,這要看你的MySQL版本。授權表的結構已經改變而且你在你的user表可能沒有14個權限列。用SHOW COLUMNS找出你的授權表包含的每個權限列,相應地調整你的INSERT語句。 下列GRANT語句也創建一個擁有超級用戶身份的用戶,但是只有一個單個的權限:

GRANT RELOAD ON *.* TO flush@localhost IDENTIFIED BY "flushpass"
本例的INSERT語句比前一個簡單,它很容易列出列名並只指定一個權限列。所有其它列將設置為缺省的"N":

INSERT INTO user (Host,Password,Reload) VALUES("localhost","flush",PASSWord("flushpass"),"Y")
數據庫級權限用一個ON db_name.*子句而不是ON *.*進行授權:

GRANT ALL ON sample.* TO boris@localhost IDENTIFIED BY "ruby"
這些權限不是全局的,所以它們不存儲在user表中,我們仍然需要在user表中創建一條記錄(使得用戶能連接),但我們也需要創建一個db表記錄記錄數據庫集權限:

INSERT INTO user (Host,User,Password) VALUES("localhost","boris",PASSWord("ruby"))

INSERT INTO db VALUES("localhost","sample_db","boris","Y","Y","Y","Y","Y","Y","N","Y","Y","Y")

"N"列是為GRANT權限;對末尾的一個數據庫級具有WITH GRANT OPTION的GRANT語句,你要設置該列為"Y"。

要設置表級或列級權限,你對tables_priv或columns_priv使用INSERT語句。當然,如果你沒有GRANT語句,你將沒有這些表,因為它們在MySQL中同時出現。如果你確實有這些表並且為了某些原因想要手工操作它們,要知道你不能用單獨的列啟用權限。

你設置tables_priv.Table_priv或columns_priv.Column_priv列來設置包含你想啟用的權限值。例如,要對一個表啟用SELECT和INSERT權限,你要在相關的tables_priv的記錄中設置Table_priv為"Select,Insert"。

如果你想對一個擁有MySQL賬號的用戶修改權限,使用UPDATE而不是INSERT,不管你增加或撤銷權限都是這樣。要完全刪除一個用戶,從用戶使用的每個表中刪除記錄。

如果你願意避免發一個查詢來直接修改全權表,你可以看一下MySQL自帶的mysqlAccess和MySQL_setpermissions腳本。



附錄1 小測驗
在你剛剛新安裝了一個MySQL服務器,在你增加了一個允許連接MySQL的用戶,用下列語句:

GRANT ALL ON samp_db.* TO fred@*.snake.Net
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved