Category Archives: Linux

Find命令

下面就详细为大家介绍强大的“find”命令的全部使用方法和用途。
  
  透过文件名查法︰
  
  这个方法说起来就和在WINDOWS下查 文件一样容易理解了。如果你把这个文件放在单个的活页夹里面,只要使用常见的“ls"命令就能方便的查 出来,那么使用“find”命令来查 它就不能给你留下深刻的印象,毕竟“find”命令的强大功能不止这个。如果知道了某个文件的文件名,而不知道这个文件放到哪个活页夹,甚至是层层套嵌的活页夹里。举例说明,假设你忘记了httpd.conf这个文件在系统的哪个目录下,甚至在系统的某个地方也不知道,则这是可以使用如下命令︰
  
  find / -name httpd.conf
  
  这个命令语法看起来很容易就明白了,就是直接在find后面写上 -name,表明要求系统按照文件名查 ,最后写上httpd.conf这个目标文件名即可。稍等一会系统会在计算器屏幕上显示出查 结果列表︰
  
  etc/httpd/conf/httpd.conf
  
  这就是httpd.conf这个文件在Linux系统中的完整路径。查成功。
  
  如果输入以上查命令后系统并没有显示出结果,那么不要以为系统没有执行find/ -name httpd.conf命令,而可能是你的系统中没有安装Apache服务器,这时只要你安装了Apache Web服务器,然后再使用find / -name httpd.conf就能找到这个配置文件了。
  
  无错误查技巧︰
  
  在Linux系统中“find”命令是大多数系统用户都可以使用的命令,并不是ROOT系统管理员的专利。但是普通用户使用“find”命令时也有可能遇到这样的问题,那就是Linux系统中系统管理员ROOT可以把某些文件目录设置成禁止访问模式。这样普通用户就没有权限用“find”命令来查询这些目录或者文件。当普通用户使用“find”命令来查询这些文件目录是,往往会出Permissiondenied."(禁止访问)字样。系统将无法查询到你想要的文件。为了避免这样的错误,我们可是使用转移错误提示的方法尝试着查文件,输入find / -name access_log 2>/dev/null
  
  这个方法是把查 错误提示转移到特定的目录中去。系统执行这个命令后,遇到错误的讯息就直接输送到stderrstream 2 中,access_log 2就是表明系统将把错误讯息输送到stderrstream 2中,/dev/null是一个特殊的文件,表明空的或者错误的讯息,这样查询到的错误讯息将被转移了,不会再显示了。
  
  在Linux系统查 文件也会遇到这样一个实际问题。如果我们在整个硬盘,这个系统中查 某个文件就要花费相当长的一段时间,特别是大型Linux系统和容量较大的硬盘,文件放在套嵌很深的目录中的时候。如果我们知道了这个文件存放在某个大的目录中,那么只要在这个目录中往下找就能节省很多时间了。使用find /etc -name httpd.conf
  就可以解决这个问题。上面的命令就是表示在etc目录中查询httpd.conf这个文件。
  这里再说明一下“/ ”这个函数符号的含义,如果输入 “find/ ”就是表示要求Linux系统在整个ROOT目录下查 文件,也就是在整个硬盘上查 文件,而“find/etc”就是只 在 etc目录下查 文件。因为“find/etc”表示只在etc目录下查 文件,所以查 的速度就相应要快很多了。
  
  根据部分文件名查 方法︰
  
  这个方法和在WINDOWS中查 已知的文件名方法是一样的。不过在Linux中根据部分文件名查 文件的方法要比在WINDOWS中的同类查 方法要强大得多。例如我们知道某个文件包含有srm这3个字母,那么要找到系统中所有包含有这3个字母的文件是可以实现的,输入︰
  
  
  find /etc -name ‘*srm*’
  
  这个命令表明了Linux系统将在/etc整个目录中查 所有的包含有srm这3个字母的文件,比如 absrmyz, tibc.srm等等符合条件的文件都能显示出来。如果你还知道这个文件是由srm 这3个字母打头的,那么我们还可以省略最前面的星号,命令如下︰
  
  find/etc -name ‘srm*’
  
  这是只有像srmyz 这样的文件才被查 出来,象absrmyz或者 absrm这样的文件都不符合要求,不被显示,这样查 文件的效率和可靠性就大大增强了。
  
  根据文件的特征查询方法︰
  
  如果只知道某个文件的大小,修改日期等特征也可以使用“find”命令查 出来,这和WINDOWS系统中的"搜索"功能是基本相同的。在微软的"搜索"中WINDOWS中的"搜索助理"使得搜索文件和活页夹、打印机、用户以及网络中的其它计算器更加容易。它甚至使在Internet 上搜索更加容易。"搜索助理"还包括一个索引服务,该服务维护了计算器中所有文件的索引,使得搜索速度更快。使用"搜索助理"时,用户可以指定多个搜索标准。
  例如,用户可以按名称、类型及大小搜索文件和活页夹。用户甚至可以搜索包含特定文本的文件。如果用户正使用 Active Directory,这时还可以搜索带有特定名称或位置的打印机。
  
  例如我们知道一个Linux文件大小为1,500 bytes,那么我们可是使用如下命令来查询
  find / -size 1500c,字符 c 表明这个要查 的文件的大小是以bytes为单位。如果我们连这个文件的具体大小都不知道,那么在Linux中还可以进行模糊查 模式来解决。
  例如我们输入find/ -size +10000000c 这个命令,则标明我们指定系统在根目录中查出大于10000000字节的文件并显示出来。命令中的“+”是表示要求系统只列出大于指定大小的文件,而使用“-”则表示要求系统列出小于指定大小的文件。下面的列表就是在Linux使用不同“ find"命令后系统所要作出的查 动作,从中我们很容易看出在Linux中使用“find"命令的模式是很多的,“ find"命令查 文件只要灵活应用,丝毫不必在WINDOWS中查 能力差。
  
  
  find / -amin -10 # 查 在系统中最后10分钟访问的文件
    find / -atime -2 # 查 在系统中最后48小时访问的文件
    find / -empty # 查 在系统中为空的文件或者活页夹
    find / -group cat # 查 在系统中属于 groupcat的文件
    find / -mmin -5 # 查 在系统中最后5分钟里修改过的文件
    find / -mtime -1 #查 在系统中最后24小时里修改过的文件
    find / -nouser #查 在系统中属于作废用户的文件
    find / -user fred #查 在系统中属于FRED这个用户的文件
  
  下面的列表就是对find命令所可以指定文件的特征进行查 的部分条件。在这里并没有列举所有的查 条件,参考有关Linux有关书籍可以知道所有find命令的查函数。
    -amin n
    查 系统中最后N分钟访问的文件
    -atime n
    查 系统中最后n*24小时访问的文件
    -cmin n
    查 系统中最后N分钟被改变状态的文件
    -ctime n
    查 系统中最后n*24小时被改变状态的文件
    -empty
    查 系统中空白的文件,或空白的文件目录,或目录中没有子目录的活页夹
    -false
    查 系统中总是错误的文件
    -fstype type
    查 系统中存在于指定文件系统的文件,例如︰ext2 .
    -gid n
    查 系统中文件数字组 ID 为 n的文件
    -group gname
    查 系统中文件属于gnam文件组,并且指定组和ID的文件
  
  Find命令的控制选项说明︰
  
    Find命令也提供给用户一些特有的选项来控制查 操作。下表就是我们总结出的最基本,最常用的find命令的控制选项及其用法。
    
    用途描述
    -daystart
    .测试系统从今天开始24小时以内的文件,用法类似-amin
    -depth
    使用深度级别的查 过程模式,在某层指定目录中优先查 文件内容
    -follow
    遵循通配符链接模式查 ; 另外,也可忽略通配符链接模式查询
    -help
    显示命令摘要
    -maxdepth levels
    在某个层次的目录中按照递减方法查
    -mount
    不在文件系统目录中查 , 用法类似 -xdev.
    -noleaf
    禁止在非UNUX文件系统,MS-DOS系统,CD-ROM文件系统中进行最优化查
    -version
    打印版本数字
  
  使用-follow选项后,find命令则遵循通配符链接模式进行查 ,除非你指定这个选项,否则一般情况下find命令将忽略通配符链接模式进行文件查 。
  
  -maxdepth选项的作用就是限制find命令在目录中按照递减模式查 文件的时候搜索文件超过某个级别或者搜索过多的目录,这样导致查 速度变慢,查 花费的时间过多。
  例如,我们要在当前(.)目录技巧子目录中查 一个名叫fred的文件,我们可以使用如下命令
  
  find . -maxdepth 2 -name fred
  
  假如这个fred文件在./sub1/fred目录中,那么这个命令就会直接定位这个文件,查很容易成功。假如,这个文件在./sub1/sub2/fred目录中,那么这个命令就无法查到。因为前面已经给find命令在目录中最大的查询目录级别为2,只能查 2层目录下的文件。这样做的目的就是为了让find命令更加精确的定位文件,如果你已经知道了某个文件大概所在的文件目录级数,那么加入-maxdepth n 就很快的能在指定目录中查成功。
  
  使用混合查模式查文件
  
  find命令可以使用混合查 的方法,例如我们想在/tmp目录中查 大于100000000字节并且在48小时内修改的某个文件,我们可以使用-and 来把两个查 选项链接起来组合成一个混合的查 模式。
  
  find /tmp -size +10000000c -and -mtime +2
  
  学习过计算器语言的朋友都知道,在计算器语言里,使用and ,or 分别表示“与”和“或”的关系。在Linux系统的查 命令中一样通用。
  
  还有这样的例子,
  
  find / -user fred -or -user george
  
  我们可以解释为在/tmp目录中查 属于fred或者george这两个用户的文件。
  
  在find命令中还可以使用“非”的关系来查 文件,如果我们要在/tmp目录中查 所有不属于panda的文件,使用一个简单的
  
  find /tmp ! -user panda
  
  命令就可以解决了。很简单。
  
  查并显示文件的方法
  
  查到某个文件是我们的目的,我们更想知道查 到的文件的详细讯息和属性,如果我们采取现查 文件,在使用LS命令来查看文件讯息是相当繁琐的,现下我们也可以把这两个命令结合起来使用。
  
  find / -name "httpd.conf" -ls
  
  系统查 到httpd.conf文件后立即在屏幕上显示httpd.conf文件讯息。
  
  12063 34 -rw-r–r– 1 root root 33545 Dec 30 15:36 /etc/httpd/conf/httpd.conf
  
  下面的表格就是一些常用的查 文件并显示文件讯息的参数和使用方法
  
  选项
    用途描述
    -exec command;
    查 并执行命令
    -fprint file
    打印文件完整文件名
    -fprint0 file
    打印文件完整文件名包括空的文件
    -fprintf file format
    打印文件格式
    -ok command;
    给用户命令执行操作,根据用户的Y 确认输入执行
    -printf format
    打印文件格式
    -ls
    打印同种文件格式的文件.

对Linux的文件权限的理解

一个文件都有一个所有者, 表示该文件是谁创建的. 同时, 该文件还有一个组编号, 表示该文件所属的组,
一般为文件所有者所属的组.
 
如果是一个可执行文件, 那么在执行时, 一般该文件只拥有调用该文件的用户具有的权限.而setuid, setgid 可以来改变这种设置.
setuid: 设置使文件在执行阶段具有文件所有者的权限. 典型的文件是 /usr/bin/passwd.
如果一般用户执行该文件, 则在执行过程中, 该文件可以获得root权限, 从而可以更改用户的密码.
setgid: 该权限只对目录有效. 目录被设置该位后,
任何用户在此目录下创建的文件都具有和该目录所属的组相同的组.
sticky bit: 该位可以理解为防删除位. 一个文件是否可以被某用户删除,主要取决于该文件所属的组是否对该用户具有写权限. 如果没有写权限,则这个目录下的所有文件都不能被删除, 同时也不能添加新的文件.
如果希望用户能够添加文件但同时不能删除文件, 则可以对文件使用sticky bit位.
设置该位后, 就算用户对目录具有写权限, 也不能删除该文件.
 
下面说一下如何操作这些标志:
操作这些标志与操作文件权限的命令是一样的, 都是 chmod. 有两种方法来操作,
1) chmod u+s temp — 为temp文件加上setuid标志. (setuid 只对文件有效)
chmod g+s tempdir — 为tempdir目录加上setgid标志 (setgid 只对目录有效)
chmod o+t temp — 为temp文件加上sticky标志 (sticky只对文件有效)
2) 采用八进制方式. 对一般文件通过三组八进制数字来置标志, 如 666, 777, 644等.
如果设置这些特殊标志, 则在这组数字之外外加一组八进制数字. 如 4666, 2777等.
这一组八进制数字三位的意义如下,
abc
a – setuid位, 如果该位为1, 则表示设置setuid
b – setgid位, 如果该位为1, 则表示设置setgid
c – sticky位, 如果该位为1, 则表示设置sticky
 
