• Mysql数据库的安适设置、适用妙技名堂


     滥觞:网海拾贝  




    简述: 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进攻请参考上面链接的文章:

      http://www.spidynamics.com/papers/SQLInjectionWhitePaper.pdf

      http://www.ngssoftware.com/papers/advanced_sql_injection.pdf

      种种编程言语理把稳的效果:

      1)全数Web顺序:

      a)考试考试在Web表单输出单引号和双引号来测试可能泛起的错误,并找出原因地址。

      b)改削URL参数带的" ("), # (#), 和 ' ()。

      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








    版权声明: 原创作品,同意转载,转载时请务必以超链接方式标明文章 原始出处 、作者信息和本声明。不然将究查法律责任。

  • 相关阅读:
    施密特触发器
    51单片机独立键盘原理
    51单片机独立键盘原理
    hdu3085 Nightmare Ⅱ
    hdu3085 Nightmare Ⅱ
    复制一颗二叉树
    复制一颗二叉树
    判断一颗二叉树是不是完全二叉树
    判断一颗二叉树是不是完全二叉树
    求二叉树的深度及每一个节点的深度
  • 原文地址:https://www.cnblogs.com/zgqjymx/p/1975825.html
Copyright © 2020-2023  润新知