1、前言
MySQL 是完全網路化的跨平台關係型資料庫系統,同時是具有客戶機/伺服器體繫結構的分散式資料庫管理系統。它具有功能強、使用簡便、管理方便、運行速度快、安全可靠性強等優點,使用者可利用許多語言編寫訪問MySQL 資料庫的程式,特別是與PHP更是黃金組合,運用十分廣泛。
由於MySQL是多平台的資料庫,它的預設配置要考慮各種情況下都能適用,所以在我們自己的使用環境下應該進行進一步的安全強化。作為一個MySQL的系統管理員,我們有責任維護MySQL資料庫系統的資料安全性和完整性。
MySQL資料庫的安全配置必須從兩個方面入手,系統內部安全和外部網路安全,另外我們還將簡單介紹編程時要注意的一些問題以及一些小竅門。
2、系統內部安全
首先簡單介紹一下MySQL資料庫目錄結構。MySQL安裝好,運行了mysql_db_install指令碼以後就會建立資料目錄和初始化資料庫。如果我們用MySQL源碼包安裝,而且安裝目錄是/usr/local/mysql,那麼資料目錄一般會是/usr/local/mysql/var。資料庫系統由一系列資料庫組成,每個資料庫包含一系列資料庫表。MySQL是用資料庫名在資料目錄建立建立一個資料庫目錄,各資料庫表分別以資料庫表名作為檔案名稱,副檔名分別為MYD、MYI、frm的三個檔案放到資料庫目錄中。
MySQL的授權表給資料庫的訪問提供了靈活的許可權控制,但是如果本機使用者擁有對庫檔案的讀許可權的話,攻擊者只需把資料庫目錄打包拷走,然後拷到自己原生資料目錄下就能訪問竊取的資料庫。所以MySQL所在的主機的安全性是最首要的問題,如果主機不安全,被攻擊者控制,那麼MySQL的安全性也無從談起。其次就是資料目錄和資料檔案的安全性,也就是使用權限設定問題。
從MySQL主站一些老的binary發行版來看,3.21.xx版本中資料目錄的屬性是775,這樣非常危險,任何本機使用者都可以讀資料目錄,所以資料庫檔案很不安全。3.22.xx版本中資料目錄的屬性是770,這種屬性也有些危險,本地的同組使用者既能讀也能寫,所以資料檔案也不安全。3.23.xx版本資料目錄的屬性是700,這樣就比較好,只有啟動資料庫的使用者可以讀寫資料庫檔案,保證了本機資料檔案的安全。
如果啟動MySQL資料庫的使用者是mysql,那麼象如下的目錄和檔案的是安全的,請注意資料目錄及下面的屬性:
shell>ls -l /usr/local/mysql
total 40
drwxrwxr-x 2 root root 4096 Feb 27 20:07 bin
drwxrwxr-x 3 root root 4096 Feb 27 20:07 include
drwxrwxr-x 2 root root 4096 Feb 27 20:07 info drwxrwxr-x 3 root root 4096 Feb 27 20:07 lib drwxrwxr-x 2 root root 4096 Feb 27 20:07 libexec drwxrwxr-x 3 root root 4096 Feb 27 20:07 man drwxrwxr-x 6 root root 4096 Feb 27 20:07 mysql-test drwxrwxr-x 3 root root 4096 Feb 27 20:07 share drwxrwxr-x 7 root root 4096 Feb 27 20:07 sql-bench drwx------ 4 mysql mysql 4096 Feb 27 20:07 var
shell>ls -l /usr/local/mysql/var
total 8
drwx------ 2 mysql mysql 4096 Feb 27 20:08 mysql
drwx------ 2 mysql mysql 4096 Feb 27 20:08 test
shell>ls -l /usr/local/mysql/var/mysql
total 104
-rw------- 1 mysql mysql 0 Feb 27 20:08 columns_priv.MYD
-rw------- 1 mysql mysql 1024 Feb 27 20:08 columns_priv.MYI
-rw------- 1 mysql mysql 8778 Feb 27 20:08 columns_priv.frm
-rw------- 1 mysql mysql 302 Feb 27 20:08 db.MYD
-rw------- 1 mysql mysql 3072 Feb 27 20:08 db.MYI
-rw------- 1 mysql mysql 8982 Feb 27 20:08 db.frm
-rw------- 1 mysql mysql 0 Feb 27 20:08 func.MYD
-rw------- 1 mysql mysql 1024 Feb 27 20:08 func.MYI
-rw------- 1 mysql mysql 8641 Feb 27 20:08 func.frm
-rw------- 1 mysql mysql 0 Feb 27 20:08 host.MYD
-rw------- 1 mysql mysql 1024 Feb 27 20:08 host.MYI
-rw------- 1 mysql mysql 8958 Feb 27 20:08 host.frm
-rw------- 1 mysql mysql 0 Feb 27 20:08 tables_priv.MYD
-rw------- 1 mysql mysql 1024 Feb 27 20:08 tables_priv.MYI
-rw------- 1 mysql mysql 8877 Feb 27 20:08 tables_priv.frm
-rw------- 1 mysql mysql 428 Feb 27 20:08 user.MYD
-rw------- 1 mysql mysql 2048 Feb 27 20:08 user.MYI
-rw------- 1 mysql mysql 9148 Feb 27 20:08 user.frm
如果這些檔案的屬主及屬性不是這樣,請用以下兩個命令修正之:
shell>chown -R mysql.mysql /usr/local/mysql/var
shell>chmod -R go-rwx /usr/local/mysql/var
用root使用者啟動遠程服務一直是安全大忌,因為如果服務程式出現問題,遠程攻擊者極有可能獲得主機的完全控制權。MySQL從3.23.15版本開始時作了小小的改動,預設安裝後服務要用mysql使用者來啟動,不允許root使用者啟動。如果非要用root使用者來啟動,必須加上--user=root的參數(./safe_mysqld --user=root &)。因為MySQL中有LOAD DATA INFILE和SELECT ... INTO OUTFILE的SQL語句,如果是root使用者啟動了MySQL伺服器,那麼,資料庫使用者就擁有了root使用者的寫入權限。不過MySQL還是做了一些限制的,比如LOAD DATA INFILE只能讀全域可讀的檔案,SELECT ... INTO OUTFILE不能覆蓋已經存在的檔案。 本地的記錄檔也不能忽視,包括shell的日誌和MySQL自己的日誌。有些使用者在本地登陸或備份資料庫的時候為了圖方便,有時會在命令列參數裡直接帶了資料庫的密碼,如: shell>/usr/local/mysql/bin/mysqldump -uroot -ptest test>test.sql shell>/usr/local/mysql/bin/mysql -uroot -ptest 這些命令會被shell記錄在曆史檔案裡,比如bash會寫入使用者目錄的.bash_history檔案,如果這些檔案不慎被讀,那麼資料庫的密碼就會泄漏。使用者登陸資料庫後執行的SQL命令也會被MySQL記錄在使用者目錄的.mysql_history檔案裡。如果資料庫使用者用SQL語句修改了資料庫密碼,也會因.mysql_history檔案而泄漏。所以我們在shell登陸及備份的時候不要在-p後直接加密碼,而是在提示後再輸入資料庫密碼。
另外這兩個檔案我們也應該不讓它記錄我們的操作,以防萬一。
shell>rm .bash_history .mysql_history
shell>ln -s /dev/null .bash_history
shell>ln -s /dev/null .mysql_history
上門這兩條命令把這兩個檔案連結到/dev/null,那麼我們的操作就不會被記錄到這兩個檔案裡了。
3、外部網路安全
MySQL資料庫安裝好以後,Unix平台的user表是這樣的:
mysql> use mysql;
Database changed
mysql> select Host,User,Password,Select_priv,Grant_priv from user;
+-----------+------+----------+-------------+------------+
| Host | User | Password | Select_priv | Grant_priv |
+-----------+------+----------+-------------+------------+
| localhost | root | | Y | Y |
| redhat | root | | Y | Y |
| localhost | | | N | N |
| redhat | | | N | N |
+-----------+------+----------+-------------+------------+
4 rows in set (0.00 sec)
Windows平台的user表是這樣的:
mysql> use mysql;
Database changed
mysql> select Host,User,Password,Select_priv,Grant_priv from user;
+-----------+------+----------+-------------+------------+
| Host | User | Password | Select_priv | Grant_priv |
+-----------+------+----------+-------------+------------+
| localhost | root | | Y | Y |
| % | root | | Y | Y |
| localhost | | | Y | Y |
| % | | | N | N |
+-----------+------+----------+-------------+------------+
4 rows in set (0.00 sec) 我們先來看Unix平台的user表。其中redhat只是我實驗機的機器名,所以實際上Unix平台的MySQL預設只允許本機才能串連資料庫。但是預設root使用者口令是空,所以當務之急是給root使用者加上口令。給資料庫使用者加口令有三種方法: 1)在shell提示符下用mysqladmin命令來改root使用者口令:
shell>mysqladmin -uroot password test 這樣,MySQL資料庫root使用者的口令就被改成test了。(test只是舉例,我們實際使用的口令一定不能使用這種易猜的弱口令)
2)用set password修改口令:
mysql> set password for root
localhost=password(‘test‘);
這時root使用者的口令就被改成test了。
3)直接修改user表的root使用者口令:
mysql> use mysql;
mysql> update user set password=password(‘test‘) where user=‘root‘;
mysql> flush privileges;
這樣,MySQL資料庫root使用者的口令也被改成test了。其中最後一句命令flush privileges的意思是強制重新整理記憶體授權表,否則用的還是緩衝中的口令,這時非法使用者還可以用root使用者及空口令登陸,直到重啟MySQL伺服器。
我們還看到user為空白的匿名使用者,雖然它在Unix平台下沒什麼許可權,但為了安全起見我們應該刪除它:
mysql> delete from user where user=‘‘;
Windows版本MySQL的user表有很大不同,我們看到Host欄位除了localhost還有是%。這裡%的意思是允許任意的主機串連MySQL伺服器,這是非常不安全的,給攻擊者造成可乘之機,我們必須刪除Host欄位為%的記錄:
mysql>delete from user where host=‘%‘;
預設root使用者的空密碼也是必須修改,三種修改方法和Unix平台一樣。
我們注意到Host欄位為localhost的匿名使用者擁有所有的許可權!就是說本機使用者用空的使用者名稱和空的口令登陸MySQL資料庫伺服器可以得到最高的許可權!所以匿名使用者必須刪除!
mysql> delete from user where user=‘‘;
對user表操作以後不要忘了用flush privileges來強制重新整理記憶體授權表,這樣才會生效。
預設安裝的Windows版MySQL存在的不安全因素太多,我們在安裝後一定要進一步配置!
MySQL的5個授權表:user, db, host, tables_priv和columns_priv提供非常靈活的安全機制,從MySQL 3.22.11開始引入了兩條語句GRANT和REVOKE來建立和刪除使用者權限,可以方便的限制哪個使用者可以串連伺服器,從哪裡串連以及串連後可以做什麼操作。作為MySQL管理員,我們必須瞭解授權表的意義以及如何用GRANT和REVOKE來建立使用者、授權和撤權、刪除使用者。 在3.22.11版本以前的MySQL授權機制不完善,和新版本也有較大的不同,建議升級到最新版本的MySQL。(本書的操作例子是以MySQL 3.23.49為樣本)我們先來瞭解授權表的結構。
1)MySQL授權表的結構與內容:
mysql> desc user;
+-----------------+-----------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------------+-----------------+------+-----+---------+-------+
| Host | char(60) binary | | PRI | | |
| User | char(16) binary | | PRI | | |
| Password | char(16) binary | | | | |
| Select_priv | enum(‘N‘,‘Y‘) | | | N | |
| Insert_priv | enum(‘N‘,‘Y‘) | | | N | |
| Update_priv | enum(‘N‘,‘Y‘) | | | N | |
| Delete_priv | enum(‘N‘,‘Y‘) | | | N | |
| Create_priv | enum(‘N‘,‘Y‘) | | | N | |
| Drop_priv | enum(‘N‘,‘Y‘) | | | N | |
| Reload_priv | enum(‘N‘,‘Y‘) | | | N | |
| Shutdown_priv | enum(‘N‘,‘Y‘) | | | N | |
| Process_priv | enum(‘N‘,‘Y‘) | | | N | |
| File_priv | enum(‘N‘,‘Y‘) | | | N | |
| Grant_priv | enum(‘N‘,‘Y‘) | | | N | |
| References_priv | enum(‘N‘,‘Y‘) | | | N | |
| Index_priv | enum(‘N‘,‘Y‘) | | | N | |
| Alter_priv | enum(‘N‘,‘Y‘) | | | N | |
+-----------------+-----------------+------+-----+---------+-------+
17 rows in set (0.01 sec)
user表是5個授權表中最重要的一個,列出可以串連伺服器的使用者及其加密口令,並且它指定他們有哪種全域(超級使用者)許可權。在user表啟用的任何許可權均是全域許可權,並適用於所有資料庫。所以我們不能給任何使用者訪問mysql.user表的許可權!
許可權說明:
+-----------+-------------+-----------------------------------------------------------------------+
| 許可權指定符| 列名 |許可權操作 |
+-----------+-------------+-----------------------------------------------------------------------+
| Select | Select_priv | 允許對錶的訪問,不對資料表進行訪問的select語句不受影響,比如select 1+1| +-----------+-------------+-----------------------------------------------------------------------+
| Insert | Insert_priv | 允許對錶用insert語句進行寫入操作。 | +-----------+-------------+-----------------------------------------------------------------------+
| Update | Update_priv | 允許用update語句修改表中現有記錄。 | +-----------+-------------+-----------------------------------------------------------------------+ | Delete | Delete_priv | 允許用delete語句刪除表中現有記錄。 | +-----------+-------------+-----------------------------------------------------------------------+ | Create | Create_priv | 允許建立新的資料庫和表。 | +-----------+-------------+-----------------------------------------------------------------------+
| Drop | Drop_priv | 允許刪除現有的資料庫和表。 |
+-----------+-------------+-----------------------------------------------------------------------+
| Index | Index_priv | 允許建立、修改或刪除索引。 |
+-----------+-------------+-----------------------------------------------------------------------+
| Alter | Alter_priv | 允許用alter語句修改表結構。 |
+-----------+-------------+-----------------------------------------------------------------------+
| Grant | Grant_priv | 允許將自己擁有的許可權授予其它使用者,包括grant。 |
+-----------+-------------+-----------------------------------------------------------------------+
| Reload | Reload | 允許重載授權表,重新整理伺服器等命令。 |
+-----------+-------------+-----------------------------------------------------------------------+
| Shutdown | Shudown_priv| 允許用mysqladmin shutdown命令關閉MySQL伺服器。該許可權比較危險, |
| | | 不應該隨便授予。 |
+-----------+-------------+-----------------------------------------------------------------------+
| Process | Process_priv| 允許查看和終止MySQL伺服器正在啟動並執行線程(進程)以及正在執行的查詢語句 |
| | | ,包括執行修改密碼的查詢語句。該許可權比較危險,不應該隨便授予。 |
+-----------+-------------+-----------------------------------------------------------------------+ | File | File_priv | 允許從伺服器上讀全域可讀檔案和寫檔案。該許可權比較危險,不應該隨便授予。| +-----------+-------------+-----------------------------------------------------------------------+
mysql> desc db;
+-----------------+-----------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra |
+-----------------+-----------------+------+-----+---------+-------+ | Host | char(60) binary | | PRI | | | | Db | char(64) binary | | PRI | | |
| User | char(16) binary | | PRI | | |
| Select_priv | enum(‘N‘,‘Y‘) | | | N | | | Insert_priv | enum(‘N‘,‘Y‘) | | | N | | | Update_priv | enum(‘N‘,‘Y‘) | | | N | |
| Delete_priv | enum(‘N‘,‘Y‘) | | | N | |
| Create_priv | enum(‘N‘,‘Y‘) | | | N | |
| Drop_priv | enum(‘N‘,‘Y‘) | | | N | |
| Grant_priv | enum(‘N‘,‘Y‘) | | | N | |
| References_priv | enum(‘N‘,‘Y‘) | | | N | |
| Index_priv | enum(‘N‘,‘Y‘) | | | N | |
| Alter_priv | enum(‘N‘,‘Y‘) | | | N | |
+-----------------+-----------------+------+-----+---------+-------+
13 rows in set (0.01 sec)
db表列出資料庫,而使用者有許可權訪問它們。在這裡指定的許可權適用於一個資料庫中的所有表。
mysql> desc host;
+-----------------+-----------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+-----------------+------+-----+---------+-------+
| Host | char(60) binary | | PRI | | |
| Db | char(64) binary | | PRI | | |
| Select_priv | enum(‘N‘,‘Y‘) | | | N | |
| Insert_priv | enum(‘N‘,‘Y‘) | | | N | |
| Update_priv | enum(‘N‘,‘Y‘) | | | N | |
| Delete_priv | enum(‘N‘,‘Y‘) | | | N | |
| Create_priv | enum(‘N‘,‘Y‘) | | | N | |
| Drop_priv | enum(‘N‘,‘Y‘) | | | N | |
| Grant_priv | enum(‘N‘,‘Y‘) | | | N | |
| References_priv | enum(‘N‘,‘Y‘) | | | N | | | Index_priv | enum(‘N‘,‘Y‘) | | | N | |
| Alter_priv | enum(‘N‘,‘Y‘) | | | N | |
+-----------------+-----------------+------+-----+---------+-------+
12 rows in set (0.01 sec)
host表與db表結合使用在一個較好層次上控制特定主機對資料庫的存取權限,這可能比單獨使用db好些。這個表不受GRANT和REVOKE語句的影響 ,所以,你可能發覺你根本不是用它。
mysql> desc tables_priv;
+-------------+-----------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra |
+-------------+-----------------------------+------+-----+---------+-------+ | Host | char(60) binary | | PRI | | | | Db | char(64) binary | | PRI | | |
| User | char(16) binary | | PRI | | | | Table_name | char(60) binary | | PRI | | | | Grantor | char(77) | | MUL | | |
| Timestamp | timestamp(14) | YES | | NULL | |
| Table_priv | set(‘Select‘,‘Insert‘, | | | | |
| | ‘Update‘,‘Delete‘,‘Create‘, | | | | |
| | ‘Drop‘,‘Grant‘,‘References‘,| | | | |
| | ‘Index‘,‘Alter‘) | | | | |
| Column_priv | set(‘Select‘,‘Insert‘, | | | | |
| | ‘Update‘,‘References‘) | | | | |
+-------------+-----------------------------+------+-----+---------+-------+
8 rows in set (0.01 sec)
tables_priv表指定表級許可權。在這裡指定的一個許可權適用於一個表的所有列。
mysql> desc columns_priv;
+-------------+------------------------+------+-----+---------+----+
| Field | Type | Null | Key | Default | Extra |
+-------------+------------------------+------+-----+---------+----+
| Host | char(60) binary | | PRI | | |
| Db | char(64) binary | | PRI | | |
| User | char(16) binary | | PRI | | |
| Table_name | char(64) binary | | PRI | | |
| Column_name | char(64) binary | | PRI | | |
| Timestamp | timestamp(14) | YES | | NULL | |
| Column_priv | set(‘Select‘,‘Insert‘, | | | | |
| | ‘Update‘,‘References‘) | | | | | +-------------+------------------------+------+-----+---------+-------+
7 rows in set (0.00 sec)
columns_priv表指定列級許可權。在這裡指定的許可權適用於一個表的特定列。
2)MySQL授權表運行機制
MySQL的存取控制分兩個步驟:
a)伺服器檢查是否允許該使用者串連。
b)如果該使用者有權串連,那麼伺服器還會檢查它的每一個請求是否有足夠的許可權。比如:使用者檢索資料庫中的一個表需要有這個資料庫的select許可權,使用者刪除資料庫中的一個表需要有這個資料庫的drop許可權。
授權表的user, db, host表使用這兩個步驟,tables_priv和columns_priv表只使用第二步(檢查請求)。每個授權表包含決定一個許可權何時運用的範圍列和決定授予哪種許可權的許可權列。 範圍列指定表中的許可權何時運用。每個授權表條目包含User和Host列來指定許可權何時運用於一個給定使用者從給定主機的串連。其他表包含附加的範圍列,如db表包含一個Db列指出許可權運用於哪個資料庫。類似地,tables_priv和columns_priv表包含範圍欄位,縮小範圍到一個資料庫中的特定表或一個表的特定列。 下面是user表的Host欄位和User欄位組合的一些例子: +-----------------------------+--------+------------------------------------------------+ | Host值 | User值 | 匹配的串連 | +-----------------------------+--------+-----------------------------------------------+
| ‘x.y.z‘ | ‘test‘ | test使用者只能從x.y.z串連資料庫 |
+-----------------------------+--------+-----------------------------------------------+
| ‘x.y.z‘ | ‘‘ | 任何使用者可以從x.y.z串連資料庫 |
+-----------------------------+--------+-----------------------------------------------+
| ‘%‘ | ‘test‘ | test使用者可以從任意主機串連資料庫 |
+-----------------------------+--------+----------------------------------------------+
| ‘‘ | ‘‘ | 任何使用者可以從任意主機串連資料庫 |
+-----------------------------+--------+-----------------------------------------------+
| ‘%.y.z‘ | ‘test‘ | test使用者可以從y.z域的任意主機串連資料庫 |
+-----------------------------+--------+----------------------------------------------+
| ‘x.y.% ‘ | ‘test‘ | test使用者可以從x.y.net, x.y.com, x.y.edu等主機串連資料庫| +-----------------------------+--------+----------------------------------------------+
| ‘192.168.1.1‘ | ‘test‘ | test使用者可以從IP地址為192.168.1.1的主機串連資料庫 |
+-----------------------------+--------+---------------------------------------------+
| ‘192.168.1.% ‘ | ‘test‘ | test使用者可以從C類子網192.168.1中的任意主機串連資料庫 |
+-----------------------------+--------+---------------------------------------------+ | ‘192.168.1.0/255.255.255.0‘ | ‘test‘ | 同上 |
+-----------------------------+--------+--------------------------------------------+
SQL的字串萬用字元%表示匹配任一字元,可以是0個字元,萬用字元_表示匹配一個字元。
許可權列指出在範圍列中指定的使用者擁有何種許可權。該表使用GRANT語句的許可權名稱。對於絕大多數在user、db和host表中的許可權列的名稱與GRANT語句中有明顯的聯絡。如Select_priv對應於SELECT許可權。
3)授權表使用舉例
grant用於給增加使用者和建立許可權,revoke用於刪除使用者權限。 下面是一些用grant增加使用者和建立許可權的例子:
mysql> grant all privileges on *.* to test
localhost identified by ‘test‘ with grant option;
這句增加一個本地具有所有許可權的test使用者(超級使用者),密碼是test。ON子句中的*.*意味著"所有資料庫、所有表"。with grant option表示它具有grant許可權。
mysql> grant select,insert,update,delete,create,drop privileges on test.* to test1
‘192.168.1.0/255.255.255.0‘ identified by ‘test‘;
這句是增加了一個test1使用者,口令是test,但是它只能從C類子網192.168.1串連,對test庫有select,insert,update,delete,create,drop操作許可權。
用grant語句建立許可權是不需要再手工重新整理授權表的,因為它已經自動重新整理了。
給使用者建立許可權還可以通過直接修改授權表:
mysql> insert into user values("localhost","test",password("test"),"Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y");
mysql> flush privileges;
這兩句和上面第一句grant的效果是一樣的,也是增加了一個本地的test超級使用者。我們看到用grant方便多了,而且還不需flush privileges 。
mysql> insert into user (host,user,password) values("192.168.1.0/255.255.255.0","test1",PASSWORD("test"));
mysql> insert into db values("192.168.1.0/255.255.255.0","test","test1","Y","Y","Y","Y","Y","Y","N","N","N","N")
mysql> flush privileges;
這三句和上面第二句grant的效果也是一樣的,也是增加了一個只能從C類子網192.168.1串連,對test庫有select,insert,update,delete,create,drop操作許可權的test1使用者,口令是test。要取消一個使用者的許可權,使用revoke語句。revoke的文法非常類似於grant語句,除了to用from取代並且沒有identified by和with grant option子句,下面是用revoke刪除使用者權限的例子:
mysql> revoke all on test.* from test1
‘192.168.1.0/255.255.255.0‘;
這句revoke就撤消了上面第二句grant建立的許可權,但是test1使用者並沒有被刪除,必須手工從user表刪除:
mysql> delete from user where user=‘test1‘; mysql> flush privileges;
這樣,test1使用者就徹底刪除了。
這些只是MySQL授權表的簡單使用,更多詳細的資料請見MySQL提供的手冊。
3、編程需要注意的一些問題
不管是用哪種程式語言寫串連MySQL資料庫的程式,有一條準則是永遠不要相信使用者提交的資料!
對於數字欄位,我們要使用查詢語句:SELECT * FROM table WHERE ID=‘234‘,不要使用SELECT * FROM table WHERE ID=234這樣的查詢語句。MySQL會自動把字串轉換為數字字元並且去除非數字字元。如果使用者提交的資料經過了mysql_escape_string處理,這樣我們就可以完全杜絕了sql inject攻擊,關於sql inject攻擊請參考下面連結的文章: