发一篇MySQL平安性指南(3)(转)
那时候Sybase已经诞生了6年的时间。至于其他值得关注的开源数据库,PostgreSQL将在2009年达到20岁的生日。虽然MySQL并不是市场上最年轻的数据库,但是却有更多成熟的数据库可供我们选择。MySQL平安性指南(3)晏子
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做的事变。记着在你间接修正受权表时,你将关照服务重视载受权表,不然他不晓得你的改动。你能够实行一个mysqladminflush-privileges或mysqladminreload命令强制一个重载。假如你健忘做这个,你会困惑为何服务器不做你想做的事变。
以下GRANT语句创立一个具有一切权的超等用户。包含受权给他人的才能:
GRANTALLON*.*TOanyname@localhostIDENTIFIEDBY"passwd"
WITHGRANTOPTION
该语句将在user表中为anyname@localhost创立一个纪录,翻开一切权限,由于这里是超等用户(全局)权限存储的中央,要用INSERT语句做一样的事变,语句是:
INSERTINTOuserVALUES("localhost","anyname",PASSWORD("passwd"),
"Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y")
你大概发明它不事情,这要看你的MySQL版本。受权表的布局已改动并且你在你的user表大概没有14个权限列。用SHOWCOLUMNS找出你的受权表包括的每一个权限列,响应地调剂你的INSERT语句。以下GRANT语句也创立一个具有超等用户身份的用户,可是只要一个单个的权限:
GRANTRELOADON*.*TOflush@localhostIDENTIFIEDBY"flushpass"
本例的INSERT语句比前一个复杂,它很简单列出列名并只指定一个权限列。一切别的列将设置为缺省的"N":
INSERTINTOuser(Host,Password,Reload)VALUES("localhost","flush",PASSWORD("flushpass"),"Y")
数据库级权限用一个ONdb_name.*子句而不是ON*.*举行受权:
GRANTALLONsample.*TOboris@localhostIDENTIFIEDBY"ruby"
这些权限不是全局的,以是它们不存储在user表中,我们仍旧必要在user表中创立一笔记录(使得用户能毗连),但我们也必要创立一个db表纪录纪录数据库集权限:
INSERTINTOuser(Host,User,Password)VALUES("localhost","boris",PASSWORD("ruby"))
INSERTINTOdbVALUES("localhost","sample_db","boris","Y","Y","Y","Y","Y","Y","N","Y","Y","Y")
"N"列是为GRANT权限;对开端的一个数据库级具有WITHGRANTOPTION的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的用户,用以下语句:
GRANTALLONsamp_db.*TOfred@*.snake.netIDENTIFIED"cocoa"
而fred可巧在服务器主机上有个账号,以是他试图毗连服务器:
%mysql-ufred-pcocoasamp_db
ERROR1045:Accessdeniedforuser:fred@localhost(Usingpassword:YES)
为何?
缘故原由是:
先思索一下mysql_install_db怎样创建初始权限表和服务器怎样利用user表纪录婚配客户毗连。在你用mysql_install_db初始化你的数据库时,它创立相似如许的user表:
HostUser
localhost
pit.snake.net
localhost
pit.snake.netroot
root
头两个纪录同意root指定localhost或主机名毗连当地服务器,后两个同意匿名用户从当地毗连。当增添fred用户后,
HostUser
localhost
pit.snake.net
localhost
pit.snake.net
%.snake.netroot
root
fred
在服务器启动时,它读取纪录并排序它们(起首按主机,然后按主机上的用户),越详细越排在后面:
HostUser
localhost
localhost
pit.snake.net
pit.snake.net
%.snake.netroot
root
fred
有localhost的两个纪录排在一同,而对root的纪录排在第一,由于它比空值更详细。pit.snake.net的纪录也相似。一切这些均是没有任何通配符的字面上的Host值,以是它们排在对fred纪录的后面,出格是匿名用户排在fred之前。
了局是在fred试图从localhost毗连时,Host列中的一个空用户名的纪录在包括%.snake.net的纪录前婚配。该纪录的口令是空的,由于缺省的匿名用户没有口令。由于在fred毗连时指定了一个口令,由一个错配且毗连失利。
这里要记着的是,固然用通配符指定用户能够从其毗连的主机是很便利。但你从当地主机毗连时会有成绩,只需你在table表中保存匿名用户纪录。
一样平常地,倡议你删除匿名用户纪录:
mysql>DELETEFROMuserWHEREUser="";
更进一步,同时删除其他受权表中的任何匿名用户,有User列的表有db、tables_priv和columns_priv。
附录2使一个新的MySQL安装更平安
在你本人安装了一个新的MySQL服务器后,你必要为MySQL的root用户指定一个目次(缺省无口令),不然假如你健忘这点,你将你的MySQL处于极不平安的形态(最少在一段工夫内)。
在Unix(linux)上,在依照手册的指令安装好MySQL后,你必需运转mysql_install_db剧本创建包括受权表的mysql数据库和初始权限。在Windows上,运转分发中的Setup程序初始化数据目次和mysql数据库。假定服务器也在运转。
当你第一次在呆板上安装MySQL时,mysql数据库中的受权表是如许初始化的:
你能够从当地主机(localhost)上以root毗连而不指定口令。root用户具有一切权限(包含办理权限)并可做任何事变。(特地申明,MySQL超等用户与Unix超等用户有不异的名字,他们相互毫有关系。)
匿名会见被授与用户可从当地毗连名为test和任何名字以test_入手下手的数据库。匿名用户可对数据库做任何事变,但无办理权限。
从当地主机多服务器的毗连是同意的,不论毗连的用户利用一个localhost主机名或实在主机名。如:
%mysql-hlocalhosttest
%mysql-hpit.snake.nettest
你以root毗连MySQL乃至不指定口令的现实只是意味着初始安装不平安,以是作为办理员的你起首要做的应当是设置root口令,然后依据你设置口令利用的办法,你也能够告知服务重视载受权表是它晓得这个改动。(在服务器启动时,它重载表到内存中而大概不晓得你已修正了它们。)
对MySQL3.22和以上版本,你能够用mysqladmin设置口令:
%mysqladmin-urootpasswordyourpassword
关于MySQL的任何版本,你能够用mysql程序并间接修正mysql数据库中的user受权表:
%mysql-urootmysql
mysql>UPDATEuserSETpassword=PASSWORD("yourpassword")WHEREUser="root";
假如你有MySQL的老版本,利用mysql和UPDATE。
在你设置完口令后,经由过程运转以下命令反省你是不是必要告知服务重视载受权表:
%mysqladmin-urootstatus
假如服务器仍旧让你以root而不指定口令而毗连服务器,重载受权表:
%mysqladmin-urootreload
在你设置了root的口令后(而且假如必要重载了受权表),你将必要在任什么时候候以root毗连服务器时指定口令。
有的时候,一些缺失的功能可以通过别的办法来实现,例如,在MySQL4.1以前,你可以通过使用join方法来替代子查询的功能。在MySQL5.0中,大多数关系型数据库所要求的功能已经都具备。 相信各位对数据库和怎么样学习数据库都有一些经验和看法,也会有人走了一些弯路总结出自己的经验来,希望大家能把各自的看法和经验拿出来分享,给别人一份帮助,给自己一份快乐 习惯敲命令行的朋友可能会爽一些。但是功能有限。适合机器跑不动SQLServerManagementStudio的朋友使用。 但是随着数据量的增大,这种成本差距会逐渐减小,趋于相等。(500万数量级只相差10%左右) 以前的DTS轻盈简单。但是现在的SSIS虽然功能强大了很多,但是总是让人感觉太麻烦。看看论坛中询问SSIS的贴子就知道。做的功能太强大了,往往会有很多用户不会用了 还不是性能有问题!否则面向对象的数据库早就实现了!建议使用CLR的地方一般是和应用的复杂程度或操作系统环境有很高的耦合度的场景。如你想构建复杂的算法,并且用到了大量的指针和高级数据模型。 理解了存储结构,再阅读下性能优化的章节基本上会对sqlserver有个清晰地认识 很多书籍啊,不过个人认为看书太慢,还不如自己学。多做实际的东西,就会遇到很多问题,网上搜下解决问题。不断重复这个过程,在配合sql的F1功能。 而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~
页:
[1]