设置完这些标志后, 可以用 ls -l 来查看. 如果有这些标志, 则会在原来的执行标志位置上显示. 如
rwsrw-r– 表示有setuid标志,
rwxrwsrw- 表示有setgid标志
rwxrw-rwt 表示有sticky标志
那么原来的执行标志x到哪里去了呢? 系统是这样规定的, 如果本来在该位上有x,则这些特殊标志显示为小写字母 (s, s, t). 否则, 显示为大写字母 (S, S, T)
举例:
chmod 777 testlog <<====>> chmod u=wrx,g=wrx,o=wrx testlog
drwxrwxrwx 1 root root 0 Oct 18 20:42 testlog (d 说明该文件为一个目录)
User Group Other
wxr wxr wxr 字母表示
111 111 111 二进制表示
7 7 7 八进制表示
 
从右到左,每一个字母为一个二进制数,每三各字母为一个八进制数

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
 

vsftp使用虚拟用户 无法登陆的问题解决。。。。

偶然发现,自己少安装了一个包。。。。
libpam-mysql
关键的东西。。居然忘了。。我说怎么通不过验证。。。
下面是如何使虚拟用户每人单独的目录:
首先,在主配置文件中加入以下选项:
  user_config_dir=/etc/vsftpd/vsftpd_user_conf
  然后,生成/etc/vsftpd/vsftpd_user_conf目录,并在该目录下建立与特定虚拟用户同名的文件:
  [root@hpe45 root]# mkdir /etc/vsftpd/vsftpd_user_conf
  [root@hpe45 root]# cd /etc/vsftpd/vsftpd_user_conf
  [root@hpe45 vsftpd_user_conf]# touch xiaowang
  以上的操作为虚拟用户xiaowang建立了个人配置文件/etc/vsftpd/vsftpd_user_conf/xiaowang。接下来,在xiaowang的个人配置文件中将xiaowang的自家目录修改为/home/xiaowang,配置选项为:
  local_root=/home/xiaowang
  然后,新建xiaowang目录,并将权限设为vsftpdguest:
  [root@hpe45 vsftpd_user_conf]# mkdir /home/xiaowang
  [root@hpe45 vsftpd_user_conf]# chown vsftpdguest.vsftpdguest ./xiaowang
  [root@hpe45 vsftpd_user_conf]# chmod 600 /home/xiaowang
  经过以上设置,xiaowang登录VSFTPD后,用“pwd”指令就可以发现被自己被定位到自己的“/home/xiaowang”目录。
  从文件系统层次来看,由于“/home/xiaowang”目录的权限是属于vsftpdguest的,所以其他的虚拟用户同样也可以访问xiaowang的自家目录。解决这个问题也很简单,我们只需要让VSFTPD负责将虚拟用户限制在其自家目录,就可以避免虚拟用户的互相访问。