仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 723|回复: 8
打印 上一主题 下一主题

[学习教程] 发一篇MySQL平安性指南 (2)(转)

[复制链接]
萌萌妈妈 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 20:11:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
“对于MySQL数据库,无论是在开发方面,还是支持方面,现在有大量强大的MySQL学习教程可以选择。每一个新手开发者可以轻松地使用MySQL数据库进行开发。MySQL平安性指南(2)

晏子


2.1.3数据库和表权限
以下权限使用于数据库和表上的操纵。

ALTER
同意你利用ALTERTABLE语句,这实际上是一个复杂的第一级权限,你必需由其他权限,这看你想对数据库实行甚么操纵。
CREATE
同意你创立数据库和表,但不同意创立索引。
DELETE
同意你从表中删除现有纪录。
DROP
同意你删除(丢弃)数据库和表,但不同意删除索引。
INDEX
同意你创立并删除索引。
REFERENCES
今朝不必。
SELECT
同意你利用SELECT语句从表中检索数据。对不触及表的SELECT语句就不用要,如SELECTNOW()或SELECT4/2。
UPDATE
同意你修正表中的已有的纪录。
2.1.4办理权限
以下权限使用于把持服务器或用户受权才能的操纵的办理性操纵。

FILE
同意你告知服务器读或写服务器主机上的文件。该权限不该该任意授与,它很伤害,见“躲避受权表风险”。服务器的确较审慎地坚持在必定局限内利用该权限。你只能读任何人都能读的文件。你正在写的文件必需不是现存的文件,这避免你迫使服务重视写主要文件,如/etc/passwd或属于他人的数据库的数据目次。
假如你受权FILE权限,确保你不以UNIX的root用户运转服务器,由于root可在文件体系的任何中央创立新文件。假如你以一个非特权用户运转服务器,服务器只能在给用户能会见的目次中创立文件。

GRANT
同意你将你本人的权限授与他人,包含GRANT。
PROCESS
同意你经由过程利用SHOWPROCESS语句或mysqladminprocess命令检察服务器内正在运转的线程(历程)的信息。这个权限也同意你用KILL语句或mysqladminkill命令杀逝世线程。
你老是能看到或杀逝世你本人的线程。PROCESS权限付与你对任何线程做这些事变的才能。

RELOAD
同意你实行大批的服务器办理操纵。你能够收回FLUSH语句,你也能指性mysqladmin的reload、refresh、flush-hosts、flush-logs、flush-privileges和flush-tables等命令。
SHUTDOWN
同意你用mysqladminshutdown封闭服务器。
在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.168B类子网的主机,而192.168.3.%婚配任安在192.168.3C类子网的主机。

%值婚配一切主机,并可用于同意一个用户从任何中央毗连。一个空缺的Host值同等于%。(破例:在db表中,一个空缺Host值寄义是“进一步反省host表”,该历程在“查询会见考证”中先容。)

从MySQL3.23起,你也能够指定带一个标明那些为用于收集地点的收集掩码的IP地点,如192.168.128.0/17指定一个17位收集地点并婚配其IP地点是192.168128前17位的任何主机。

User
用户名必需是笔墨的或空缺。一个空缺值婚配任何用户。%作为一个User值不料味着空缺,相反它婚配一个字面上的%名字,这大概不是你想要的。

当一个到来的毗连经由过程user表被考证而婚配的纪录包括一个空缺的User值,客户被以为是一个匿名用户。

PassWord
口令值能够是空或非空,不同意用通配符。一个空口令不料味着婚配任何口令,它意味着用户必需不指定口令。

口令以一个加密过的值存储,不是一个字面上的文本。假如你在Password列中存储一个照字面上的口令,用户将不克不及毗连!GRANT语句和mysqladminpassword命令为你主动加密口令,可是假如你用诸如INSERT、REPLACE、UPDATE或SETPASSWORD等命令,必定要用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表。
假如你在反省了一切表以后仍无权限,服务器回绝你实行查询的妄图。
用布尔运算的术语,受权表中的权限被服务器如许利用:

userORtables_privORcolumns_priv

你大概困惑为何后面的形貌只援用4个受权表,而实践上有5个。实践上服务器是如许反省会见权限:

userOR(dbANDhost)ORtables_privORcolumns_priv

第一个较复杂的表达式是由于host表不受GRANT和REVOKE语句影响。假如你老是用GRANT和REVOKE办理用户权限,你毫不必要思索host表。可是其事情道理你用该晓得:

当服务器反省数据库级权限时,它关于客户查找db表。假如Host列是空的,它意味着“反省host表以找出哪个主性能会见数据库”。
服务器在host表中查找有与来自db表的纪录不异的Db列值。假如没有host纪录婚配客户主机,则没有授与数据库级权限。假如这些纪录的任何一个切实其实有一个婚配毗连的客户主机的Host列值,db表纪录和host表纪录分离发生客户的数据库级权限。
但是,权限用一个逻辑AND(与)分离起来,这意味着除非一个给定的权限在两个表中都有,不然客户就不具有该权限。以这类体例,你能够在db表中授与一个基础的权限集,然后利用host表对特定的主机有选择地禁用它们。如你能够同意从你的域中的一切主机会见数据库,但封闭了那些在较不平安地区的主机的数据库权限。

后面的形貌毫无疑问使会见反省听起来一个相称庞大的历程,出格是你觉得服务器对你收回的每一个查询举行权限反省,但是此历程是很快的,由于服务器实在不从受权表对每一个查询查找信息,相反,它在启动时将表的内容读进内存,然后考证查询用的是内存中的正本。这年夜年夜进步了会见反省操纵的功能。但有一个十分分明的反作用。假如你间接修正受权表的内容,服务器将不晓得权限的改动。

比方,假如你用一条INSERT语句向user表到场一个新纪录来增添一个新用户,定名在纪录中的用户将不克不及毗连服务器。这对办理员老手(偶然对有履历的内行)是很狐疑的事变,事先办理办法很复杂:在你改动了它们以后告知服务重视载受权表内容,你能够发一条FLUSHPRIVILEGES或实行mysqladminflush-privileges(或假如你有一个不撑持flush-privileges的老版本,用mysqladminreload。)。

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权限的人无能除的事变:

CREATETABLEetc_passwd(pwd_entryTEXT);
LOADDATAINFILE"/etc/passwd"intoTABLEetc_passwd;
SELECT*FROMetc_passwd;

在收回这些语句后,用户已具有了你的口令文件的内容了。实践上,服务器上任何公然可读文件的内容都可被具有FILE权限的用户经由过程收集会见。

FILE权限也能被使用来伤害没有设置充足权限定的文件权限的体系上的数据库。这就是你为何应当设置数据目次只能由服务器读取的缘故原由。假如对应于数据库表的文件可被任何人读取,不但是用户服务器账号的用户可读,任何有FILE权限的用户也可经由过程收集毗连并读取它们。上面演示这个历程:

创立一个有一个LONGBLOB列的表:
USERtest;
CREATETABLEtmp(bLONGBLOB);

利用该表读取每一个对应于你想盗取的数据库表文件的内容,然后将表内容写进你本人数据库的一个文件中:

LOADDATAINFILE"./other_db/x.frm"INTOTABLEtmp
FIELDSESCAPEDBY""LINESTERMINATEDBY"";
SELECT*FROMtmpINTOOUTFILE"y.frm"
FIELDSESCAPEDBY""LINESTERMINATEDBY"";
DELETEFROMtmp;
LOADDATAINFILE"./other_db/x.ISD"INTOTABLEtmp
FIELDSESCAPEDBY""LINESTERMINATEDBY"";
SELECT*FROMtmpINTOOUTFILE"y.ISD"
FIELDSESCAPEDBY""LINESTERMINATEDBY"";
DELETEFROMtmp;
LOADDATAINFILE"./other_db/x.ISM"INTOTABLEtmp
FIELDSESCAPEDBY""LINESTERMINATEDBY"";
SELECT*FROMtmpINTOOUTFILE"y.ISM"
如今你具有了一个新表y,它包括other_db.x的内容而且你有全权会见它。
为制止让人以一样的体例打击,依据“第一部分外部平安性-回护你的数据目次”中的指令设置你的数据目次上的权限。你也能够在你启动服务器时利用--skip-show-database选项限定用户关于他们没用会见权限的数据库利用SHOWDATABASES和SHOWTABLES。这有助于避免用户找到关于它们不克不及会见的数据库和表的信息。

ALTER权限能以不但愿的体例利用。假定你想让user1能够会见table1但不克不及会见tables2。一个具有ALTER权限的用户能够经由过程利用ALTERTABLE将table2更名为table1来移花接木。

小心GRANT权限。两个由分歧权限但都有GRANT权限的用户可使相互的权力更壮大。

你碰到的问题可能已经在社区中被别的人已经问过,即使没有MySQL学习教程,你也可以提出问题或通过Google来搜索答案。社区的相关负责人士:“MySQL社区是活跃、友好和内容渊博的。”
乐观 该用户已被删除
沙发
发表于 2015-1-18 18:27:22 | 只看该作者
呵呵,这就是偶想说的
只想知道 该用户已被删除
板凳
发表于 2015-1-25 21:51:45 | 只看该作者
入门没那么困难,精通没那么容易
海妖 该用户已被删除
地板
发表于 2015-2-4 06:29:00 | 只看该作者
可以动态传入参数,省却了动态SQL的拼写。
萌萌妈妈 该用户已被删除
5#
 楼主| 发表于 2015-2-9 17:44:46 | 只看该作者
原来的计算字段其实和虚拟字段很像。只是管理方面好了而已,性能方面提高不多。但是SQL2005提供了计算字段的持久化,这就提高了查询的性能,但是会加重insert和update的负担。OLTP慎用。OLAP可以大规模使用。
6#
发表于 2015-2-27 14:15:34 | 只看该作者
多走走一此相关论坛,多看一些实例开发,多交流0经验,没什么的,我也是刚学没多久!加油
飘飘悠悠 该用户已被删除
7#
发表于 2015-3-9 09:29:17 | 只看该作者
很多书籍啊,不过个人认为看书太慢,还不如自己学。多做实际的东西,就会遇到很多问题,网上搜下解决问题。不断重复这个过程,在配合sql的F1功能。
兰色精灵 该用户已被删除
8#
发表于 2015-3-16 21:45:30 | 只看该作者
如果,某一版本可以提供强大的并发响应,但是没有Oracle的相应版本稳定,或者价格较贵,那么,它就是不适合的。
愤怒的大鸟 该用户已被删除
9#
发表于 2015-3-23 05:20:25 | 只看该作者
不好!如果出了错;不好调试;不好处理!其实web开发将代码分为3层:web层;业务逻辑层和数据访问层;一般对数据库的操作都在数据访问层来做;这样便于调试和维护!而且将来如果是换了数据库的话;你只需要改数据层的代码;其他层的基本可以不变!要是你在jsp中直接调用sql数据库;那么如果换了数据库呢?岂不都要改?如果报了异常呢?怎么做异常处理?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-21 19:43

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表