|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
《PHP+MYSQL WEB开发(第三版)》号称圣经级,(也许是个不错的选择(声明:作者没给我啥好处费,我也不是书托,隔着大老远,我连他老兄的面都没见过的说-_-)mysql|平安|平安性 MySQL平安性指南(2)
宣布日期: 2000-5-10
内容:
--------------------------------------------------------------------------------
MySQL平安性指南(2)
作 者: 晏子
2.1.3 数据库和表权限
以下权限应用于数据库和表上的操作。
ALTER
答应你利用ALTER TABLE语句,这实际上是一个复杂的第一级权限,你必需由其他权限,这看你想对数据库实行甚么操作。
CREATE
答应你创立数据库和表,但不答应创立索引。
DELETE
答应你从表中删除现有纪录。
DROP
答应你删除(丢弃)数据库和表,但不答应删除索引。
INDEX
答应你创立并删除索引。
REFERENCES
今朝不必。
SELECT
答应你利用SELECT语句从表中检索数据。对不触及表的SELECT语句就不用要,如SELECT NOW()或SELECT 4/2。
UPDATE
答应你修正表中的已有的纪录。
2.1.4 办理权限
以下权限应用于掌握办事器或用户受权才能的操作的办理性操作。
FILE
答应你告知办事器读或写办事器主机上的文件。该权限不该该随意授与,它很风险,见“躲避受权表风险”。办事器的确较慎重地坚持在必定局限内利用该权限。你只能读任何人都能读的文件。你正在写的文件必需不是现存的文件,这避免你迫使办事重视写主要文件,如/etc/passwd或属于他人的数据库的数据目次。
假如你受权FILE权限,确保你不以UNIX的root用户运转办事器,由于root可在文件体系的任何中央创立新文件。假如你以一个非特权用户运转办事器,办事器只能在给用户能会见的目次中创立文件。
GRANT
答应你将你本人的权限授与他人,包含GRANT。
PROCESS
答应你经由过程利用SHOW PROCESS语句或mysqladmin process号令检查办事器内正在运转的线程(历程)的信息。这个权限也答应你用KILL语句或mysqladmin kill号令杀逝世线程。
你老是能看到或杀逝世你本人的线程。PROCESS权限付与你对任何线程做这些工作的才能。
RELOAD
答应你履行大批的办事器办理操作。你可以收回FLUSH语句,你也能指性mysqladmin的reload、refresh、flush-hosts、flush-logs、flush-privileges和flush-tables等号令。
SHUTDOWN
答应你用mysqladmin shutdown封闭办事器。
在user、db和host表中,每个权限以一个独自的列指定。这些列全体声明为一个ENUM("N","Y")类型,所以每一个权的缺省值是“N”。在tables_priv和columns_priv中的权限以一个SET暗示,它答应权限用一个单个列以任何组合指定。这两个表比其他三个表更新,这就是为何它们利用更无效的暗示体例的缘由。(有能够在将来,user、db和host表也用一个SET类型暗示。)
在tables_priv表中的Table_priv列被界说成:
SET('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter')
在coloums_priv表中的Column_priv列被界说成:
SET('Select','Insert','Update','References')
列权限比表权限少,由于列级较少的权限成心义。例如你能创立一个表,但你不克不及创立一个孤立的列。
user表包括某些在其他受权表不存在的权限的列:File_priv、Process_priv、Reload_priv和Shutdown_priv。这些权限应用于你让办事器履行的与任何特定命据库或表不相干的操作。如答应一个用户依据以后数据库是甚么来封闭数据库是毫有意义的。
2.2 办事器若何掌握客户会见
在你利用MySQL时,客户会见掌握有两个阶段。第一阶段产生在你试图毗连办事器时。办事器查找user表看它是不是能找到一个条目婚配你的名字、你正在从那儿毗连的主机和你供应的口令。假如没有婚配,你就不克不及毗连。假如有一个婚配,创立毗连并持续第二阶段。在这个阶段,关于每个你收回的查询,办事器反省受权表看你是不是有足够的权限履行查询,第二阶段延续到你与办事器对话的停止。
本大节具体引见MySQL办事器用于将受权表条目婚配到来的毗连恳求或查询的准绳,这包含在受权表局限列中正当的值的类型、联合受权表中的权限信息的体例和表中条目被反省的次第。
2.2.1 局限列内容
一些局限列请求文字值,但它们大多半答应通配符或其他特别值。
Host
一个Host列值可所以一个主机名或一个IP地址。值localhost意味着当地主机,但它只在你用一个localhost主机名时才婚配,而不是你在利用主机名时。假设你的当地主机名是pit.snake.net而且在user表中有对你的两笔记录,一个有一个Host值或localhost,而另外一个有pit.snake.net,有localhost的纪录将只当你毗连localhost时婚配,其他在只在毗连pit.snake.net时才婚配。假如你想让客户能以两种体例毗连,你需求在user表中有两笔记录。
你也能够用通配符指定Host值。可使用SQL的形式字符“%”和“_”并具有当你在一个查询中利用LIKE算符一样的寄义(不答应regex算符)。 SQL形式字符都能用于主机名和IP地址。如%wisc.edu婚配任何wisc.edu域内的主机,而%.edu婚配任何教导学院的主机。相似地,192.168.%婚配任安在192.168 B类子网的主机,而192.168.3.%婚配任安在192.168.3 C类子网的主机。
%值婚配一切主机,并可用于答应一个用户从任何中央毗连。一个空白的Host值同等于%。(破例:在db表中,一个空白Host值寄义是“进一步反省host表”,该进程在“查询会见验证”中引见。)
从MySQL 3.23起,你也能够指定带一个标明那些为用于收集地址的收集掩码的IP地址,如192.168.128.0/17指定一个17位收集地址并婚配其IP地址是192.168128前17位的任何主机。
User
用户名必需是文字的或空白。一个空白值婚配任何用户。%作为一个User值不料味着空白,相反它婚配一个字面上的%名字,这能够不是你想要的。
当一个到来的毗连经由过程user表被验证而婚配的纪录包括一个空白的User值,客户被以为是一个匿名用户。
Password
口令值可所以空或非空,不答应用通配符。一个空口令不料味着婚配任何口令,它意味着用户必需不指定口令。
口令以一个加密过的值存储,不是一个字面上的文本。假如你在Password列中存储一个照字面上的口令,用户将不克不及毗连!GRANT语句和mysqladmin password号令为你主动加密口令,然而假如你用诸如INSERT、REPLACE、UPDATE或SET PASSWORD等号令,必定要用PASSWORD("new_password")而不是复杂的"new_password"来指定口令。
Db
在columns_priv和tables_priv表中,Db值必需是真实的数据库名(照字面上),不答应形式和空白。在db和host中,Db值可以以字面意义指定或利用SQL形式字符'%'或'_'指定一个通配符。一个'%'或空白婚配任何数据库。
Table_name,Column_name
这些列中的值必需是照字面意思的表或列名,不答应形式和空白。
某些局限列被办事器视为巨细写敏感的,其他不是。这些准绳总结鄙人表中。出格注重Table_name值老是被看做巨细写敏感的,即便在查询中的表名的巨细写敏理性看待视办事器运转的主机的文件体系而定(UNIX下是巨细写敏感,而Windows不是)。
表3 受权表局限列的巨细写敏理性
列
Host
User
Password
Db
Table_name
Column_name
巨细写敏理性
No
Yes
Yes
Yes
Yes
No
2.2.2 查询会见验证
每次你收回一个查询,办事器反省你是不是有足够的权限履行它,它以user、db、tables_priv和columns_priv的按次反省,晓得它肯定你有恰当的会见权限或已搜刮一切表而一无所得。更详细的说:
办事器反省user表婚配你入手下手毗连的纪录以检查你有甚么全局权限。假如你有而且它们对查询足够了,办事器则履行它。
假如你的全局权限不敷,办事器为你在db表中寻觅并将该纪录中的权限加到你的全局权限中。假如了局对查询足够,办事器履行它。
假如你的全局和数据库级组合的权限不敷,办事器持续查找,起首在tables_priv表,然后columns_priv表。
假如你在反省了一切表以后仍无权限,办事器回绝你履行查询的妄图。
用布尔运算的术语,受权表中的权限被办事器如许利用:
user OR tables_priv OR columns_priv
你能够困惑为何后面的描写只援用4个受权表,而实践上有5个。实践上办事器是如许反省会见权限:
user OR (db AND host) OR tables_priv OR columns_priv
第一个较复杂的表达式是由于host表不受GRANT和REVOKE语句影响。假如你老是用GRANT和REVOKE办理用户权限,你毫不需求思索host表。然而其任务道理你用该晓得:
当办事器反省数据库级权限时,它关于客户查找db表。假如Host列是空的,它意味着“反省host表以找出哪个主性能会见数据库”。
办事器在host表中查找有与来自db表的纪录不异的Db列值。假如没有host纪录婚配客户主机,则没有授与数据库级权限。假如这些纪录的任何一个切实其实有一个婚配毗连的客户主机的Host列值,db表纪录和host表纪录联合发生客户的数据库级权限。
但是,权限用一个逻辑AND(与)联合起来,这意味着除非一个给定的权限在两个表中都有,不然客户就不具有该权限。以这类体例,你可以在db表中授与一个根基的权限集,然后利用host表对特定的主机有选择地禁用它们。如你可以答应从你的域中的一切主机会见数据库,但封闭了那些在较不平安区域的主机的数据库权限。
后面的描写毫无疑问使会见反省听起来一个相当庞杂的进程,出格是你觉得办事器对你收回的每一个查询停止权限反省,但是此进程是很快的,由于办事器其实不从受权表对每一个查询查找信息,相反,它在启动时将表的内容读入内存,然后验证查询用的是内存中的正本。这大大进步了会见反省操作的功能。但有一个十分分明的反作用。假如你直接修正受权表的内容,办事器将不晓得权限的改动。
例如,假如你用一条INSERT语句向user表到场一个新纪录来增添一个新用户,定名在纪录中的用户将不克不及毗连办事器。这对办理员老手(有时对有经历的内行)是很猜疑的工作,事先处理办法很复杂:在你改动了它们以后告知办事重视载受权表内容,你可以发一条FLUSH PRIVILEGES或履行mysqladmin flush-privileges(或假如你有一个不撑持flush-privileges的老版本,用mysqladmin reload。)。
2.2.3 局限列婚配按次
MySQL办事器按一种特定体例排序符受权表中的纪录,然后经由过程顺次阅读纪录婚配到来的毗连。找到的第一个婚配决意了被利用的纪录。了解MySQL利用的排序按次很主要,出格是对user表。
当办事器读取user表内容时,它依据在Host和User列中的值排序纪录,Host值起决意感化(不异的Host值排在一同,然后再依据User值排序)。但是,排序不是典序(按词排序),它只是局部是。要切记的是字面上的词优先于形式。这意味着假如你正从client.your.net毗连办事器而Host有client.your.net和%.your.net两个值,则第一个先选。相似地,%.your.net优先于%.net,然后是%。IP地址的婚配也是如许的。
总之一句话,越详细越优先。可以拜见本文附录的实例。
2.3 防止受权表风险
本届引见一些在你受权时的一些预防办法,和不明值的选择带来的风险。普通地,你要很“小气”地授与超等用户权限,即不要启用user表中条目中的权限,而利用其它受权表,以将用户权限限制于数据库、表、或列。在user表中的权限答应于影响到你的办事器操作或能会见任何数据库中的任何表。
不要授与对mysql数据库的权限。一个具有包括受权表数据库权限的用户能够会修正表以获得对其他任何数据库的权限。授与答应一个用户修正mysql数据库表的权限也实践上给了用户以一个全局GRANT权限。假如用户能直接修正表,这也等价于可以收回任何你能想象的任何GRANT语句。
FILE权限特别风险,不要等闲受权它。以下是一个具有FILE权限的人无能除的工作:
CREATE TABLE etc_passwd (pwd_entry TEXT);
LOAD DATA INFILE "/etc/passwd" into TABLE etc_passwd;
SELECT * FROM etc_passwd;
在收回这些语句后,用户已具有了你的口令文件的内容了。实践上,办事器上任何公然可读文件的内容都可被具有FILE权限的用户经由过程收集会见。
FILE权限也能被使用来伤害没有设置足够权限制的文件权限的体系上的数据库。这就是你为何应当设置数据目次只能由办事器读取的缘由。假如对应于数据库表的文件可被任何人读取,不只是用户办事器账号的用户可读,任何有FILE权限的用户也可经由过程收集毗连并读取它们。上面演示这个进程:
创立一个有一个LONGBLOB列的表:
USER test;
CREATE TABLE tmp (b LONGBLOB);
利用该表读取每一个对应于你想盗取的数据库表文件的内容,然后将表内容写入你本人数据库的一个文件中:
LOAD DATA INFILE "./other_db/x.frm" INTO TABLE tmp
FIELDS ESCAPED BY "" LINES TERMINATED BY "";
SELECT * FROM tmp INTO OUTFILE "y.frm"
FIELDS ESCAPED BY "" LINES TERMINATED BY "";
DELETE FROM tmp;
LOAD DATA INFILE "./other_db/x.ISD" INTO TABLE tmp
FIELDS ESCAPED BY "" LINES TERMINATED BY "";
SELECT * FROM tmp INTO OUTFILE "y.ISD"
FIELDS ESCAPED BY "" LINES TERMINATED BY "";
DELETE FROM tmp;
LOAD DATA INFILE "./other_db/x.ISM" INTO TABLE tmp
FIELDS ESCAPED BY "" LINES TERMINATED BY "";
SELECT * FROM tmp INTO OUTFILE "y.ISM"
如今你具有了一个新表y,它包括other_db.x的内容而且你有全权会见它。
为防止让人以一样的体例进击,依据“第一局部 外部平安性-回护你的数据目次”中的指令设置你的数据目次上的权限。你也能够在你启动办事器时利用--skip-show-database选项限制用户关于他们没用会见权限的数据库利用SHOW DATABASES和SHOW TABLES。这有助于避免用户找到关于它们不克不及会见的数据库和表的信息。
ALTER权限能以不但愿的体例利用。假定你想让user1可以会见table1但不克不及会见tables2。一个具有ALTER权限的用户可以经由过程利用ALTER TABLE将table2更名为table1来移花接木。
小心GRANT权限。两个由分歧权限但都有GRANT权限的用户可使彼此的权力更壮大。 学校并没有那么多的时间可以让我们在实际开发上面。 |
|