当前位置:七道奇文章资讯数据防范MSSQL防范
日期:2011-05-02 15:21:00  来源:本站整理

MySQL中文参考手册7(MySQL存取权限系统)grant设置密码password[MSSQL防范]

赞助商链接



  本文“MySQL中文参考手册7(MySQL存取权限系统)grant设置密码password[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

MySQL中文参考手册7(MySQL 存取权限系统)-F5ofz

转载 译者:晏子

〖返回〗〖转发〗

译者:晏子 (clyan@sohu.com)主页:http://linuxdb.yeah.net
6 MySQL 存取权限系统
MySQL有一个先进但非尺度的安全/权限系统.本节描写它的工作原理. 

6.1 权限系统做什么
MySQL权限系统的主要功效是证实衔接到一台给定主机的一个用户,并且赋予该用户在一个数据库上select、 insert、update和delete的权限. 

附加的功效包含有一个匿名的用户和关于MySQL特定的功效比方LOAD DATA INFILE举行受权及管理操作的本领. 

6.2 MySQL 用户名和口令
由MySQL利用用户名和口令的办法与Unix或Windows利用的方法有很多差别之处: 


  • MySQL利用于认证目的的用户名,与Unix用户名(登录名字)或Windows用户名无关.缺省地,大大都MySQL客户尝试利用当前Unix用户名作为MySQL用户名登录,但是这仅仅为了便利.客户程序答应用-u或--user选项指定一个差别的名字,这意味着无论若何你不能使得一个数据库更安全,除非全部的MySQL用户名都有口令.任何人可以试图用任何名字衔接服务器,并且假如他们指定了没有口令的任何名字,他们将成功. 
  • MySQL用户名最长可以是16各字符;典型地,Unix用户名限制为8个字符. 
  • MySQL口令与Unix口令不要紧.在你利用登录到一台Unix机械口令和你利用在那台机械上存取一个数据库的口令之间没有必要有关联. 
  • MySQL加密口令利用了一个Unix登录期间所用的差别算法,见7.4.12 杂项函数一节中描写PASSword()和ENCRYPT()函数部份. 

6.3 与MySQL服务器衔接
当你想要存取一个MySQL服务器时,MySQL客户程序普通要求你指定衔接参数:你想要联接的主机、你的用户名和你的口令.比方,mysql客户可以象这样启动(可选的参数被包含在"["和"]"之间): 

shell> mysql [-h host_name][-u user_name][-pyour_pass ]
-h, -u和-p选项的另一种情势是--host=host_name、--user=user_name和--password=your_pass.注意在-p或--password=与跟随它背面的口令之间没有空格. 

注意:在号令行上指定一个口令是不安全的!随后在你系统上的任何用户可以通过打近似这样的号令发现你的口令:ps auxww.见4.15.4 选项文件. 

关于号令行没有的联接参数,mysql利用缺省值: 

  • 缺省主机名是localhost. 
  • 缺省用户名是你的Unix登录名. 
  • 假如没有-p,则没有供应口令. 

这样, 对一个Unix用户joe,下列号令是等价的: 

shell>mysql -h localhost -u joe 
shell>mysql -h localhost 
shell>mysql -u joe 
shell>mysql

别的MySQL客户程序有一样表现. 

在Unix系统上,当你举行一个衔接时,你可以指定要利用的差别的缺省值,这样你没必要每次在你调用一个客户程序是在号令行上输入他们.这可以有很多办法做到: 

你能在你的主目录下".my.cnf"的配置文件的[client]小节里指定衔接参数.文件的相关小节看上去大概像这样: 
[client] 
host=host_name 
user=user_name 
password=your_pass

见4.15.4 选项文件.

你可以用环境变量指定衔接参数.主机可用MYSQL_HOST指定,MySQL用户名字可用USER指定(仅对 Windows),口令可用MYSQL_PWD指定(但是这不安全,见下一节) . 
假如衔接参数以多种办法被指定,在号令行上被指定的值优先于在配置文件和环境变量中指定的值,而在配置文件指定的值优先于在环境变量指定的值. 

6.4 使你的口令安全
以一种表露的可被其他用户发现的方法指定你的口令是不当当的.当你运行客户程序时,你可以利用下列办法指定你的口令,还有每个办法的风险评价: 

  • 利用一个在号令行上-pyour_pass或--password=your_pass的选项.这很便利但是不安全,因为你的口令对系统状况程序(比方ps)变得可见,它可以被其他的用户调用来显示号令行.(普通MySQL客户在他们的初始化次序期间用零覆盖号令行参数,但是仍旧有一个短暂隔断时间内参数值可见的.) 
  • 利用一个-p或--password选项(没有指定your_pass值).在这种情形下,客户程序恳求来自终端的口令: 
    shell>mysql - u  user_name - p
    Enter password: ********

    客户回应"*"字符到作为输入你的口令的终端使得傍观者不能瞥见它.因为它对其他用户不可见,与在号令行上指定它相比,这样进入你的口令更安全.但是,这个输入一个口令的办法仅仅为你交互式运路程序是符合的.假如你想要从非交互式运行的一个脚本调用一个客户,就没有从终端输入进口令的机会. 


  • 在一个配置文件中存储你的口令.比方,你可你的主目录的".my.cnf"文件中的[client]节列出你的口令: 
    [client]
    password=your_pass

    假如你在".my.cnf"里面存储口令,文件应当不是组或世界可读或可写的.保证文件的存取情势是400或600.见4.15.4 选项文件. 



  • 你可在MYSQL_PWD环境变量中存储口令,但是这个办法必须想到是极不安全的且应当不利用.ps的某些版本包含显示运行进程的环境的选项;假如你设定MYSQL_PWD,你的口令将对全部人是显而易见的,乃至在没有这样一个版本的ps系统上,假定没有其他办法察看到进程环境是不明智的. 
    总之,最安全的办法是让客户程序提醒口令或在一个得当保护的".my.cnf"文件中指定口令. 

6.5   MySQL供应的权限
权限信息用user、db、host、tables_priv和columns_priv表被存储在mysql数据库中(即在名为mysql的数据库中).在MySQL启动时和在6.9 权限改正什么时刻见效所说的情形时,服务器读入这些数据库表内容. 

本手册所用的触及由MySQL供应的权限名称显示在下表,还有在受权表中每个权限的表列名称和每个权限有关的上下文: 

权限           列               上下文  
select      Select_priv           表 
insert      Insert_priv           表 
update      Update_priv           表 
delete      Delete_priv           表 
index       Index_priv            表 
alter       Alter_priv            表 
create      Create_priv         数据库、表或索引 
drop        Drop_priv           数据库或表 
grant       Grant_priv          数据库或表 
references  References_priv     数据库或表 
reload      Reload_priv         服务器管理 
shutdown    Shutdown_priv       服务器管理 
process     Process_priv        服务器管理 
file        File_priv           在服务器上的文件存取 

select、insert、update和delete权限答应你在一个数据库现有的表上实施操作. 

SELECT语句只有在他们真正从一个表中检索行是才需求select权限,你可以履行某个SELECT语句,乃至没有任何到服务器上的数据库里的存取任何东西的答应.比方,你可以利用mysql客户作为一个简单的计算器: 

mysql> SELECT 1+1;
mysql> SELECT PI()*2;

index权限答应你成立或丢弃(删除)索引. 

alter权限答应你利用ALTER TABLE. 

create和drop权限答应你成立新的数据库和表,或丢弃(删除)现存的数据库和表. 

注意:假如你将mysql数据库的drop权限授与一个用户,该用户能丢弃存储了MySQL存取权限的数据库! 

grant权限答应你把你自己拥有的那些权限授给其他的用户. 

file权限赐与你用LOAD DATA INFILE和SELECT ... INTO OUTFILE语句读和写服务器上的文件,任何被授与这个权限的用户都能读或写MySQL服务器能读或写的任何文件. 

别的的权限用于管理性操作,它利用mysqladmin程序实施.下表显示mysqladmin支配每个管理性权限答应你履行的号令: 

优惠         权限拥有者答应履行的号令  
reload       reload, refresh, flush-privileges, flush-hosts, flush-logs, flush-tables  
shutdown     shutdown  
precess      processlist, kill  

reload号令奉告服务器再读入受权表,refresh号令清洗全部表并翻开和关闭记录文件,flush-privileges是reload的一个同义词,别的flush-*号令履行近似refresh的功效,但是范围更有限,并且在某些情形下大概更好用.比方,假如你只是想清洗记录文件,flush-logs比refresh是更好的挑选. 

shutdown号令关掉服务器. 

processlist号令显示在服务器内履行的线程的信息.kill号令杀死服务器线程.你老是能显示或杀死你自己的线程,但是你需求process权限来显示或杀死其他用户启动的线程. 

总的说来,只授与权限给需求他们的那些用户是一个好主张,但是你应当在授与某个权限时试验特定的告诫: 

  • grant权限答应用户放弃他们的权限给其他用户.2个有差别的权限并有grant权限的用户可以归并权限. 
  • alter权限可以用于通太重新命名表来推翻权限系统. 
  • file权限可以被滥用在服务器上读取任何世界可读(world-readable,即任何人可读)的文件到一张数据库表,然后其内容能用SELECT被存取. 
  • shutdown权限通过终止服务器可以被滥用完好回绝为其他用户服务, . 
  • precess权限能被用来察看当前履行的查询的普通文本,包含设定或改变口令查询. 
  • 在mysql数据库上的权限能被用来改变口令和其他存取权限信息.(口令被加密存储,所以一个恶意的用户不能简单地读取他们.但是,有充足的权限,同一个用户能用差别的一个替换一个口令.) 
    有一些事情你不能用MySQL权限系统做到: 

  • 你不能明显地指定一个给定用户应当被回绝存取.即,你不能明显地匹配一个用户并且然后回绝衔接. 
  • 你不能指定一个用户有权成立立或丢弃一个数据库中的表,也不能成立或丢弃数据库本身. 

6.6 权限系统工作原理
MySQL权限系统保证全部的用户可以严峻地做他们假定被答应做的事情.当你衔接一个MySQL服务器时, 你的身份由你从那衔接的主机和你指定的用户名来决意,系统按照你的身份和你想做什么来授与权限. 

MySQL在认定身份中考虑你的主机名和用户名字,是因为有很小的缘由假定一个给定的用户在因特网上属于同一个人.比方,用户从whitehouse.gov衔接的bill没必要和从mosoft.com衔接bill是同一个人. MySQL通过答应你辨别在差别的主机上刚巧有一样名字用户来处理它:你可以对从whitehouse.gov衔接授与bill一个权限集,而为从microsoft.com的衔接授与一个差别的权限集. 

MySQL存取掌握包含2个阶段: 

  • 阶段1:服务器查抄你能否答应衔接. 
  • 阶段2:假定你能衔接,服务器查抄你发出的每个恳求.看你能否有充足的权限实施它.比方,假如你从数据库中一个表精选(select)行或从数据库丢弃一个表,服务器肯定你对表有select权限或对数据库有drop权限. 

服务器在存取掌握的两个阶段利用在mysql的数据库中的user、db和host表,在这些受权表中字段以下: 

表名称                  user                db                  host  
范围字段                Host                Host                Host  
                        User                Db                  Db  
                        Password            User   
权限字段                Select_priv         Select_priv         Select_priv  
                        Insert_priv         Insert_priv         Insert_priv  
                        Update_priv         Update_priv         Update_priv  
                        Delete_priv         Delete_priv         Delete_priv  
                        Index_priv          Index_priv          Index_priv  
                        Alter_priv          Alter_priv          Alter_priv  
                        Create_priv         Create_priv         Create_priv  
                        Drop_priv           Drop_priv           Drop_priv  
                        Grant_priv          Grant_priv          Grant_priv  
                        Reload_priv    
                        Shutdown_priv    
                        Process_priv    
                        File_priv    

对存取掌握的第二阶段(恳求证实),假如恳求触及表,服务器可以别的参考tables_priv和columns_priv表.这些表的字段以下: 

表名称                     tables_priv                columns_priv  
范围字段                     Host                       Host  
                                 Db                         Db  
                                 User                       User  
                               Table_name                 Table_name  
                               Column_name  
权限字段                   Table_priv                 Column_priv  
                               Column_priv   
其他字段                   Timestamp                  Timestamp  
                               Grantor   

每个受权表包含范围字段和权限字段. 

范围字段决意表中每个条目的范围,即,条目实用的上下文.比方, 一个user表条目的Host和User值为'thomas.loc.gov'和'bob'将被用于证实来自主机thomas.loc.gov的bob对服务器的衔接.一样,一个db表条目的Host、User和Db字段的值是'thomas.loc.gov'、'bob'和'reports'将用在bob从主机联接thomas.loc.gov存取reports数据库的时刻. tables_priv和columns_priv表包含范围字段,指出每个条目实用的表或表/列的组合. 

关于查抄存取的用处,对比Host值是忽视大小写的.User、Password、Db和Table_name值是辨别大小写的.Column_name值在MySQL3.22.12或今后版本是忽视大小写的. 

权限字段指出由一个表条目授与的权限,即,可实施什么操作.服务器组合各种的受权表的信息形成一个用户权限的完好描写.为此利用的法则在6.8 存取掌握, 阶段2:恳求证实描写.

范围字段是字符串,以下所述;每个字段的缺省值是空字符串: 

字段名      范例  
Host       CHAR(60)  
User       CHAR(16)  
Password   CHAR(16)  
Db         CHAR(64)  (tables_priv和columns_priv表为CHAR(60)) 

在user、db和host表中,全部权限字段被声明为ENUM('N','Y')--每一个都可有值'N'或'Y',并且缺省值是'N'. 

在tables_priv和columns_priv表中,权限字段被声明为SET字段: 

表名         字段名        大概的调集成员  
tables_priv  Table_priv   'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop', 'Grant', 'References', 'Index', 'Alter'  
tables_priv  Column_priv  'Select', 'Insert', 'Update', 'References'  
columns_priv Column_priv  'Select', 'Insert', 'Update', 'References'  

简单地说,服务器利用这样的受权表: 

  • user表范围字段决意能否答应或回绝到来的衔接.关于答应的衔接,权限字段指出用户的全局(超级用户)权限. 
  • db和host表一同利用: 

             db表范围字段决意用户能从哪个主机存取哪个数据库.权限字段决意答应哪个操作. 
             
             当你想要一个给定的db条目利用于若干主机时,host表作为db表的扩大被利用.比方,假如你想要一个用户能在你的网络从若干主机利用一个数据库,在用户的db表的Host条目设为空值,然后将那些主机的每一个移入host表.这个机制具体描写在6.8 存取掌握, 阶段2:恳求证实. 

  • tables_priv和columns_priv表近似于db表,但是更风雅:他们在表和列级利用而非在数据库级. 

注意管理权限(reload, shutdown, 等等)仅在user表中被指定.这是因为管理性操作是服务器本身的操作并且不是特定数据库,因此没有来由在其他受权表中列出这样的权限.事实上,只需求请教user表来决意你能否履行一个管理操作. 

file权限也仅在user表中指定.它不是管理性权限,但你读或谢在服务器主机上的文件的的本领独立于你正在存取的数据库. 

当mysqld服务器启动时,读取一次受权表内容.对受权表的更改见效在6.9 权限更改什么时刻见效描写. 

当你改正受权表的内容时,确保你按你想要的方法更改权限设置是一个好主张.为帮忙诊断问题,见6.13 "存取回绝惹起"错误的缘由.关于安全问题上的警告,见6.14 怎么对使MySQL安全抵挡解密高手. 

一个有效的诊断工具是mysqlAccess脚本,由Carlier Yves 供应应MySQL分发.利用--help选项调用mysqlaccess查明它怎样工作.注意:mysqlaccess仅用user、db和host表仅查抄存取.它不查抄表或列级权限. 

6.7 存取掌握, 阶段1:衔接证实
当你试图联接一个MySQL服务器时,服务器基于你的身份和你能否能通过供应精确的口令考证身份来承受或回绝衔接.假如不是,服务器完好具结你的存取,不然,服务器承受衔接,然后进入阶段2并且等候恳求. 

你的身份基于2个信息: 

  • 你从那个主机衔接 
  • 你的MySQL用户名 

身份查抄利用3个user表(Host, User和Password)范围字段履行.服务器只有在一个user表条目匹配你的主机名和用户名并且你供应了精确的口令时才承受衔接. 

在user表范围字段可以以下被指定: 

  • 一个Host值可以是主机名或一个IP数字,或'localhost'指出本地主机. 
  • 你可以在Host字段里利用通配符字符"%"和"_". 
  • 一个Host值'%'匹配任何主机名,一个空白Host值等价于'%'.注意这些值匹配能成立一个衔接到你的服务器的任何主机! 
    通配符字符在User字段中不答应,但是你能指定空白的值,它匹配任何名字.假如user表匹配到来的衔接的条目有一个空白的用户名,用户被认为是匿名用户(没闻名字的用户),而非客户实际指定的名字.这意味着一个空白的用户名被用于在衔接期间的进一步的存取查抄(即,在阶段2期间). 
  • Password字段可以是空白的.这不意味着匹配任何口令,它意味着用户必须不指定一个口令举行衔接. 

非空白Password值代表加密的口令. MySQL不以任何人可以看的纯文本格局存储口令,相反,正在试图联接的一个用户供应的口令被加密(利用PASSWORD()函数),并且与存储了user表中的已经加密的版本对比.假如他们匹配,口令是精确的. 

下面的例子显示出各种user表中Host和User条目的值的组合若何利用于到来的衔接: 

Host 值               User 值      被条目匹配的衔接  
'thomas.loc.gov'      'fred'       fred, 从thomas.loc.gov 衔接 
'thomas.loc.gov'      '           任何用户, 从thomas.loc.gov衔接  
'%'                   'fred'       fred, 从任何主机衔接 
'%'                   '           任何用户, 从任何主机衔接 
'%.loc.gov'           'fred'       fred, 从在loc.gov域的任何主机衔接 
'x.y.%'               'fred'       fred, 从x.y.net、x.y.com,x.y.edu等联接.(这大概无用) 
'144.155.166.177'     'fred'       fred, 从有144.155.166.177 IP 地址的主机衔接 
'144.155.166.%'       'fred'       fred, 从144.155.166 C类子网的任何主机衔接 

既然你能在Host字段利用IP通配符值(比方,'144.155.166.%'匹配在一个子网上的每台主机),有大概某人大概计划根究这种本领,通过命名一台主机为144.155.166.somewhere.com.为了禁止这样的计划,MySQL不答应匹配以数字和一个点起始的主机名,这样,假如你用一个命名为近似1.2.foo.com的主机,它的名字决不会匹配受权表中Host列.只有一个IP数字能匹配IP通配符值. 

一个到来的衔接可以被在user表中的超越一个条目匹配.比方,一个由fred从thomas.loc.gov的衔接匹配多个条目如上所述.假如超越一个匹配,服务器怎么挑选利用哪个条目呢?服务器在启动时读入user表后通过排序来办理这个问题,然后当一个用户试图衔接时,以排序的次序浏览条目,第一个匹配的条目被利用. 

user表排序工作以下,假定user表看起来像这样: 

+-----------+----------+-
| Host      | User     | ...
+-----------+----------+-
| %         | root     | ...
| %         | jeffrey  | ...
| localhost | root     | ...
| localhost |          | ...
+-----------+----------+-

当服务器在表中读取时,它以最特定的Host值为先的次序布列('%'在Host列里意味着"任何主机"并且是最不特定的).有相同Host值的条目以最特定的User值为先的次序布列(一个空白User值意味着"任何用户"并且是最不特定的).终究排序的user表看起来像这样: 

+-----------+----------+-
| Host      | User     | ...
+-----------+----------+-
| localhost | root     | ...
| localhost |          | ...
| %         | jeffrey  | ...
| %         | root     | ...
+-----------+----------+-

当一个衔接被尝试时,服务器浏览排序的条目并利用找到的第一个匹配.关于由jeffrey从localhost的一个衔接,在Host列的'localhost'条目首先匹配.那些有空白用户名的条目匹配衔接的主机名和用户名.('%'/'jeffrey'条目也将匹配,但是它不是在表中的第一匹配.)

这是别的一个例子.假定user表看起来像这样: 

+----------------+----------+-
| Host           | User     | ...
+----------------+----------+-
| %              | jeffrey  | ...
| thomas.loc.gov |          | ...
+----------------+----------+-

排序后的表看起来像这样: 

+----------------+----------+-
| Host           | User     | ...
+----------------+----------+-
| thomas.loc.gov |          | ...
| %              | jeffrey  | ...
+----------------+----------+-

一个由jeffrey从thomas.loc.gov的衔接被第一个条目匹配,而一个由jeffrey从whitehouse.gov的衔接被第二个匹配. 

广泛的曲解是认为,对一个给定的用户名,当服务器试图对衔接探求匹配时,明确命名那个用户的全部条目将首先被利用.这明显不是事实.先前的例子阐明了这点,在那边一个由jeffrey从thomas.loc.gov的衔接没被包含'jeffrey'作为User字段值的条目匹配,但是由没有效户名的标题匹配! 

假如你有服务器衔接的问题,打印出user表并且手工排序它看看第一个匹配在哪儿举行. 

6.8 存取掌握,阶段2:恳求证实
一旦你成立了一个衔接,服务器进入阶段2.对在此衔接长进来的每个恳求,服务器查抄你能否有充足的权限来履行它,它基于你但愿履行的操作范例.这恰是在受权表中的权限字段施展作用的地方.这些权限可以来子user、db、host、tables_priv或columns_priv表的任何一个.受权表用GRANT和REVOKE号令操作.见7.26 GRANT和REVOKE 句法.(你可以发觉参考6.6 权限系统怎样工作很有帮忙,它列出了在每个权限表中显现的字段.)

user表在一个全局底子上授与赋予你的权限,该权限不管当前的数据库是什么均实用.比方,假如user表授与你delete权限, 你可以删除在服务器主机上从任何数据库删除行!换句话说,user表权限是超级用户权限.只把user表的权限授与超级用户如服务器或数据库主管是明智的.对其他用户,你应当把在user表中的权限设成'N'并且仅在一个特定数据库的底子上受权, 利用db和host表. 

db和host表授与数据库特定的权限.在范围字段的值可以以下被指定: 

  • 通配符字符"%"和"_"可被用于两个表的Host和Db字段. 
  • 在db表的'%'Host值意味着"任何主机",在db表中一个空白Host值意味着"对进一步的信息咨询host表". 
  • 在host表的一个'%'或空白Host值意味着"任何主机". 
  • 在两个表中的一个'%'或空白Db值意味着"任何数据库". 
  • 在两个表中的一个空白User值匹配匿名用户. 

db和host表在服务器启动时被读取和排序(同时它读user表).db表在Host、Db和User范围字段上排序,并且host表在Host和Db范围字段上排序.关于user表,排序首先安排最特定的值然后最后最不特定的值,并且当服务器探求匹配入条目时,它利用它找到的第一个匹配. 

tables_priv和columns_priv表授与表和列特定的权限.在范围字段的值可以以下被指定: 

  • 通配符"%"和"_"可用在利用在两个表的Host字段. 
  • 在两个表中的一个'%'或空白Host意味着"任何主机". 
  • 在两个表中的Db、Table_name和Column_name字段不能包含通配符或空白. 

tables_priv和columns_priv表在Host、Db和User字段上被排序.这近似于db表的排序,固然因为只有Host字段可以包含通配符,但排序更简单. 

恳求证实进程在下面描写.(假如你熟习存取查抄的源代码,你会注意到这里的描写与在代码利用的算法略有差别.描写等价于代码实际做的东西;它只是差别于使注释更简单.)

对管理恳求(shutdown、reload等等),服务器仅查抄user表条目,因为那是唯一指定管理权限的表.假如条目答应恳求的操作,存取被受权了,不然回绝.比方,假如你想要履行mysqladmin shutdown,但是你的user表条目没有为你授与shutdown权限,存取乃至不用查抄db或host表就被回绝.(因为他们不包含Shutdown_priv行列,没有这样做的必要.)

对数据库有关的恳求(insert、update等等),服务器首先通过查找user表条目来查抄用户的全局(超级用户)权限.假如条目答应恳求的操作,存取被受权.假如在user表中全局权限不够,服务器通过查抄db和host表肯定特定的用户数据库权限: 

  • 服务器在db表的Host、Db和User字段上查找一个匹配. Host和User对应衔接用户的主机名和MySQL用户名.Db字段对利用户想要存取的数据库.假如没有Host和User的条目,存取被回绝. 
  • 假如db表中的条目有一个匹配并且它的Host字段不是空白的,该条目定义用户的数据库特定的权限. 
  • 假如匹配的db表的条目的Host字段是空白的,它表示host表摆列主机应当被答应存取数据库的主机.在这种情形下,在host表中作进一步查找以发现Host和Db字段上的匹配.假如没有host表条目匹配,存取被回绝.假若有匹配,用户数据库特定的权限以在db和host表的条目的权限,即在两个条目都是'Y'的权限的交集(而不是并集!)计算.(这样你可以授与在db表条目中的普通权限,然后用host表条目按一个主机一个主机为底子地有挑选地限制它们.) 

在肯定了由db和host表条目授与的数据库特定的权限后,服务器把他们加到由user表授与的全局权限中.假如后果答应恳求的操作,存取被受权.不然,服务器查抄在tables_priv和columns_priv表中的用户的表和列权限并把它们加到用户权限中.基于此后果答应或回绝存取. 

用布尔术语表示,前面关于一个用户权限若何计算的描写可以这样总结: 

global privileges
OR (database privileges AND host privileges)
OR table privileges
OR column privileges

它大概不明显,为什么呢,假如全局user条目的权限最初发现对恳求的操作不够,服务器今后把这些权限加到数据库、表和列的特定权限.缘由是一个恳求大概要求超越一种范例的权限.比方,假如你履行一个INSERT ... SELECT语句,你就都要insert和select权限.你的权限必须如此以便user表条目授与一个权限而db表条目授与另一个.在这种情形下,你有必要的权限履行恳求,但是服务器不能自己把两个表辨别开来;两个条目授与的权限必须组合起来. 

host表能被用来保护一个"安全"服务器列表.在TcX,host表包含一个在本地的网络上全部的机械的表,这些被授与全部的权限. 

你也可以利用host表指定不安全的主机.假定你有一台机械public.your.domain,它位于你不认为是安全的一个大众区域,你可以用下列的host表条目子答应除了那台机械外的网络上全部主机的存取: 

+--------------------+----+-
| Host               | Db | ...
+--------------------+----+-
| public.your.domain | %  | ... (全部权限设为 'N')
| %.your.domain      | %  | ... (全部权限设为 'Y')
+--------------------+----+-

当然,你应当老是测试你在受权表中的条目(比方,利用mysqlaccess)让你确保你的存取权限实际上以你认为的方法被设置. 

6.9 权限更改什么时刻见效
当mysqld启动时,全部的受权表内容被读进存储器并且从那点见效. 

用GRANT、REVOKE或SET PASSWORD对受权表施行的改正会当即被服务器注意到. 

假如你手工地改正受权表(利用INSERT、UPDATE等等),你应当履行一个FLUSH PRIVILEGES语句或运行mysqladmin flush-privileges奉告服务器再装载受权表,不然你的改变将不见效,除非你重启服务器. 

当服务器注意到受权表被改变了时,现存的客户衔接有以下影响: 

  • 表和列权限在客户的下一次恳求时见效. 
  • 数据库权限改变在下一个USE db_name号令见效. 
  • 全局权限的改变和口令改变在下一次客户衔接时见效. 


6.10 成立初始的MySQL权限
在安装MySQL后,你通过运行scripts/mysql_install_db安装初始的存取权限.见4.7.1 快速安装概述. scripts/mysql_install_db脚本启动mysqld服务器,然后初始化受权表,包含下列权限调集: 

  • MySQL root用户作为可做任何事情的一个超级用户被创造.衔接必须由本地主机发出.注意:出世的root口令是空的,因此任何人能以root而没有一个口令举行衔接并且被授与全部权限. 
  • 一个匿名用户被创造,他可对有一个'test'或以'test_'开始的名字的数据库做任什么时刻期事情,衔接必须由本地主机发出.这意味着任何本地用户能衔接并且视为匿名用户. 
  • 其他权限被回绝.比方,普通用户不能利用mysqladmin shutdown或mysqladmin processlist. 

注意:对Win32的初始权限是差别的.见4.12.4 在Win32上运行MySQL. 

既然你的安装初始时广开大门,你首先应当做的事情之一是为MySQL root用户指定一个口令.你可以做以下(注意,你利用PASSWORD()函数指定口令): 

shell> mysql -u root mysql
mysql> UPDATE user SET Password=PASSWORD('new_password')
           WHERE user='root';
mysql> FLUSH PRIVILEGES;

在MySQL 3.22和以上版本中,你可以利用SET PASSWORD语句: 

shell> mysql -u root mysql
mysql> SET PASSWORD FOR root=PASSWORD('new_password');

设置口令的另一种办法是利用mysqladmin号令: 

shell> mysqladmin -u root password new_password 

注意:假如你利用第一种办法在user表里直接更新口令,你必须奉告服务器再次读入受权表(用FLUSH PRIVILEGES),因为不然改变将不被注意到. 

一旦root口令被设置,此后当你作为root与服务器衔接时,你必须供应那个口令. 

你大概但愿让root口令为空白以便当你施行附加的安装时,你不需求指定它或测试,但是保证在任何真实的生产工作中利用你的安装之前,设置它. 

看看scripts/mysql_install_db脚本,看它若何安装缺省的权限.你可用它作为一个研究若何增添其他用户的底子. 

假如你想要初始的权限差别于上面描写的那些,在你运行mysql_install_db之前,你可以改正它. 

为了完好重建权限表,删除在包含mysql数据库的目录下全部"*.frm","*.MYI"和"*.MYD"文件.(这是在数据库目录下面命名为"mysql"的目录,当你运行mysqld --help时,它被列出.)然后运行mysql_install_db脚本,大概在首先编辑它拥有你想要的权限之后. 

注意:关于比MySQL 3.22.10旧的版本,你不该该删除"*.frm"文件.假如你无意做了,你应当在运行mysql_install_db之前你的MySQL分发中拷回它们. 

6.11 向MySQL增添新用户权限
你可以有2个差别的办法增添用户:通过利用GRANT语句或通过直接操作MySQL受权表.对比好的办法是利用GRANT语句,因为他们是更简明并且仿佛错误少些. 

下面的例子显示出若何利用mysql客户安装新用户.这些例子假定权限按照从前的章节描写的缺省被安装.这意味着为了改变,你必须在mysqld正在运行同一台机械上,你必须作为MySQL root用户衔接,并且root用户必须对mysql数据库有insert权限和reload管理权限.别的,假如你改变了root用户口令,你必须以下的mysql号令指定它. 

你可以通过发出GRANT语句增添新用户: 

shell> mysql --user=root mysql
mysql> GRANT ALL PRIVILEGES ON *.* TO monty@localhost
           IDENTIFIED BY 'something' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO monty@"%"
           IDENTIFIED BY 'something' WITH GRANT OPTION;
mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost;
mysql> GRANT USAGE ON *.* TO dummy@localhost;

这些GRANT语句安装3个新用户: 

monty 
可以从任何地方衔接服务器的一个完好的超级用户,但是必须利用一个口令('something'做这个.注意,我们必须对monty@localhost和monty@"%"发出GRANT语句.假如我们增添localhost条目,对localhost的匿名用户条目在我们从本地主机衔接接时由mysql_install_db成立的条目将优先考虑,因为它有更特定的Host字段值,所以以user表布列次序看更早到来. 
admin 
可以从localhost没有一个口令举行衔接并且被授与reload和process管理权限的用户.这答应用户履行mysqladmin reload、mysqladmin refresh和mysqladmin flush-*号令,还有mysqladmin processlist.没有授与数据库有关的权限.他们能在今后通过发出另一个GRANT语句受权. 
dummy 
可以不用一个口令衔接的一个用户,但是只能从本地主机.全局权限被设置为'N'--USAGE权限范例答应你无需权限便可设置一个用户.它假定你将在今后授与数据库相关的权限. 
你也可以直接通过发出INSERT语句增添一样的用户存失信息,然后奉告服务器再次装入受权表: 

shell> mysql --user=root mysql
mysql> INSERT INTO user VALUES('localhost','monty',PASSWORD('something'),
                'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y')
mysql> INSERT INTO user VALUES('%','monty',PASSWORD('something'),
                'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y')
mysql> INSERT INTO user SET Host='localhost',User='admin',
                 Reload_priv='Y', Process_priv='Y';
mysql> INSERT INTO user (Host,User,Password)
                        VALUES('localhost','dummy',');
mysql> FLUSH PRIVILEGES;

取决于你的MySQL版本,对上述,你大概必须利用一个差别数目'Y'值(在3.22.11从前的版本有更少的权限列).对admin用户,只用在3.22.11开始的版本具有的越发可读的INSERT扩大的语法. 

注意,为了设置一个超级用户,你只需创造一个user表条目,其权限字段设为'Y'.不需求db或host表的条目. 

在user表中的权限列不是由最后一个INSERT语句明确设置的(对dummy用户),因此那些列被赋予缺省值'N'.这是GRANT USAGE做的一样的事情. 

下列例子增添一个用户custom,他能从主机localhost、server.domain和whitehouse.gov衔接.他只想要从localhost存取bankaccount数据库,从whitehouse.gov存取expenses数据库和从全部3台主机存取customer数据库.他想要从全部3台主机上利用口令stupid. 

为了利用GRANT语句设置个用户的权限,运行这些号令: 

shell> mysql --user=root mysql
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
           ON bankaccount.*
           TO custom@localhost
           IDENTIFIED BY 'stupid';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
           ON expenses.*
           TO custom@whitehouse.gov
           IDENTIFIED BY 'stupid';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
           ON customer.*
           TO custom@'%'
           IDENTIFIED BY 'stupid';

通过直接改正受权表设置用户权限,运行这些号令(注意,在完毕时FLUSH PRIVILEGES): 

shell> mysql --user=root mysql
mysql> INSERT INTO user (Host,User,Password)
       VALUES('localhost','custom',PASSWORD('stupid'));
mysql> INSERT INTO user (Host,User,Password)
       VALUES('server.domain','custom',PASSWORD('stupid'));
mysql> INSERT INTO user (Host,User,Password)
       VALUES('whitehouse.gov','custom',PASSWORD('stupid'));
mysql> INSERT INTO db
       (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
        Create_priv,Drop_priv)
       VALUES
       ('localhost','bankaccount','custom','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
       (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
        Create_priv,Drop_priv)
       VALUES
       ('whitehouse.gov','expenses','custom','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
       (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
        Create_priv,Drop_priv)
       VALUES('%','customer','custom','Y','Y','Y','Y','Y','Y');
mysql> FLUSH PRIVILEGES;

头3个INSERT语句增添user表条目,答应用户custom用给定口令从差别的主机举行衔接,但是没有授与任何答应(全部权限被设置为缺省值'N').后3个INSERT语句增添db表条目,授与custom以bankaccount、expenses和customer数据库权限,但是只能在从精确的主机存取时.普通,在受权表直接被改正时,服务器必须被奉告再次装入他们(用FLUSH PRIVILEGES)以便使权限改正见效.

假如你想要给特定的用户从一个给定的域上的任何机械上存取权限,你可以发出一个以下的GRANT语句: 

mysql> GRANT ...
           ON *.*
           TO myusername@"%.mydomainname.com"
           IDENTIFIED BY 'mypassword';

为了通过直接改正受权表做一样的事情,这样做: 

mysql> INSERT INTO user VALUES ('%.mydomainname.com', 'myusername',
           PASSWORD('mypassword'),...);
mysql> FLUSH PRIVILEGES;

你也可以利用xmysqladmin、mysql_webadmin乃至xmysql在受权表中插入、改变和更新值.你可以在MySQL的Contrib目录找到这些实用程序. 

6.12 怎样设置口令
在前面小节的例子里阐明了一个重要的原则:当你利用INSERT或UPDATE语句存储一个非空的口令时,你必须利用PASSWORD()函数加密它.这是因为在user表中以加密情势存储口令,而不是作为纯文本.假如你忘掉这个事实,你大概像这样试图设置口令: 

shell> mysql -u root mysql 
mysql> INSERT INTO user (Host,User,Password) VALUES('%','jeffrey','biscuit'); 
mysql> FLUSH PRIVILEGES

后果是纯文本值'biscuit'作为口令被存储在user表中.在用户jeffrey试图用这个口令衔接服务器时,mysql客户用PASSWORD()加密它并且将后果送给服务器,服务器对比在user表中的值(它是纯文本值'biscuit')和加密的口令(而不是 'biscuit'),对比失利并且服务器回绝衔接: 

shell> mysql -u jeffrey -pbiscuit test
Access denied

因为当他们被插入user表时,口令必须被加密,相反,INSERT语句应当象这样被指定: 

mysql> INSERT INTO user (Host,User,Password)
       VALUES('%','jeffrey',PASSWORD('biscuit'));

当你利用SET PASSWORD语句时,你也必须利用PASSWORD()函数: 

mysql> SET PASSWORD FOR jeffrey@"%" = PASSWORD('biscuit'); 

假如你利用GRANT ... IDENTIFIED BY语句或mysqladmin password号令设置口令,PASSWORD()函数是不必要的.他们都考虑到为你加密口令,多以你可像这样指定一个口令'biscuit': 

mysql> GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY 'biscuit';



shell> mysqladmin -u jeffrey password biscuit 

注意: PASSWORD()不是以在Unix口令加密的一样办法施行口令加密.你不该该假定假如你的Unix口令和你的MySQL口令是一样的,PASSWORD()将招致与在Unix口令文件被存储的一样的加密值.见6.2 MySQL 用户名和口令. 

6.13 Access denied错误的缘由

  • 当你试着联接MySQL服务器时,假如你碰到Access denied错误,显示在下面的表指出一些你能用来改正这个问题的行动: 

    你是在安装MySQL今后运行mysql_install_db的脚本,来设置初始受权表内容吗?假如不是,这样做.见6.10 设置初始MySQL权限.通过履行这个号令测试初始权限: 
    shell> mysql -u root test 

    服务器应当让你无误地衔接.你也应当保证你在MySQL数据库目录有一个文件"user.MYD".普通,它是"PATH/var/mysql/user.MYD",在此PATH是MySQL安装根目录的途径. 

  • 在一个新的安装今后,你应当衔接服务器并且设置你的用户及其存取答应: 
    shell> mysql -u root mysql 

    服务器应当让你衔接,因为MySQL root用户初始时没有口令.既然那也是一个安全风险,当你正在设置其他MySQL用户时,设定root口令是一件重要的事请.假如你作为root尝试衔接并且得到这个错误: 

    Access denied for user: '@unknown' to database mysql 

    这意味着,你没有一个条目在user表中的一个User列值为'root'并且mysqld不能为你的客库解析主机名.在这种情形下,你必须用--skip-grant-tables选项重启服务器并且编辑你的"/etc/hosts"或"windowshosts"文件为你的主机增添一个条目. 

  • 假如你从一个3.22.11从前的版本更新一个现存的MySQL安装到3.22.11版或今后版本,你运行了mysql_fix_privilege_tables脚本吗?假如没有,运行它.在GRANT语句变得能工作时,受权表的构造用MySQL 3.22.11改正 . 
  • 假如你直接对受权表做改正(利用INSERT或UPDATE语句)并且你的改变仿佛被忽视,记着,你必须发出一个FLUSH PRIVILEGES语句或履行一个mysqladmin flush-privileges号令招致服务器再次读入表,不然你的改变要道下一次服务器被重启时再见效.记着在你设定root口令今后,你将不需求指定它,直到在你清洗(flush)权限今后,因为服务器仍旧不会知道你改变了口令! 
  • 假如你的权限仿佛在一个会话(session)当中改变了,大概是一个超级用户改变了他们.再次装入受权表作用于新客户衔接,但是它也影响现存的衔接,如6.9 权限改变什么时刻见效小节所述. 
  • 为了测试,用--skip-grant-tables选项启动mysqld保护进程,然后你可以改变MySQL受权表并且利用mysqlaccess脚本查抄你的改正能否有如期的效果.当你对你的改变称心时,履行mysqladmin flush-privileges奉告mysqld服务器开始利用新的权限表.注意:再次装入受权表覆盖了--skip-grant-tables选项.这答应你奉告服务器开始利用受权表,而不用停掉并重启它. 
  • 假如你有一个Perl、Python或ODBC程序的存取问题,试着用mysql -u user_name db_name或mysql -u user_name -pyour_pass db_name与服务器衔接.假如你能用mysql客户衔接,这是你程序的一个问题而不是存取权限的问题.(注意在-p和口令之间没有空格;你也能利用--password=your_pass句法指定口令.) 
  • 假如你不能让口令工作,记得假如你用INSERT, UPDATE或SET PASSWORD语句设置口令,你必须利用PASSWORD()函数.假如你用GRANT ... INDENTIFIED BY语句或mysqladmin password号令指定口令,PASSWORD()函数是不需求的.见6.12 怎样设置口令. 
  • localhost是你本地主机名的一个同义词,并且也是假如你不明确地指定主机而客户尝试衔接的缺省主机.但是,假如你正在运行于一个利用MIT-pthreads的系统上,衔接localhost是不行的(localhost衔接利用Unix套接字举行,它没被 MIT-pthreads支持),为了在这样的系统上避免这个问题,你应当利用--host选项明确地命名服务器主机,这将做一个 TCP/IP衔接到mysqld服务器.在这种情形下,你必须有在服务器主机上的user表中条目的你真实的主机名.(即便你在服务器同一台的主机上运行一个客户程序,这也是真的.) 
  • 当尝试用mysql -u user_name db_name与数据库衔接时,假如你得到一个Access denied错误,你大概有与user桌有关的问题,通过履行mysql -u root mysql并且发出下面的SQL语句查抄: 
    mysql> SELECT * FROM user; 

    后果应当包含一个有Host和User列的条目匹配你的计算机主机名和你的MySQL用户名. 

  • Access denied错误消息将奉告你,你正在用哪个用户尝试登录,你正在试图用衔接哪个主机,并且你能否正在利用一个口令.普通,你应当在user表中有一个条目,精确地匹配在错误消息给出的主机名和用户名. 
  • 假如当你试着从一个不是MySQL服务器正在运行的主机上衔接时,你得到下列错误,那么在user表中没有匹配那台主机行: 
    Host ... is not allowed to connect to this MySQL server 

    你可以通过利用mysql号令行工具(在服务器主机上!)改正它,把你正在试图衔接的用户/主机名组合新加一行到user表中.假如你不在运行MySQL 3.22并且你不知道你正在从它衔接的机械的IP数字或主机名,你应当把一个'%'条目作为Host列值放在user表中并且在服务器机械上利用--log选项重启mysqld.在试图从客户机械衔接今后,在MySQL记录文件中的信息将显示你若何真正举行衔接.(然后用在记录文件上面显示出的实际的主机名替换user表中的'%'条目.不然,你将有一个不安全的系统.)

  • 假如mysql -u root test工作但是mysql -h your_hostname -u root test招致Access denied,那么在user表中你大概没有你的主机的精确名字.这里的一个广泛的问题是在user表条目中的Host值指定一个唯一的主机名,但是你系统的名字解析例程返回一个完好正规的域名(或相反).比方,假如你在user表中有一个主机是'tcx'的条目,但是你的 DNS奉告MySQL你的主机名是'tcx.subnet.se',条目将不工作.尝试把一个条目加到user表中,它包含你主机的IP数字作为Host列的值.(别的,你可以把一个条目加到user表中,它有包含一个通配符如'tcx.%'的Host值.但是,利用以"%"末尾的主机名是不安全的并且不举荐!) 
  • 假如mysql -u user_name test工作但是mysql -u user_name other_db_name不工作,对other_db_name,你在db表中没有没有一个条目列出. 
  • 当在服务器机械上履行mysql -u user_name db_name时,它工作,但是在别的客户机械上履行mysql -h host_name -u user_name db_name时,它却不工作,你没有把客户机械列在user表或db表中. 
  • 假如你不能弄懂得你为什么得到Access denied,从user表中删除全部Host包含通配符值的条目(包含"%"或"_"的条目).一个很广泛的错误是插入用Host='%'和User='some user'插入一个新条目,认为这将答应你指定localhost从同一台机械举行衔接.它不工作的缘由是缺省权限包含一个有Host='localhost'和User='的条目,因为那个条目一个比'%'更具体的Host值'localhost',当从localhost衔接时,它用于指向新条目!精确的步骤是插入Host='localhost'和User='some_user'的第2个条目,或删除Host='localhost'和User='条目. 
  • 假如你得到下列错误,你可以有一个与db或host表有关的问题: 
    Access to database denied

  • 假如从db表中挑选了在Host列有空值的条目,保证在host表中有一个或多个呼应的条目,指定应用db表中的哪些主机.假如在利用SQL号令SELECT ... INTO OUTFILE或LOAD DATA INFILE时,你得到错误,在user表中的你的条目大概启用file权限. 

  • 记着,客户程序将利用在配置文件或环境变量被指定了的衔接参数.假如当你不在号令行上指定他们时,一个客户仿佛正在发送错误的缺省衔接参数,查抄你的环境和在你的主目录下的".my.cnf"文件.你也可以查抄系统范围的MySQL配置文件,固然更不大概将在那边指定那个客户的衔接参数.见4.15.4 选项文件.假如当你没有任何选项运行一个客户时,你得到Access denied,确认你没在任何选项文件里指定一个旧的口令!见4.15.4 选项文件. 
  • 假如任何别的事情失利,用调试选项(比方,--debug=d,general,query)启动mysqld保护进程.这将打印有关尝试衔接的主机和用户信息,和发出的每个号令的信息.见G.1 调试一个MySQL服务器. 
  • 假如你有任何与MySQL受权表的别的问题,并且认为你必须邮寄这个问题到邮寄表,老是供应一个MySQL受权表的倾倒副本(dump).你可用mysqldump mysql号令倾倒数据库表.象平常一样,用mysqlbug脚本邮寄你的问题.在一些情形下你大概用--skip-grant-tables重启mysqld以便能运行mysqldump. 

6.14 怎样使MySQL安全以抵挡解密高手
当你衔接一个MySQL服务器时,你普通应当利用一个口令.口令不以明文在衔接上传输. 

全部别的信息作为能被任何人读懂的文本被传输.假如你耽忧这个,你可以利用紧缩协议(MySQL3.22和以上版本)使事情变得更难.乃至为了使一切更安全,你应当安装ssh(见http://www.cs.hut.fi/ssh).用它,你能在一个MySQL服务器与一个MySQL客户之间得到一个加密的TCP/IP衔接. 

为了使一个MySQL系统安全,激烈要求你考虑下列倡议: 

  • 对全部MySQL用户利用口令.记着,假如other_user没有口令,任何人能简单地用mysql -u other_user db_name作为任何别的的人登录.对客户机/服务器利用程序,客户可以指定任何用户名是常见的做法.在你运行它从前,你可以通过编辑mysql_install_db脚本改变全部用户的口令,或仅仅MySQL root的口令,象这样: 
    shell> mysql -u root mysql
    mysql> UPDATE user SET Password=PASSWORD('new_password')
               WHERE user='root';
    mysql> FLUSH PRIVILEGES;

  • 不要作为Unix的root用户运行MySQL保护进程.mysqld能以任何用户运行,你也可以创造一个新的Unix用户mysql使一切更安全.假如你作为别的Unix用户运行mysqld,你不需求改变在user表中的root用户名,因为MySQL用户名与Unix 用户名不要紧.你可以作为别的Unix用户编辑mysql.server启动脚本mysqld.普通这用su号令完成.关于更多的细节,见18.8 怎样作为一个普通用户运行MySQL. 
  • 假如你把一个Unix root用户口令放在mysql.server脚本中,确保这个脚本只能对root是可读的. 
  • 查抄那个运行mysqld的Unix用户是唯一的在数据库目录下有读/写权限的用户. 
  • 不要把process权限给全部用户.mysqladmin processlist的输出显示出当前履行的查询正文,假如别的的用户发出一个UPDATE user SET password=PASSWORD('not_secure')查询,被答应履行那个号令的任何用户大概看得到.mysqld为有process权限的用户保存一个额外的衔接, 以便一个MySQL root用户能登录并查抄,即便全部的正常衔接在利用. 
  • 不要把file权限给全部的用户.有这权限的任何用户能在拥有mysqld保护进程权限的文件系统那边写一个文件!为了使这更安全一些,用SELECT ... INTO OUTFILE生成的全部文件对每个人是可读的,并且你不能覆盖已经存在的文件.file权限也可以被用来读取任何作为运行服务器的Unix用户可存取的文件.这大概被滥用,比方,通过利用LOAD DATA装载"/etc/passwd"进一个数据库表,然后它能用SELECT被读入. 
  • 假如你不信任你的DNS,你应当在受权表中利用IP数字而不是主机名.原则上讲,--secure选项对mysqld应当使主机名更安全.在任何情形下,你应当非常当心地利用包含通配符的主机名! 

下列mysqld选项影响安全: 

--secure 
       由gethostbyname()系统调用返回的IP数字被查抄,确保他们解析回到本来的主机名.这对某些外人通过模拟别的主机得到存取权限变得更难.这个选项也增添一些聪明的主机名查抄.在MySQL3.21里,挑选缺省是关掉的,因为它有时它花很长时间履行反向解析.MySQL 3.22缓存主机名并缺省地启用了这个选项. 
--skip-grant-tables 
       这个选项招致服务器根本不利用权限系统.这给每个人以完好存取全部的数据库的权利!(通过履行mysqladmin reload,你能奉告一个正在运行的服务器再次开始利用受权表.) 
--skip-name-resolve 
       主机名不被解析.全部在受权表的Host的列值必须是IP数字或localhost. 
--skip-networking 
       在网络上不答应TCP/IP衔接.全部到mysqld的衔接必须经过Unix套接字举行.这个选项对利用MIT-pthreads的系统是不符合的,因为MIT-pthreads包不支持Unix套接字. 

-F5ofz

责任编辑:eight(2001-06-07 09:40)
  以上是“MySQL中文参考手册7(MySQL存取权限系统)grant设置密码password[MSSQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • Windows 搭配 IIS7 PHP MySQL 环境
  • mysql Out of memory (Needed 16777224 bytes)的错误办理
  • mysql提醒[Warning] Invalid (old?) table or database name问题的办理办法
  • mysql启用skip-name-resolve情势时呈现Warning的处理办法
  • mysql启用skip-name-resolve情势时呈现Warning的处理办法
  • MySQL Order By语法介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • mysql数据库插入速度和读取速度的调整记录
  • MySQL Order By索引优化办法
  • MySQL Order By用法分享
  • mysql #1062 –Duplicate entry ''1'' for key ''PRIMARY''
  • MySQL Order By Rand()效率解析
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .