Author Archives: Sean

Linux改变文件或目录的访问权限命令

Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作。
 
  文件或目录的访问权限分为只读,只写和可执行三种。以文件为例,只读权限表示只允许读其内容,而禁止对其做任何的更改操作。可执行权限表示允许将该文件作为一个程序执行。文件被创建时,文件所有者自动拥有对该文件的读、写和可执行权限,以便于对文件的阅读和修改。用户也可根据需要把访问权限设置为需要的任何组合。
 
  有三种不同类型的用户可对文件或目录进行访问:文件所有者,同组用户、其他用户。所有者一般是文件的创建者。所有者可以允许同组用户有权访问文件,还可以将文件的访问权限赋予系统中的其他用户。在这种情况下,系统中每一位用户都能访问该用户拥有的文件或目录。
 
  每一文件或目录的访问权限都有三组,每组用三位表示,分别为文件属主的读、写和执行权限;与属主同组的用户的读、写和执行权限;系统中其他用户的读、写和执行权限。当用ls -l命令显示文件或目录的详细信息时,最左边的一列为文件的访问权限。例如:
 
  $ ls -l sobsrc. tgz
 
  -rw-r–r– 1 root root 483997 Ju1 l5 17:3l sobsrc. tgz
 
  横线代表空许可。r代表只读,w代表写,x代表可执行。注意这里共有10个位置。第一个字符指定了文件类型。在通常意义上,一个目录也是一个文件。如果第一个字符是横线,表示是一个非目录的文件。如果是d,表示是一个目录。
 
  例如:
 
  - rw- r– r–
 
  普通文件 文件主 组用户 其他用户
 
  是文件sobsrc.tgz 的访问权限,表示sobsrc.tgz是一个普通文件;sobsrc.tgz的属主有读写权限;与sobsrc.tgz属主同组的用户只有读权限;其他用户也只有读权限。
 
  确定了一个文件的访问权限后,用户可以利用Linux系统提供的chmod命令来重新设定不同的访问权限。也可以利用chown命令来更改某个文件或目录的所有者。利用chgrp命令来更改某个文件或目录的用户组。
 
  下面分别对这些命令加以介绍。
 
  chmod 命令
 
  chmod命令是非常重要的,用于改变文件或目录的访问权限。用户用它控制文件或目录的访问权限。
 
  该命令有两种用法。一种是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。
 
  1. 文字设定法
 
  chmod [who] [+ | – | =] [mode] 文件名?
 
  命令中各选项的含义为:
 
  操作对象who可是下述字母中的任一个或者它们的组合:
 
  u 表示“用户(user)”,即文件或目录的所有者。
 
  g 表示“同组(group)用户”,即与文件属主有相同组ID的所有用户。
 
  o 表示“其他(others)用户”。
 
  a 表示“所有(all)用户”。它是系统默认值。
 
  操作符号可以是:
 
  + 添加某个权限。
 
  - 取消某个权限。
 
  = 赋予给定权限并取消其他所有权限(如果有的话)。
 
  设置mode所表示的权限可用下述字母的任意组合:
 
  r 可读。
 
  w 可写。
 
  x 可执行。
 
  X 只有目标文件对某些用户是可执行的或该目标文件是目录时才追加x 属性。
 
  s 在文件执行时把进程的属主或组ID置为该文件的文件属主。方式“u+s”设置文件的用户ID位,“g+s”设置组ID位。
 
  t 保存程序的文本到交换设备上。
 
 u 与文件属主拥有一样的权限。
 
  g 与和文件属主同组的用户拥有一样的权限。
 
  o 与其他用户拥有一样的权限。
 
  文件名:以空格分开的要改变权限的文件列表,支持通配符。
 
  在一个命令行中可给出多个权限方式,其间用逗号隔开。例如:chmod g+r,o+r example
 
  使同组和其他用户对文件example 有读权限。
 
  2. 数字设定法
 
  我们必须首先了解用数字表示的属性的含义:0表示没有权限,1表示可执行权限,2表示可写权限,4表示可读权限,然后将其相加。所以数字属性的格式应为3个从0到7的八进制数,其顺序是(u)(g)(o)。
 
  例如,如果想让某个文件的属主有“读/写”二种权限,需要把4(可读)+2(可写)=6(读/写)。
 
  数字设定法的一般形式为:
 
  chmod [mode] 文件名?
 
 
 
  chgrp命令
 
 功能:改变文件或目录所属的组。
 
  语法:chgrp [选项] group filename?
 
  该命令改变指定指定文件所属的用户组。其中group可以是用户组ID,也可以是/etc/group文件中用户组的组名。文件名是以空格分开的要改变属组的文件列表,支持通配符。如果用户不是该文件的属主或超级用户,则不能改变该文件的组。
 
  该命令的各选项含义为:
 
  - R 递归式地改变指定目录及其下的所有子目录和文件的属组。
 
  chown 命令
 
  功能:更改某个文件或目录的属主和属组。这个命令也很常用。例如root用户把自己的一个文件拷贝给用户xu,为了让用户xu能够存取这个文件,root用户应该把这个文件的属主设为xu,否则,用户xu无法存取这个文件。
 
  语法:chown [选项] 用户或组 文件
 
  说明:chown将指定文件的拥有者改为指定的用户或组。用户可以是用户名或用户ID。组可以是组名或组ID。文件是以空格分开的要改变权限的文件列表,支持通配符。
 
 该命令的各选项含义如下:
 
  - R 递归式地改变指定目录及其下的所有子目录和文件的拥有者。
 
  - v 显示chown命令所做的工作。
 

Linux下PhpMyAdmin程序目录的安全管理

Linux下开发Web程序,现在很流行的开发方法为:用PHP开发Web程序,用Apache做Web Server,Mysql充当后台管理数据库。这种组合使得开发Web程序简单、安全、效率高。由于程序是在Linux下运行,虽免去了版权费用,对数据库的管理却少了Windows下的图形界面管理工具,因此使用起来有点困难。现在有了一套由php开发爱好者写的管理Linux下数据库的程序, phpMyAdmin可极好的解决使用的易用性问题。PhpMyAdmin对管理Linux下的数据库行之有效,用户可以通过web浏览器新建删除数据库,增加、删除、修改表结构和表数据,还可以通过表单形式提交查询语句,返回数据结果。因此,现在很多的Linux服务器都使用phpMyAdmin管理数据库。
  PhpMyAdmin是一套放在服务器端的通过浏览器界面管理的程序,因此,确保其目录安全性十分重要,否则,将导致数据被盗取甚至遭到恶意破坏。下面将详细讲述一般的防范措施。
 
一、 修改phpMyAdmin目录名:
 
  在不修改目录名前,其他人很容易洞察该目录名,造成安全隐患。如,假设一台Linux主机的域名为:www.test.com,那么不修改目录名的情况下,在地址栏中输入:www.test.com/phpMyAdmin/ 就将进入phpMyAdmin管理程序。因此如果将phpMyAdmin目录改名为一个别人不易知道的目录,如mynameadmin,这样,你在管理自己的数据库时,只要键入:www.test.com/mynameadmin/ 就可以通过浏览器管理数据库了。(注:下面仍将使用phpMyAdmin目录名,如果目录名已换,只需把phpMyAdmin改名为新的目录名即可。)
 
二、 对phpMyAdmin目录加用户身份验证:
  这是很多网站需要用户验证时普遍使用的方法,这样当用户第一次浏览进入该目录时,都将出现一个提示窗口,提示用户输入用户名和密码验证,其是通过使用Apache Server的标准 mod_auth模块实现的,具体操作方法如下:
 
  1、VI编辑Apache Server配置文件,确保文件中如下两句话没有加注释,如果这两句话前有"#"符号,去掉"#"号。
  DocumentRoot /data/web/apache/public/htdocs
  AccessFileName . htaccess
  AllOerride All
 
  2、passwd程序创建用户文件:
  htpasswd – c /data/web/apache/secrects/.htpasswd 88998
  其中,-c表示选项告诉htpasswd你想生成一个新的用户文件,/data/web/apache/secrects/ 是你想存放 .htpasswd 文件的目录,文件名称为 .htpasswd,88998 是在验证时所用到的用户名,敲如以上命令后,系统提示你输入密码,这个密码就是验证时所需要用到的密码,该密码在 .htpasswd 文件中是加密的。现在用more来查看 /data/web/apache/secrects/.htpasswd文件,可以看到其中有一行用户名和一串加密密码。
 
  3、创建 .htaccess 文件:
  使用文本编辑器,在目录 phpMyAdmin (如果已经改名,就是新的目录名)下创建 .htaccess 文件,在文件中加入如下语句:
  AuthName "用户验证"
  AuthType Basic
  AuthUserFile /data/web/apache/public/htdocs/phpMyAdmin/.htpasswd
require user 88998
  保存所做操作后,再去看phpMyAdmin目录,将提示验证窗口,输入刚用 htpasswd 命令创建的用户名和密码,即可进入该目录。
 
三、 增加基于主机的访问控制:
 
  在修改了目录名和增加访问验证机制后,应该说现在的phpMyAdmin已经很安全了,但由于phpMyAdmin目录一般只是数据库管理员使用,为防止别人还知道目录名称和验证密码,还可以增加如下的基于主机的访问控制,基于主机的访问是通过验证用户机器IP来实现的,即只有符合条件的IP才可以反问该目录,否则拒绝访问。
修改 .htaccess 文件如下:
 
  AuthName "用户验证"
  AuthType Basic
  AuthUserFile /data/web/apache/public/htdocs/phpMyAdmin/.htpasswd
require user 88998
 
  order deny,allow
  deny from all
  allow from 202.100.222.80
 
  这里增加了三条基于主机访问控制指令,其中第一条 order 指令的值是由一个逗号隔开的名单,这个名单表明了哪一个指令更高的优先权,第二条指令 deny 定义不能访问该目录的主机,第三条指令 allow 定义可以访问该目录的主机,这样,该目录除了IP地址为 202.100.222.80 的机器可以访问该目录之外,其他的都不能访问,读者可以把该地址该为用户数据库管理员IP。
 
  总结:通过以上三点相结合,就可很好的确保 phpMyAdmin 目录的安全,非数据库管理员将很难通过phpMyAdmin程序读取数据。这里所讲的是针对于phpMyAdmin目录进行讲述,其他目录如需加访问限制,也可依此方法操作。

MySQL数据库安全配置

MySQL数据库安全配置
 
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,那么我们的操作就不会被记录到这两个文件里了。
外部网络安全
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攻击请参考下面链接的文章:
 
 
各种编程语言该注意的问题:
 
1)所有Web程序:
a)尝试在Web表单输入单引号和双引号来测试可能出现的错误,并找出原因所在。
b)修改URL参数带的%22 (‘"’), %23 (‘#’), 和 %27 (”’)。
c)对于数字字段的变量,我们的应用程序必须进行严格的检查,否则是非常危险的。
d)检查用户提交的数据是否超过字段的长度。
e)不要给自己程序连接数据库的用户过多的访问权限。
 
2)PHP:
a)检查用户提交的数据在查询之前是否经过addslashes处理,在PHP 4.0.3以后提供了基于MySQL C API的函数mysql_escape_string()。
 
3)MySQL C API:
a)检查查询字串是否用了mysql_escape_string() API调用。
 
4)MySQL++:
a)检查查询字串是否用了escape和quote处理。
 
5)Perl DBI:
a)检查查询字串是否用了quote()方法。
 
6)Java JDBC:
a)检查查询字串是否用了PreparedStatement对象。
 
4、一些小窍门
 
1)如果不慎忘记了MySQL的root密码,我们可以在启动MySQL服务器时加上参数–skip-grant-tables来跳过授权表的验证 (./safe_mysqld –skip-grant-tables &),这样我们就可以直接登陆MySQL服务器,然后再修改root用户的口令,重启MySQL就可以用新口令登陆了。
 
2)启动MySQL服务器时加–skip-show-database使一般数据库用户不能浏览其它数据库。
 
3)启动MySQL服务器时加上–chroot=path参数,让mysqld守护进程运行在chroot环境中。这样SQL语句LOAD DATA INFILE和SELECT … INTO OUTFILE就限定在chroot_path下读写文件了。这里有一点要注意,MySQL启动后会建立一个mysql.sock文件,默认是在/tmp目录下。使用了chroot后,MySQL会在chroot_path/tmp去建立mysql.sock文件,如果没有chroot_path/tmp目录或启动MySQL的用户没有这个目录写权限就不能建立mysql.sock文件,MySQL会启动失败。比如我们加了–chroot=/usr/local/mysql/启动参数,那么最好建立一个启动MySQL的用户能写的/usr/local/mysql/tmp目录,当然我们也可以用–socket=path来指定mysql.sock文件的路径,但这个path一定要在chroot_path里面。
 
4)启动MySQL服务器时加上–log-slow-queries=file参数,这样mysqld会把SQL命令执行时间超过long_query_time的写入file文件。如果没有指定=file,mysqld默认会写到数据目录下的hostname-slow.log。如果只指定了filename,没有指定路径,那么mysqld也会把filename写到数据目录下。我们通过这个日志文件可以找出执行时间超长的查询语句,然后尽可能的优化它减轻MySQL服务器的负担。
 
5)如果我们只需本机使用MySQL服务,那么我们还可以加上–skip-networking启动参数使MySQL不监听任何TCP/IP连接,增加安全性。(非常推荐)
 
6)MySQL的更多mysqld启动选项请见MySQL手册4.16.4 mysqld Command-line Options
 

月薪多少能过上舒适的日子

  一直在寻找一个可以作为参照的城市,来衡量一下一个人的月薪能够在所在城市形成的生活标准!最后还是决定拿北京作为参照城市! 如,拿一个在北京月薪为5000.00元(税后)人民币的人,可以达到的生活水平作为参照点,那么达到同等的生活水平在其他城市需要多少的月薪来维持呢,下面一一指出(其中包括物价水平、居住成本、交通成本、城市现代化成都等诸多方面的因素。找找看有没有你所在的城市?而你的收入又是多少?
 
上海:5350元 广州:4750元 深圳:5280元 杭州:4980元
南京:3780元 无锡:3200元 苏州:4300元 济南:3120元
太原:1980元 银川:1100元 昆明:2800元 贵州:1600元
南昌:1200元 福州:3380元 厦门:4100元 青岛:4000元
天津:3150元 成都:1900元 重庆:2250元 长沙:2480元
兰州:1500元 郑州:2880元 西宁:1000元 武汉:2680元
秦皇岛:2550元 石家庄:2300元 哈尔滨:1700元 长春:1500元
沈阳:2100元 合肥:1680元 常州:3380元 温州:5020元
大连:3000元 呼和浩特:1700元 乌鲁木齐:2100元 拉萨:900元
西安:2080元 南宁:1300元 海口:2600元 三亚:2360元
澳门:8900元 香港:18500元 台北:11500元
 

当一颗7.62mm口径的步枪子弹以850 米/ 秒的速度射穿人体之后,都会发生些什么?

首先他会在正面射入点皮肤上留下一个直径不到1 厘米的小口,而弹头在经过身体时形成的巨大力量会震伤脏器,然后以570 米/ 秒的速度穿出人体,震波形成的出弹伤口直径有可能达到12厘米以上!如果是打在头上,创口将更为可怕,它将掀飞你1/3 的头盖骨?当年美国总统约翰。肯尼迪就是以这样一种方式殉国的,在现场录影中你可以看到这一点。      
  
  然后呢?如果弹头恰好击穿了动脉,在心脏泵血83.3毫升/ 秒的强大压力下,血液可以喷射到10米以外的地方。如果是在房间里,清理现场则变得很麻烦,你要洗净墙壁、家具和天花板上所有的血迹和被弹头带出的一些脏器残渣。      
  
  在中弹倒地时,人体中约有4000毫升血液。在其后短短的几秒钟里,出血量很快达到1000毫升。一个几秒钟前还鲜艳活泼、充满思想的人,现在立即就濒临死亡,这是指女性。如果是男性,只要400 毫升就够了。这个概念你可以通过化学实验室里的量筒转化为感性经验。
  
  失去知觉之后,身体肌肉松弛,也包括括约肌.受害人大小便失禁,这意味着除去血污之外,你还将被自己的排泄物弄脏。再之后人体开始变凉,那是因为室温(恒25°C )往往低于体温(恒36°C ),再加上肌肤是热的不良导体,所以原本健康弹性的人体最后摸起来竟象案板上明码标价的肉类食品。     
  
  死亡后尸体如果没有经过迅速处理,而是象游戏里那样被抛在一边,它不会自动变为一小滩血迹和几块红色POLYGON ,而是一直躺在那儿,并出现一些日常生活中难得一见的特征。     
  
  从视觉上,你感到恐惧。除去大量的血迹,你还将看到从创口渗流出的体液,溢出的内脏和外翻的黄色皮下脂肪。由于失血,死者皮肤呈青黄色,并且有一些褐色出血点。然后人体开始奇怪地浮肿膨胀,肤色渐渐变为深棕色,尤指热带地区死亡者。从嗅觉上,创口开始发出强烈的异味,开始它只是一种新鲜内脏的腥气,之后渐渐变为一种能刺伤脑神经的恶臭。伴随着这种视觉与听觉的交相辉映,一种昆虫开始在肥沃的尸体中产下自己白色的幼子……      
  
  另外如果穿防弹背心,子弹击中你后,仿佛一个8 磅的大锤重击你一下,你会向后猛倒,可能断几根肋骨,同时由于头部惯性,颈项薄弱,颈部神经被压折,你会晕过去。如果击中头盔,即使没击穿,头盔变形也会夹碎你的颅骨,或者折断颈项。      
  
  "我"亲眼看过56式60米距离击中人的大腿根部,进去一个小洞,连子弹带骨渣飞出来是一个碗那么大个洞,肌肉,血管全部一团糟,只好截肢了。     
  
  所以中了枪,决不会象电影那样,摸一下,没事儿