千万个美丽的未来,抵不上一个温暖的现在,每一个真实的现在,都是我们曾经幻想的未来!
Nov
5
经过半天的努力终于将JSP+PHP+apache+resin在LINUX平台下全部配置完毕并完全整和通过测试成功
http://www.dfmqp.cn
本人的全部安装过程提供给LINUX爱好者共同分享,需要软件如下
resin:http://www.caucho.com/
jdk:http://java.sun.com/
apache:http://www.apache.org
mysql:http://www.mysql.com
php:http://www.php.net
jdbc:http://mmmysql.sourceforge.net/
本人所用的软件版本如下:
resin-3.0.0.tar.gz
j2sdk-_4_2_05-linux-i586.bin
httpd-2.0.52.tar.gz
mysql-4..9.tar.gz
php-4.3.0.tar.gz
mysql-connector-java-3..6.tar.gz
一.安装MYSQL
我把他全部下在到/root 目录下
# chmod 755 mysql-4..9.tar.gz
# tar xfz mysql-4..9.tar.gz
解压后生成mysql-4..9目录,我们进入该目录:
cd mysql-4..9
进入后就开始配置mysql了,配置过程中我们要给mysql设置一个安装目录,我们设置在 /usr/local/mysql 下,以为把文件放到一个地方比较容易管理,如果你还想获得更多的配置信息,使用 ./configure --help:
在这里我要特别强调在 编译的时候要选择好MYSQL的默认编码,因为如果不选择按默认安装的时候在JSP中就不支持GBK编码了
所以我这样编译
# ./configure --prefix=/usr/local/mysql --with-charset=gbk
然后等几秒钟,配置完成后就编译源代码
# make
这个编译的过程比较长,如果机器比较慢的话,可能要近二十分种 ( 我的是联想服务器都需要了5分钟 ) . 编译完成后就安装:
# make install
等上几秒钟,安装完成.下面就到了最关键的部分了,为什么老安装不成功,(至少我是安装了N次,N > 0 ,呵呵),问题关键就在这里,访问mysql要一个专门的用户,而且必须给相应的访问权限,这里我们就设置root和mysql有权限访问.
我们先建立一个mysql和mysql用户来访问mysql:
# groupadd mysql #建立mysql组
# useradd mysql -g mysql #建立mysql用户并且加入到mysql组中
建立用户后我们就初始化表 (注意:必须先执行本步骤后才能进行以下步骤)
# ./scripts/mysql_install_db --user=mysql #初试化表并且规定用mysql用户来访问初始化表以后就开始给mysql和root用户设定访问权限, 我们先到安装mysql的目录:
# cd /usr/local/mysql
然后设置权限
# chown -R root . #设定root能访问/usr/local/mysql
# chown -R mysql var #设定mysql用户能访问/usr/local/mysql/var ,里面存的是mysql的数据库文件
# chown -R mysql var/. #设定mysql用户能访问/usr/local/mysql/var下的所有文件
# chown -R mysql var/mysql/. #设定mysql用户能访问/usr/local/mysql/var/mysql下的所有文件
# chgrp -R mysql . #设定mysql组能够访问/usr/local/mysql
设置完成后,基本上就装好了,好了,我们运行一下我们的mysql:
# /usr/local/mysql/bin/mysqld_safe --user=mysql &
如果没有问题的话,应该会出现类似这样的提示:
[] 42264
# Starting mysqld daemon with databases from /usr/local/mysql/var
这就证明你安装成功了
用如下命令修改MYSQL密码,默认安装密码为空,为了安全你必须马上修改
/usr/local/mysql/bin/mysqladmin -uroot password pengyong
现在修改的密码为:pengyong
二、安装jdk
# chmod 755 j2sdk-_4_2_05-linux-i586.bin
# ./j2sdk-_4_2_05-linux-i586.bin 释放j2sdk-_4_2_05-linux-i586.bin
在/root目录下生成j2sdk.4.2_05目录和文件我是将JDK装到/usr/java/目录下
将文件剪切到/usr/java/目录下
# mv j2sdk.4.2_05/ /usr/java/
设置JDK变量环境
# vi /etc/profile
# /etc/profile
JAVA_HOME=/usr/java/j2sdk.4.2_05
RESIN_HOME=/usr/resin
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/htmlco
nverter.jar:$RESIN_HOME/lib:/usr/java/jdbc/mysql-connector-java-3..6-bin.jar
退出当前登录的环境,重新登录,这样刚刚设定的环境变量就会生效,然后用如下命令测试:
[root@LINUX root]# echo $JAVA_HOME
/usr/java/j2sdk.4.2_05
[root@LINUX root]# echo $CLASSPATH
.:/usr/java/j2sdk.4.2_05/lib/dt.jar:/usr/java/j2sdk.4.2_05/lib/tools.jar:/usr/
java/j2sdk.4.2_05/lib/htmlconverter.jar:/usr/resin/lib:/usr/java/jdbc/mysql-con
nector-java-3..6-bin.jar
[root@LINUX root]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bi
n:/usr/local/sbin:/usr/bin/X:/usr/java/j2sdk.4.2_05/bin:/usr/XR6/bin:/root/
bin
[root@LINUX root]# java -version
java version ".4.2_05"
Java(TM) 2 Runtime Environment, Standard Edition (build .4.2_05-b04)
Java HotSpot(TM) Client VM (build .4.2_05-b04, mixed mode)
看到类似信息就表示jdk环境已经好了。其实在上面的/etc/profile中,我们不仅仅设置了jdk的环境变量,还一并设置了resin和jdbc的环境变量,这些都是后面安装resin所必需的设定
三、安装mysql的jdbc
# tar xfz mysql-connector-java-3..6.tar.gz
# mv mysql-standard-4.0.23-pc-linux-i686/ /usr/java/ 将解压的文件剪切到/usr/java/目录下。
# cd /usr/java/
# ln -s mysql-standard-4.0.23-pc-linux-i686/ jdbc 创建JDBC的软连接与/usr/java/目录下
四、安装apache
# chmod 755 httpd-2.0.52.tar.gz
# tar xfz httpd-2.0.52.tar.gz
# cd httpd-2.0.52
开始配置APACHE
# ./configure --prefix=/usr/java/httpd2 --enable-module=most --enable-shared=max
察看编译进apache的模块:
#/usr/java/httpd2/bin/httpd -l
[root@LINUX root]# /usr/java/httpd2/bin/httpd -l
compiled-in modules:
http_core.c
mod_so.c
看到以上的信息表明apache支持dso方式了。这样就可以用dso的方式把php和resin的模块加进来。
五、安装php
我们使用的PHP版本是4.3.0,先去下载: http://www.php.net/downloads.php, 下回来的包叫做 php-4.3.0.tar.gz, 放到/usr/local/src目录下.
首先进入该目录后解压缩:
# cd /usr/local/src
# tar xfz php-4.3.0.tar.gz
解压后进入目录:
# cd php-4.3.0
进行配置,这一步比较关键,一定要设置好,特别是要考虑到你要支持什么,比如GD库,xml,mysql等等,如果想知道详细的配置,执行 ./configure --help来获得:
# ./configure --with-mysql=/usr/java/mysql --with-apxs=/usr/java/httpd2/bin/apxs
果上面的配置没有错误的话,那么应该最后会显示感谢使用PHP等字样,那么证明配置成功,如果上面的配置选项不支持的话,会提示错误.
比如你没有安装mysql,那么--with-mysql就无法使用,所以一定要注意对应选项系统是否能够支持,如果出现错误,那么就先安装对应的程序,或者去掉相关选项,配置之后就进行编译:
# make
编译成功后出现"Build complete."字样,那么就可以进行安装了:
# make install
安装完成后把/usr/local/src/php-4.3.8/php.ini-dist复制到/usr/local/lib/,并重命名为php.ini
# cp /usr/local/src/php-4.3.0/php.ini-dist /usr/local/lib/php.ini
基本到这里PHP就安装成功了,如果中间出现错误,除了在配置的时候没有选对选项之后一般都不出现错误.
为了让Apache能够直接解析php,我们还要进行一些配置.
# vi /usr/java/httpd/conf/httpd.conf
在httpd.conf文件中,添加
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
应该将以上两句添加在其他AddType之后。
确保文件中有以下一句话,没有就自己添加在所有LoadModule之后。
LoadModule php4_module modules/libphp4.so
好了,在vi中使用":wq"保存httpd.conf文件,退出vi。启动apache server:
# /usr/java/httpd2/bin/apachectl restart
现在apache就能够运行php了,写个文件测试一下,在/usr/java/httpd2/htdocs目录下,新建一个phpinfo.php文件,
文件中只有一行代码:
<? phpinfo(); ?>
保存此文件, 在你的浏览器中输入http://localhost/phpinfo.php,你应该看到PHP的系统信息。
如果出现错误,比如提示你下灾phpinfo.php,那么apache就是还无法解析php文件,那么请仔细检查以上的操作是否正确.
六.安装resin
下载的resin的安装包解开后应该可以直接单独运行的。笔者将其解开后放到/usr/java/目录下
# tar xfz resin-3.0.0.tar.gz
# mv resin-3.0.0 /usr/java/
# cd /usr/java/
# ln -s resin-3.0.0/ resin
启动resin
# /usr/java/resin/bin/httpd.sh start
现在就能够从http://localhost:8080/上能看到resin的页面,这也就表示单独的resin运行成功了。然后,为了整合resin和apache,我们需要重新编译一下,以生成mod_caucho给apache调用。
# cd /usr/java/resin
# ./configure --with-apache=/usr/java/httpd2
# make
# make install
修改/usr/java/resin/conf/resin.conf,大约在最后(安装的resin版本不同,配置文件的内容可能有所不同),将<document-directory>修改成自己的apache的documentroot的值。
<document-directory>/usr/java/httpd2/htdocs</document-directory> ##这里修改成/usr/java/httpd2/htdocs
最后vi /usr/java/httpd2/conf/httpd.conf
复制以下内容
<location /caucho-status>
sethandler caucho-status
</location>
保存后。从启APACHE和RESIN
# /usr/java/resin/bin/httpd.sh restart
# /usr/java/httpd2/bin/apachectl restart
通过浏览器去访问http://localhost/caucho-status/,如果出现以下页面刚表示resin和apache已经成功整合了。
http://www.dfmqp.cn/caucho-status/
七.建立resin和apache的虚拟主机 我们建立的是tes.jsp.com test2.jsp.com 两个虚拟主机
vi /usr/java/httpd2/conf/httpd.conf
复制如下内容到httpd.conf里
NameVirtualHost 92.68.0. 虚拟主机建立所在的IP
<VirtualHost 99.99.0.>
DocumentRoot /home/jsp/ 文件所在目录
ServerName tes.jsp.com 访问的域名
</VirtualHost>
VirtualHost 92.68.0.>
DocumentRoot /home/jsp2/
ServerName test2.jsp.com
</VirtualHost>
vi /usr/java/resin/conf/resin.conf
查找如下代码并修改:
<host id="" root-directory=".">
<!--
- configures an explicit root web-app matching the
- webapp's ROOT
-->
<web-app id='/' document-directory="/usr/java/httpd2/htdocs"/>
</host>
<host id='tes.jsp.com'>
<web-app id='/' document-directory="/home/jsp"/>
</host>
<host id='tes2.jsp.com'>
<web-app id='/' document-directory="/home/jsp2"/>
</host>
保存从启apache和resin
tes.jsp.com 和tes2.jsp.com 虚拟主机可以运行了
可以做如下测试http://localhost/caucho-status/
可以看到测试面上有
Virtual Host: tes.jsp.com:80
Virtual Host: tes2.jsp.com:80
证明JSP虚拟主机工作很正常
http://www.dfmqp.cn
本人的全部安装过程提供给LINUX爱好者共同分享,需要软件如下
resin:http://www.caucho.com/
jdk:http://java.sun.com/
apache:http://www.apache.org
mysql:http://www.mysql.com
php:http://www.php.net
jdbc:http://mmmysql.sourceforge.net/
本人所用的软件版本如下:
resin-3.0.0.tar.gz
j2sdk-_4_2_05-linux-i586.bin
httpd-2.0.52.tar.gz
mysql-4..9.tar.gz
php-4.3.0.tar.gz
mysql-connector-java-3..6.tar.gz
一.安装MYSQL
我把他全部下在到/root 目录下
# chmod 755 mysql-4..9.tar.gz
# tar xfz mysql-4..9.tar.gz
解压后生成mysql-4..9目录,我们进入该目录:
cd mysql-4..9
进入后就开始配置mysql了,配置过程中我们要给mysql设置一个安装目录,我们设置在 /usr/local/mysql 下,以为把文件放到一个地方比较容易管理,如果你还想获得更多的配置信息,使用 ./configure --help:
在这里我要特别强调在 编译的时候要选择好MYSQL的默认编码,因为如果不选择按默认安装的时候在JSP中就不支持GBK编码了
所以我这样编译
# ./configure --prefix=/usr/local/mysql --with-charset=gbk
然后等几秒钟,配置完成后就编译源代码
# make
这个编译的过程比较长,如果机器比较慢的话,可能要近二十分种 ( 我的是联想服务器都需要了5分钟 ) . 编译完成后就安装:
# make install
等上几秒钟,安装完成.下面就到了最关键的部分了,为什么老安装不成功,(至少我是安装了N次,N > 0 ,呵呵),问题关键就在这里,访问mysql要一个专门的用户,而且必须给相应的访问权限,这里我们就设置root和mysql有权限访问.
我们先建立一个mysql和mysql用户来访问mysql:
# groupadd mysql #建立mysql组
# useradd mysql -g mysql #建立mysql用户并且加入到mysql组中
建立用户后我们就初始化表 (注意:必须先执行本步骤后才能进行以下步骤)
# ./scripts/mysql_install_db --user=mysql #初试化表并且规定用mysql用户来访问初始化表以后就开始给mysql和root用户设定访问权限, 我们先到安装mysql的目录:
# cd /usr/local/mysql
然后设置权限
# chown -R root . #设定root能访问/usr/local/mysql
# chown -R mysql var #设定mysql用户能访问/usr/local/mysql/var ,里面存的是mysql的数据库文件
# chown -R mysql var/. #设定mysql用户能访问/usr/local/mysql/var下的所有文件
# chown -R mysql var/mysql/. #设定mysql用户能访问/usr/local/mysql/var/mysql下的所有文件
# chgrp -R mysql . #设定mysql组能够访问/usr/local/mysql
设置完成后,基本上就装好了,好了,我们运行一下我们的mysql:
# /usr/local/mysql/bin/mysqld_safe --user=mysql &
如果没有问题的话,应该会出现类似这样的提示:
[] 42264
# Starting mysqld daemon with databases from /usr/local/mysql/var
这就证明你安装成功了
用如下命令修改MYSQL密码,默认安装密码为空,为了安全你必须马上修改
/usr/local/mysql/bin/mysqladmin -uroot password pengyong
现在修改的密码为:pengyong
二、安装jdk
# chmod 755 j2sdk-_4_2_05-linux-i586.bin
# ./j2sdk-_4_2_05-linux-i586.bin 释放j2sdk-_4_2_05-linux-i586.bin
在/root目录下生成j2sdk.4.2_05目录和文件我是将JDK装到/usr/java/目录下
将文件剪切到/usr/java/目录下
# mv j2sdk.4.2_05/ /usr/java/
设置JDK变量环境
# vi /etc/profile
# /etc/profile
JAVA_HOME=/usr/java/j2sdk.4.2_05
RESIN_HOME=/usr/resin
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/htmlco
nverter.jar:$RESIN_HOME/lib:/usr/java/jdbc/mysql-connector-java-3..6-bin.jar
退出当前登录的环境,重新登录,这样刚刚设定的环境变量就会生效,然后用如下命令测试:
[root@LINUX root]# echo $JAVA_HOME
/usr/java/j2sdk.4.2_05
[root@LINUX root]# echo $CLASSPATH
.:/usr/java/j2sdk.4.2_05/lib/dt.jar:/usr/java/j2sdk.4.2_05/lib/tools.jar:/usr/
java/j2sdk.4.2_05/lib/htmlconverter.jar:/usr/resin/lib:/usr/java/jdbc/mysql-con
nector-java-3..6-bin.jar
[root@LINUX root]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bi
n:/usr/local/sbin:/usr/bin/X:/usr/java/j2sdk.4.2_05/bin:/usr/XR6/bin:/root/
bin
[root@LINUX root]# java -version
java version ".4.2_05"
Java(TM) 2 Runtime Environment, Standard Edition (build .4.2_05-b04)
Java HotSpot(TM) Client VM (build .4.2_05-b04, mixed mode)
看到类似信息就表示jdk环境已经好了。其实在上面的/etc/profile中,我们不仅仅设置了jdk的环境变量,还一并设置了resin和jdbc的环境变量,这些都是后面安装resin所必需的设定
三、安装mysql的jdbc
# tar xfz mysql-connector-java-3..6.tar.gz
# mv mysql-standard-4.0.23-pc-linux-i686/ /usr/java/ 将解压的文件剪切到/usr/java/目录下。
# cd /usr/java/
# ln -s mysql-standard-4.0.23-pc-linux-i686/ jdbc 创建JDBC的软连接与/usr/java/目录下
四、安装apache
# chmod 755 httpd-2.0.52.tar.gz
# tar xfz httpd-2.0.52.tar.gz
# cd httpd-2.0.52
开始配置APACHE
# ./configure --prefix=/usr/java/httpd2 --enable-module=most --enable-shared=max
察看编译进apache的模块:
#/usr/java/httpd2/bin/httpd -l
[root@LINUX root]# /usr/java/httpd2/bin/httpd -l
compiled-in modules:
http_core.c
mod_so.c
看到以上的信息表明apache支持dso方式了。这样就可以用dso的方式把php和resin的模块加进来。
五、安装php
我们使用的PHP版本是4.3.0,先去下载: http://www.php.net/downloads.php, 下回来的包叫做 php-4.3.0.tar.gz, 放到/usr/local/src目录下.
首先进入该目录后解压缩:
# cd /usr/local/src
# tar xfz php-4.3.0.tar.gz
解压后进入目录:
# cd php-4.3.0
进行配置,这一步比较关键,一定要设置好,特别是要考虑到你要支持什么,比如GD库,xml,mysql等等,如果想知道详细的配置,执行 ./configure --help来获得:
# ./configure --with-mysql=/usr/java/mysql --with-apxs=/usr/java/httpd2/bin/apxs
果上面的配置没有错误的话,那么应该最后会显示感谢使用PHP等字样,那么证明配置成功,如果上面的配置选项不支持的话,会提示错误.
比如你没有安装mysql,那么--with-mysql就无法使用,所以一定要注意对应选项系统是否能够支持,如果出现错误,那么就先安装对应的程序,或者去掉相关选项,配置之后就进行编译:
# make
编译成功后出现"Build complete."字样,那么就可以进行安装了:
# make install
安装完成后把/usr/local/src/php-4.3.8/php.ini-dist复制到/usr/local/lib/,并重命名为php.ini
# cp /usr/local/src/php-4.3.0/php.ini-dist /usr/local/lib/php.ini
基本到这里PHP就安装成功了,如果中间出现错误,除了在配置的时候没有选对选项之后一般都不出现错误.
为了让Apache能够直接解析php,我们还要进行一些配置.
# vi /usr/java/httpd/conf/httpd.conf
在httpd.conf文件中,添加
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
应该将以上两句添加在其他AddType之后。
确保文件中有以下一句话,没有就自己添加在所有LoadModule之后。
LoadModule php4_module modules/libphp4.so
好了,在vi中使用":wq"保存httpd.conf文件,退出vi。启动apache server:
# /usr/java/httpd2/bin/apachectl restart
现在apache就能够运行php了,写个文件测试一下,在/usr/java/httpd2/htdocs目录下,新建一个phpinfo.php文件,
文件中只有一行代码:
<? phpinfo(); ?>
保存此文件, 在你的浏览器中输入http://localhost/phpinfo.php,你应该看到PHP的系统信息。
如果出现错误,比如提示你下灾phpinfo.php,那么apache就是还无法解析php文件,那么请仔细检查以上的操作是否正确.
六.安装resin
下载的resin的安装包解开后应该可以直接单独运行的。笔者将其解开后放到/usr/java/目录下
# tar xfz resin-3.0.0.tar.gz
# mv resin-3.0.0 /usr/java/
# cd /usr/java/
# ln -s resin-3.0.0/ resin
启动resin
# /usr/java/resin/bin/httpd.sh start
现在就能够从http://localhost:8080/上能看到resin的页面,这也就表示单独的resin运行成功了。然后,为了整合resin和apache,我们需要重新编译一下,以生成mod_caucho给apache调用。
# cd /usr/java/resin
# ./configure --with-apache=/usr/java/httpd2
# make
# make install
修改/usr/java/resin/conf/resin.conf,大约在最后(安装的resin版本不同,配置文件的内容可能有所不同),将<document-directory>修改成自己的apache的documentroot的值。
<document-directory>/usr/java/httpd2/htdocs</document-directory> ##这里修改成/usr/java/httpd2/htdocs
最后vi /usr/java/httpd2/conf/httpd.conf
复制以下内容
<location /caucho-status>
sethandler caucho-status
</location>
保存后。从启APACHE和RESIN
# /usr/java/resin/bin/httpd.sh restart
# /usr/java/httpd2/bin/apachectl restart
通过浏览器去访问http://localhost/caucho-status/,如果出现以下页面刚表示resin和apache已经成功整合了。
http://www.dfmqp.cn/caucho-status/
七.建立resin和apache的虚拟主机 我们建立的是tes.jsp.com test2.jsp.com 两个虚拟主机
vi /usr/java/httpd2/conf/httpd.conf
复制如下内容到httpd.conf里
NameVirtualHost 92.68.0. 虚拟主机建立所在的IP
<VirtualHost 99.99.0.>
DocumentRoot /home/jsp/ 文件所在目录
ServerName tes.jsp.com 访问的域名
</VirtualHost>
VirtualHost 92.68.0.>
DocumentRoot /home/jsp2/
ServerName test2.jsp.com
</VirtualHost>
vi /usr/java/resin/conf/resin.conf
查找如下代码并修改:
<host id="" root-directory=".">
<!--
- configures an explicit root web-app matching the
- webapp's ROOT
-->
<web-app id='/' document-directory="/usr/java/httpd2/htdocs"/>
</host>
<host id='tes.jsp.com'>
<web-app id='/' document-directory="/home/jsp"/>
</host>
<host id='tes2.jsp.com'>
<web-app id='/' document-directory="/home/jsp2"/>
</host>
保存从启apache和resin
tes.jsp.com 和tes2.jsp.com 虚拟主机可以运行了
可以做如下测试http://localhost/caucho-status/
可以看到测试面上有
Virtual Host: tes.jsp.com:80
Virtual Host: tes2.jsp.com:80
证明JSP虚拟主机工作很正常
Nov
5
如果您以前的PHP代码用ZS或ZE编码过,请不要装PHP测试版,最好装PHP5.0.5, 因为ZO不支持PHP测试版
PHP5.0.4下载 http://cn.php.net/distributions/php-5.0.5-Win32.zip
(安装方法一样)
1、IIS6的安装
IIS6是WINDOWS2003自带的服务器组件,默认没有安装,安装方法:
控制面板----添加和删除程序----添加/删除windows组件----双击“应用程序服务器”----勾选上“INTERNET信息服务(IIS)”----确定(如果提示插入光盘,请插入WINDOWS2003安装盘)
2、php5.安装
下载php5..0b3; http://cn.php.net/distributions/php-5..0RC-Win32.zip
解压到D:/php目录;
复制D:/php/主目录下的所有DLL文件到:c:/windows/system32/中; 不用复制子目录中的
3、IIS6设置
从“开始”----“管理工具”中打开“internet信息服务(IIS)管理器”-----右键点“本地服务器”----点“属性”----点“MIME类型”----点“新建”----扩展名:php ;MIME类型:application/httpd-php----确定、确定
右键点IIS左边框中的“WEB服务扩展”----点“添加一个新的WEB服务扩展”----扩展名:php; “添加”要求的文件:C:\WINDOWS\system32\php5isapi.dll----勾上“设置扩展状态为允许”----确定
建网站目录,假设为:D:/WEB/
建一个子目录: D:/WEB/includes
右键点IIS左边框中的“网站”下的“默认WEB网站”----点“属性”----点“主目录”卡----本地路径:d:\web ; 只勾选“脚本资源访问”、“读取”----执行权限选“纯脚本”----点“配置”按钮----“映射”卡中点“添加”----扩展名:php; 可执行文件:C:\WINDOWS\system32\php5isapi.dll----确定、确定
“文档”卡中“添加”:index.php;“上移”到最顶----确定
4、php5.设置
复制d:/php/下的php.ini-dist文件到 c:/windows/目录中,改名为:php.ini;双击打开这个文件做以下设置:
; Windows: "\path;\path2"
include_path = ".;d:\web\includes"
extension_dir = "D:\php\ext"
extension=php_mbstring.dll
extension=php_bz2.dll
;extension=php_cpdf.dll
extension=php_curl.dll
extension=php_dba.dll
extension=php_dbase.dll
;extension=php_dbx.dll
extension=php_exif.dll
extension=php_fdf.dll
extension=php_filepro.dll
extension=php_gd2.dll
extension=php_gettext.dll
;extension=php_ifx.dll
;extension=php_iisfunc.dll
extension=php_imap.dll
extension=php_interbase.dll
;extension=php_java.dll
extension=php_ldap.dll
;extension=php_mcrypt.dll
extension=php_mhash.dll
extension=php_mime_magic.dll
extension=php_ming.dll
extension=php_mssql.dll
extension=php_msql.dll
extension=php_mysql.dll
;extension=php_oci8.dll
extension=php_openssl.dll
;extension=php_oracle.dll
;extension=php_pdf.dll
extension=php_pgsql.dll
extension=php_shmop.dll
extension=php_snmp.dll
extension=php_sockets.dll
;extension=php_sybase_ct.dll
extension=php_tidy.dll
;extension=php_w32api.dll
extension=php_xmlrpc.dll
extension=php_xsl.dll
;extension=php_yaz.dll
;extension=php_zip.dll
; 上面有您用不上的可以用分号注掉
session.bug_compat_42 = 0
session.bug_compat_warn = 0
保存文件 ,运行d:\php\php.exe 如果提示有不能运行的扩展库,在上面那个文件中用分号禁掉提示的扩展库就好了。
在 d:\web\下建一个文件:.php,写入:
<?
phpinfo();
?>
在浏览器中打开: http://localhost/.php
如果您看到了PHP服务器的信息,祝贺您安装成功。
5、安装: MySQL 4.0.26-nt
下载:http://mysql.cdpa.nsysu.edu.tw/Downl...0.26-win32.zip
解压到:c:\mysql\
运行: C:\mysql\bin\winmysqladmin.exe ; (主要是为了生成c:\my.ini,使mysql加入到系统服务中,) 等待弹出用户名和密码输入框, 分别输入、,确定就好了;从“开始”--“程序”--“启动”中删除 winmysqladmin.exe
运行: C:\mysql\bin\mysqld-nt.exe 完成后,MYSQL安装完成
phpMyAdmin-2.8.2的配置文件在
phpMyAdmin\libraries\config.default.php.
先设置phpMyAdmin的位置
$cfg[PmaAbsoluteUri] = http://localhost/phpmyadmin/;
CTRL+G到7行设置用户名和密码
$cfg[Servers][$i][auth_type] = config; // Authentication method (config, http o cookie based)?
$cfg[Servers][$i][user] = jondy; // MySQL user
$cfg[Servers][$i][password] = zhack.com; // MySQL password (only needed
设置中文支持
$cfg[DefaultLang] = zh-gb232;
$cfg[DefaultCharset] = gb232;
这样就可以使用了,为了安全要设置$cfg[Servers][$i][auth_type]
为http或cookie哦,这样登陆phpMyAdmin时就要身份验证了.
用户名和密码和连接MySQL的一样.
最好将phpMyAdmin目录改个别的名比如love_jondy,
毕竟这么牛X的程序不一定哪天出个漏洞什么的,安全第一呀,呵呵.
我的一个客户用的5.net的虚拟主机,安装的时候提示
Warning: unknown encoding "gb232" in /z2/xxxxxxx/public_html/love_jondy/libraries/string.lib.php on line 4
简单的处理方法是编辑libraries/string.lib.php
CTRL+G到4行,在前边加上//注释掉,哈哈,管他什么if else呢.
Windows 2003下配置php+mysql+phpmyadmin (希望加精)
请大家认真按照以下方法安装,保证您安装成功,确实安装不成功者,可加QQ:88797888 为您免费安装。若觉得好,请版主给予加精......
序、软件准备
软件版本及系统环境介绍:
* 软件版本:Windows Server 2003 Standard Edition SP、IIS 6.0、PHP 4.4.、MySQL 4.0.26、phpMyAdmin 2.7.0-beta
* 系统环境:
├─ C:\windows\ --------------------------系统目录
├─ E:\myweb\wwwroot\ ---------IIS主目录
├─ E:\myweb\php4\ ----------------PHP目录
├─ E:\myweb\mysql\ ---------------MySQL目录
└─ E:\myweb\wwwroot\phpMyAdmin\ -----phpMyAdmin目录
2 软件下载:
PHP 4.4. MySQL 4.0.26 phpMyAdmin 2.7.0-beta(这些软件可以从网上下载,若下载不到可向本人免费索取)
3 IIS服务器:
关于IIS的安装因为比较简单,在此只大概的说一下,这个功能在“添加/删除程序---添加删除Windows组件”中添加“Internet 信息服务”即可,就不再赘述了。
一、PHP的安装配置
将PHP解压到上述目录,将php4目录下的php.ini-recommended文件改名为php.ini,然后用记事本打开;
2 然后把 extension_dir = "./" 修改为 extension_dir = "E:\myweb\php4\extensions";
3 再找到session.save_path = /tmp,去掉此行前面的分号,然后将其改为session.save_path = E:\myweb\php4\sessions (同时在php4目录下新建名为sessions的目录);
4 找到extension=php_mbstring.dll,去掉此行前面的分号;
5 将修改好的php.ini文件拷贝至C:\windows目录下,将php4目录下的php4ts.dll文件拷贝到C:\windows\system32目录下;
6 打开“Internet服务管理器”,选择你想支持PHP的站点(如:默认网站),打开属性页,点击“ISAPI筛选器”选项卡,点击“添加”,在弹出的“筛选器属性”窗口的“筛选器名称”中填入“php”;在“可执行文件”中填入“E:\myweb\php4\sapi\php4isapi.dll”,点击确定;
7 点击“主目录”选项卡,选择“应用程序设置”中的“配置”按钮,在弹出的“应用程序配置”窗口中点击“添加”按钮,在弹出的“添加/编辑应用程序扩展名映射”窗口中的“可执行文件”中填入“E:\myweb\php4\sapi\php4isapi.dll”,“扩展名”一项填入“.php”;
8 点击“文档”选项卡,添加index.php为默认文档;
9 再回到IIS管理器的左侧边栏树状目录,右键单击“Web服务扩展”,选择“添加一个新的Web服务扩展”。在弹出的对话框中输入扩展名为PHP,然后单击“添加”按钮,选择“浏览”,添加“E:\myweb\php4\sapi\php4isapi.dll”文件,并勾选“设置扩展状态为允许”;
0 PHP主要安装过程就此结束,重启IIS。到E:\myweb\wwwroot目录下新建一个phpinfo.php文件,内容如下:
<?php
phpinfo();
?>
通过浏览器访问 http://localhost/phpinfo.php ,如果显示页首有“PHP Version 4.4.”字样页面,则代表PHP已经安装成功。
二、MySQL的安装
解压mysql-4.0.26-win32.zip文件后,执行其中的setup.exe文件,启动安装程序;
2 在安装程序第三步中选择安装目录为“E:\myweb\mysql”(如有提示框弹出,请单击“Yes”,程序会自动建立此目录);
3 第四步中选择“Typical(默认值)”,点击“Next”按钮后,安装开始。最后点击“Finish”按钮完成MySQL安装;
4 (此步骤可以省略)安装完成后,进入“E:\myweb\mysqlbin”目录,双击winmysqladmin.exe文件,它会提示建立新账号,输入自己想要的用户名及密码即可,确认后,在任务栏中会出现一个红绿灯的图标,如果是绿灯亮起,代表MySQL已经成功运行。
三、phpMyAdmin的安装配置
解压phpMyAdmin-2.7.0-beta.tar.bz2文件到“E:\myweb\wwwroot\phpMyAdmin”目录;
2 在“E:\myweb\wwwroot\phpMyAdmin”目录中找到config.default.php文件,将其改名为config.inc.php,然后用记事本打开;
3 找到$cfg['blowfish_secret'] = '',将其值改为你自己想要的任意字符,如$cfg['blowfish_secret'] = 'owndownd';
4 找到$cfg['Servers'][$i]['auth_type'] = 'config',改为$cfg['Servers'][$i]['auth_type'] = 'cookie';
5 找到$cfg['DefaultLang'] = 'en-iso-8859-',改为$cfg['DefaultLang'] = 'zh-utf-8';
6 找到$cfg['DefaultCharset'] = 'iso-8859-',改为$cfg['DefaultCharset'] = 'zh-utf-8';
7 通过以上设置,就可以通过http://localhost/phpmyadmin/访问到phpMyAdmin登录界面了;
8 使用root账号登录,密码为空。登录后选择更改密码,输入自己需要的密码,点击“更改”按钮,即完成phpMyAdmin最后配置。现在已经可以通过phpMyAdmin来管理MySQL数据库了;
四、结束语
通过阅读以上的文字相信一部分浏览者已经可以在自己的机器上成功建立PHP+MySQL环境支持了,实际上也可以依照以上方法在Windows 2000或者Windows XP的系统环境中进行配置。祝各位好运^^!
PHP5.0.4下载 http://cn.php.net/distributions/php-5.0.5-Win32.zip
(安装方法一样)
1、IIS6的安装
IIS6是WINDOWS2003自带的服务器组件,默认没有安装,安装方法:
控制面板----添加和删除程序----添加/删除windows组件----双击“应用程序服务器”----勾选上“INTERNET信息服务(IIS)”----确定(如果提示插入光盘,请插入WINDOWS2003安装盘)
2、php5.安装
下载php5..0b3; http://cn.php.net/distributions/php-5..0RC-Win32.zip
解压到D:/php目录;
复制D:/php/主目录下的所有DLL文件到:c:/windows/system32/中; 不用复制子目录中的
3、IIS6设置
从“开始”----“管理工具”中打开“internet信息服务(IIS)管理器”-----右键点“本地服务器”----点“属性”----点“MIME类型”----点“新建”----扩展名:php ;MIME类型:application/httpd-php----确定、确定
右键点IIS左边框中的“WEB服务扩展”----点“添加一个新的WEB服务扩展”----扩展名:php; “添加”要求的文件:C:\WINDOWS\system32\php5isapi.dll----勾上“设置扩展状态为允许”----确定
建网站目录,假设为:D:/WEB/
建一个子目录: D:/WEB/includes
右键点IIS左边框中的“网站”下的“默认WEB网站”----点“属性”----点“主目录”卡----本地路径:d:\web ; 只勾选“脚本资源访问”、“读取”----执行权限选“纯脚本”----点“配置”按钮----“映射”卡中点“添加”----扩展名:php; 可执行文件:C:\WINDOWS\system32\php5isapi.dll----确定、确定
“文档”卡中“添加”:index.php;“上移”到最顶----确定
4、php5.设置
复制d:/php/下的php.ini-dist文件到 c:/windows/目录中,改名为:php.ini;双击打开这个文件做以下设置:
; Windows: "\path;\path2"
include_path = ".;d:\web\includes"
extension_dir = "D:\php\ext"
extension=php_mbstring.dll
extension=php_bz2.dll
;extension=php_cpdf.dll
extension=php_curl.dll
extension=php_dba.dll
extension=php_dbase.dll
;extension=php_dbx.dll
extension=php_exif.dll
extension=php_fdf.dll
extension=php_filepro.dll
extension=php_gd2.dll
extension=php_gettext.dll
;extension=php_ifx.dll
;extension=php_iisfunc.dll
extension=php_imap.dll
extension=php_interbase.dll
;extension=php_java.dll
extension=php_ldap.dll
;extension=php_mcrypt.dll
extension=php_mhash.dll
extension=php_mime_magic.dll
extension=php_ming.dll
extension=php_mssql.dll
extension=php_msql.dll
extension=php_mysql.dll
;extension=php_oci8.dll
extension=php_openssl.dll
;extension=php_oracle.dll
;extension=php_pdf.dll
extension=php_pgsql.dll
extension=php_shmop.dll
extension=php_snmp.dll
extension=php_sockets.dll
;extension=php_sybase_ct.dll
extension=php_tidy.dll
;extension=php_w32api.dll
extension=php_xmlrpc.dll
extension=php_xsl.dll
;extension=php_yaz.dll
;extension=php_zip.dll
; 上面有您用不上的可以用分号注掉
session.bug_compat_42 = 0
session.bug_compat_warn = 0
保存文件 ,运行d:\php\php.exe 如果提示有不能运行的扩展库,在上面那个文件中用分号禁掉提示的扩展库就好了。
在 d:\web\下建一个文件:.php,写入:
<?
phpinfo();
?>
在浏览器中打开: http://localhost/.php
如果您看到了PHP服务器的信息,祝贺您安装成功。
5、安装: MySQL 4.0.26-nt
下载:http://mysql.cdpa.nsysu.edu.tw/Downl...0.26-win32.zip
解压到:c:\mysql\
运行: C:\mysql\bin\winmysqladmin.exe ; (主要是为了生成c:\my.ini,使mysql加入到系统服务中,) 等待弹出用户名和密码输入框, 分别输入、,确定就好了;从“开始”--“程序”--“启动”中删除 winmysqladmin.exe
运行: C:\mysql\bin\mysqld-nt.exe 完成后,MYSQL安装完成
phpMyAdmin-2.8.2的配置文件在
phpMyAdmin\libraries\config.default.php.
先设置phpMyAdmin的位置
$cfg[PmaAbsoluteUri] = http://localhost/phpmyadmin/;
CTRL+G到7行设置用户名和密码
$cfg[Servers][$i][auth_type] = config; // Authentication method (config, http o cookie based)?
$cfg[Servers][$i][user] = jondy; // MySQL user
$cfg[Servers][$i][password] = zhack.com; // MySQL password (only needed
设置中文支持
$cfg[DefaultLang] = zh-gb232;
$cfg[DefaultCharset] = gb232;
这样就可以使用了,为了安全要设置$cfg[Servers][$i][auth_type]
为http或cookie哦,这样登陆phpMyAdmin时就要身份验证了.
用户名和密码和连接MySQL的一样.
最好将phpMyAdmin目录改个别的名比如love_jondy,
毕竟这么牛X的程序不一定哪天出个漏洞什么的,安全第一呀,呵呵.
我的一个客户用的5.net的虚拟主机,安装的时候提示
Warning: unknown encoding "gb232" in /z2/xxxxxxx/public_html/love_jondy/libraries/string.lib.php on line 4
简单的处理方法是编辑libraries/string.lib.php
CTRL+G到4行,在前边加上//注释掉,哈哈,管他什么if else呢.
Windows 2003下配置php+mysql+phpmyadmin (希望加精)
请大家认真按照以下方法安装,保证您安装成功,确实安装不成功者,可加QQ:88797888 为您免费安装。若觉得好,请版主给予加精......
序、软件准备
软件版本及系统环境介绍:
* 软件版本:Windows Server 2003 Standard Edition SP、IIS 6.0、PHP 4.4.、MySQL 4.0.26、phpMyAdmin 2.7.0-beta
* 系统环境:
├─ C:\windows\ --------------------------系统目录
├─ E:\myweb\wwwroot\ ---------IIS主目录
├─ E:\myweb\php4\ ----------------PHP目录
├─ E:\myweb\mysql\ ---------------MySQL目录
└─ E:\myweb\wwwroot\phpMyAdmin\ -----phpMyAdmin目录
2 软件下载:
PHP 4.4. MySQL 4.0.26 phpMyAdmin 2.7.0-beta(这些软件可以从网上下载,若下载不到可向本人免费索取)
3 IIS服务器:
关于IIS的安装因为比较简单,在此只大概的说一下,这个功能在“添加/删除程序---添加删除Windows组件”中添加“Internet 信息服务”即可,就不再赘述了。
一、PHP的安装配置
将PHP解压到上述目录,将php4目录下的php.ini-recommended文件改名为php.ini,然后用记事本打开;
2 然后把 extension_dir = "./" 修改为 extension_dir = "E:\myweb\php4\extensions";
3 再找到session.save_path = /tmp,去掉此行前面的分号,然后将其改为session.save_path = E:\myweb\php4\sessions (同时在php4目录下新建名为sessions的目录);
4 找到extension=php_mbstring.dll,去掉此行前面的分号;
5 将修改好的php.ini文件拷贝至C:\windows目录下,将php4目录下的php4ts.dll文件拷贝到C:\windows\system32目录下;
6 打开“Internet服务管理器”,选择你想支持PHP的站点(如:默认网站),打开属性页,点击“ISAPI筛选器”选项卡,点击“添加”,在弹出的“筛选器属性”窗口的“筛选器名称”中填入“php”;在“可执行文件”中填入“E:\myweb\php4\sapi\php4isapi.dll”,点击确定;
7 点击“主目录”选项卡,选择“应用程序设置”中的“配置”按钮,在弹出的“应用程序配置”窗口中点击“添加”按钮,在弹出的“添加/编辑应用程序扩展名映射”窗口中的“可执行文件”中填入“E:\myweb\php4\sapi\php4isapi.dll”,“扩展名”一项填入“.php”;
8 点击“文档”选项卡,添加index.php为默认文档;
9 再回到IIS管理器的左侧边栏树状目录,右键单击“Web服务扩展”,选择“添加一个新的Web服务扩展”。在弹出的对话框中输入扩展名为PHP,然后单击“添加”按钮,选择“浏览”,添加“E:\myweb\php4\sapi\php4isapi.dll”文件,并勾选“设置扩展状态为允许”;
0 PHP主要安装过程就此结束,重启IIS。到E:\myweb\wwwroot目录下新建一个phpinfo.php文件,内容如下:
<?php
phpinfo();
?>
通过浏览器访问 http://localhost/phpinfo.php ,如果显示页首有“PHP Version 4.4.”字样页面,则代表PHP已经安装成功。
二、MySQL的安装
解压mysql-4.0.26-win32.zip文件后,执行其中的setup.exe文件,启动安装程序;
2 在安装程序第三步中选择安装目录为“E:\myweb\mysql”(如有提示框弹出,请单击“Yes”,程序会自动建立此目录);
3 第四步中选择“Typical(默认值)”,点击“Next”按钮后,安装开始。最后点击“Finish”按钮完成MySQL安装;
4 (此步骤可以省略)安装完成后,进入“E:\myweb\mysqlbin”目录,双击winmysqladmin.exe文件,它会提示建立新账号,输入自己想要的用户名及密码即可,确认后,在任务栏中会出现一个红绿灯的图标,如果是绿灯亮起,代表MySQL已经成功运行。
三、phpMyAdmin的安装配置
解压phpMyAdmin-2.7.0-beta.tar.bz2文件到“E:\myweb\wwwroot\phpMyAdmin”目录;
2 在“E:\myweb\wwwroot\phpMyAdmin”目录中找到config.default.php文件,将其改名为config.inc.php,然后用记事本打开;
3 找到$cfg['blowfish_secret'] = '',将其值改为你自己想要的任意字符,如$cfg['blowfish_secret'] = 'owndownd';
4 找到$cfg['Servers'][$i]['auth_type'] = 'config',改为$cfg['Servers'][$i]['auth_type'] = 'cookie';
5 找到$cfg['DefaultLang'] = 'en-iso-8859-',改为$cfg['DefaultLang'] = 'zh-utf-8';
6 找到$cfg['DefaultCharset'] = 'iso-8859-',改为$cfg['DefaultCharset'] = 'zh-utf-8';
7 通过以上设置,就可以通过http://localhost/phpmyadmin/访问到phpMyAdmin登录界面了;
8 使用root账号登录,密码为空。登录后选择更改密码,输入自己需要的密码,点击“更改”按钮,即完成phpMyAdmin最后配置。现在已经可以通过phpMyAdmin来管理MySQL数据库了;
四、结束语
通过阅读以上的文字相信一部分浏览者已经可以在自己的机器上成功建立PHP+MySQL环境支持了,实际上也可以依照以上方法在Windows 2000或者Windows XP的系统环境中进行配置。祝各位好运^^!
Jul
30
MySQL已经成为当前网络中使用最多的数据库之一,特别是在Web应用上,它占据了中小型应用的绝对优势。这一切都源于它的小巧易用、安全有效、开放式许可和多平台,更主要的是它与三大Web语言之一——PHP的完美结合。
但不幸的是,一个缺省安装的MySQL,会因为root密码为空及程序漏洞导致被溢出,使得安装MySQL的服务器成为被经常攻击的对象。更严重的是,被攻击之后数据库往往遭破坏,易造成灾难性的后果。下面将进入为了保护数据而进行的保卫战中。
环境要求
.系统环境:
有一台Red Hat Linux 9.0自定义安装的服务器,系统安装了GCC及一些软件包,比如Apache、PHP等。安装完系统后的第一件事就是升级系统的软件包。作为Web服务器,系统接受PHP脚本的请求,PHP则使用下面将要安装的MySQL数据库作为动态发布的接触。
分区情况的要求和一般系统差不多,惟一不同之处在于后面建立的/chroot与/tmp要求在同一个分区上。
2.安全要求:
()MySQL运行在一个独立的(Chroot)环境下;
(2)mysqld进程运行于一个独立的用户/用户组下,此用户和用户组没有根目录,没有Shell,也不能用于其它程序;
(3)修改MySQL的root账号,并使用一个复杂的密码;
(4)只允许本地连接MySQL,启动MySQL时网络连接被禁止掉;
(5)保证连接MySQL的nobody账号登录被禁止;
(6)删除test数据库。
安装MySQL
.安装准备:
安装MySQL之前,按照上述安全要求需要创建一个用于启动MySQL的用户和组。
#groupadd mysql#useradd
mysql -c "start mysqlds account" -d
dev/null -g mysql -s /sbin/nologin
2.编译和安装:
下载MySQL源代码包:
#wget http://mysql.he.net/Downloads/MySQL-4.0/mysql-4.0.6.tar.gz
解压缩:
#tar -zxvf mysql-4.0.6.tar.gz
一般把MySQL安装在/usr/local/mysql下,如果有特殊要求,也可自行调整。不过这样做意义不大,因为后面将Chrooting,到时只是使用这里的客户工具而已,比如mysql,mysqladmin,mysqldump等。下面就开始编译安装吧。
#./configure --prefix=/usr/local/mysql
\ --with-mysqld-user=mysql \ --with-unix-socket-path=/tmp/mysql.sock
\ --with-mysqld-ldflags=-all-static#make && make
install#strip /usr/local/mysql/libexec
/mysqld#scripts/mysql_install_db#chown
-R root /usr/local/mysql#chown -R mysql
/usr/local/mysql/var#chgrp -R mysql /usr/local/mysql
上面各步骤的具体作用在MySQL手册里已有介绍,惟一需要解释、和一般步骤不同的地方在于--with-mysqld-ldflags=-all-static。因为需要用到Chroot环境,而MySQL本身连接成静态后就无需再创建一些库环境了。
3.配置与启动:
MySQL的配置文件需要手工选择、拷贝几个模板文件中的一个到/etc下,这几个模板文件位于源文件的support-files目录,一共有4个:small、medium、large、huge。
#cp support-files/my-medium.cnf
/etc/my.cnf#chown root:sys /etc/my.cnf#chmod
644 /etc/my.cnf
启动MySQL,注意使用用户为MySQL:
#/usr/local/mysq/bin/mysqld_safe --user=mysql &
4.测试:
为了测试安装的程序是否正确及MySQL是否已经正常启动,最好的办法就是用MySQL客户端来连接数据库。
#/usr/local/mysql/bin/mysql[root@ftp bin]
# mysqlWelcome to the MySQL monitor. Commands
end with ; o \g.Your MySQL connection id is
687 to server version: 3.23.58Type help;
o \h for help. Type \c to clear the
buffer.mysql>mysql> show d
atabases;+--------------+
Database +--------------+
mysql test +--------------+2
rows in set (0.00 sec)mysql>quit
连接成功,可以关闭数据库:
#/usr/local/mysql/bin/mysqladmin -uroot shutdown
如果连接失败则需要仔细分析出错原因:
#more /usr/local/mysql/var/`hostname`.err
Chrooting
.Chrooting环境:
Chroot是Unix/类Unix的一种手段,它的建立会将其与主系统几乎完全隔离。也就是说,一旦遭到什么问题,也不会危及到正在运行的主系统。这是一个非常有效的办法,特别是在配置网络服务程序的时候。
2.Chroot的准备工作:
首先,应当建立目录结构:
#mkdir -p /chroot/mysql/dev#mkdir -p
/chroot/mysql/etc#mkdir -p /chroot/mysql/tmp#mkdir -p
/chroot/mysql/var/tmp#mkdir -p /chroot
/mysql/usr/local/mysql/libexec#mkdir -p
/chroot/mysql/usr/local/mysql/share
/mysql/english
然后设定目录权限:
#chown -R root:sys /chroot/mysql#chmod -R 755 /chroot/mysql#chmod 777 /chroot/mysql/tmp
3.拷贝mysql目录下的程序和文件到chroot下:
#cp -p /usr/local/mysql/libexec
/mysqld /chroot/mysql/usr/
local/mysql/libexec/#cp -p /usr/local/mysql/share
/mysql/english/errmsg.sys/chroot/mysql/usr/local
/mysql/share/mysql/english/#cp -p /etc/hosts
/chroot/mysql/etc/#cp -p /etc/host.conf /chroot
/mysql/etc/#cp -p /etc/resolv.conf /chroot
/mysql/etc/#cp -p
/etc/group /chroot/mysql/etc
/#cp -p /etc/passwd
/chroot/mysql/etc/passwd#cp -p
/etc/my.cnf /chroot/mysql/etc/
但不幸的是,一个缺省安装的MySQL,会因为root密码为空及程序漏洞导致被溢出,使得安装MySQL的服务器成为被经常攻击的对象。更严重的是,被攻击之后数据库往往遭破坏,易造成灾难性的后果。下面将进入为了保护数据而进行的保卫战中。
环境要求
.系统环境:
有一台Red Hat Linux 9.0自定义安装的服务器,系统安装了GCC及一些软件包,比如Apache、PHP等。安装完系统后的第一件事就是升级系统的软件包。作为Web服务器,系统接受PHP脚本的请求,PHP则使用下面将要安装的MySQL数据库作为动态发布的接触。
分区情况的要求和一般系统差不多,惟一不同之处在于后面建立的/chroot与/tmp要求在同一个分区上。
2.安全要求:
()MySQL运行在一个独立的(Chroot)环境下;
(2)mysqld进程运行于一个独立的用户/用户组下,此用户和用户组没有根目录,没有Shell,也不能用于其它程序;
(3)修改MySQL的root账号,并使用一个复杂的密码;
(4)只允许本地连接MySQL,启动MySQL时网络连接被禁止掉;
(5)保证连接MySQL的nobody账号登录被禁止;
(6)删除test数据库。
安装MySQL
.安装准备:
安装MySQL之前,按照上述安全要求需要创建一个用于启动MySQL的用户和组。
#groupadd mysql#useradd
mysql -c "start mysqlds account" -d
dev/null -g mysql -s /sbin/nologin
2.编译和安装:
下载MySQL源代码包:
#wget http://mysql.he.net/Downloads/MySQL-4.0/mysql-4.0.6.tar.gz
解压缩:
#tar -zxvf mysql-4.0.6.tar.gz
一般把MySQL安装在/usr/local/mysql下,如果有特殊要求,也可自行调整。不过这样做意义不大,因为后面将Chrooting,到时只是使用这里的客户工具而已,比如mysql,mysqladmin,mysqldump等。下面就开始编译安装吧。
#./configure --prefix=/usr/local/mysql
\ --with-mysqld-user=mysql \ --with-unix-socket-path=/tmp/mysql.sock
\ --with-mysqld-ldflags=-all-static#make && make
install#strip /usr/local/mysql/libexec
/mysqld#scripts/mysql_install_db#chown
-R root /usr/local/mysql#chown -R mysql
/usr/local/mysql/var#chgrp -R mysql /usr/local/mysql
上面各步骤的具体作用在MySQL手册里已有介绍,惟一需要解释、和一般步骤不同的地方在于--with-mysqld-ldflags=-all-static。因为需要用到Chroot环境,而MySQL本身连接成静态后就无需再创建一些库环境了。
3.配置与启动:
MySQL的配置文件需要手工选择、拷贝几个模板文件中的一个到/etc下,这几个模板文件位于源文件的support-files目录,一共有4个:small、medium、large、huge。
#cp support-files/my-medium.cnf
/etc/my.cnf#chown root:sys /etc/my.cnf#chmod
644 /etc/my.cnf
启动MySQL,注意使用用户为MySQL:
#/usr/local/mysq/bin/mysqld_safe --user=mysql &
4.测试:
为了测试安装的程序是否正确及MySQL是否已经正常启动,最好的办法就是用MySQL客户端来连接数据库。
#/usr/local/mysql/bin/mysql[root@ftp bin]
# mysqlWelcome to the MySQL monitor. Commands
end with ; o \g.Your MySQL connection id is
687 to server version: 3.23.58Type help;
o \h for help. Type \c to clear the
buffer.mysql>mysql> show d
atabases;+--------------+
Database +--------------+
mysql test +--------------+2
rows in set (0.00 sec)mysql>quit
连接成功,可以关闭数据库:
#/usr/local/mysql/bin/mysqladmin -uroot shutdown
如果连接失败则需要仔细分析出错原因:
#more /usr/local/mysql/var/`hostname`.err
Chrooting
.Chrooting环境:
Chroot是Unix/类Unix的一种手段,它的建立会将其与主系统几乎完全隔离。也就是说,一旦遭到什么问题,也不会危及到正在运行的主系统。这是一个非常有效的办法,特别是在配置网络服务程序的时候。
2.Chroot的准备工作:
首先,应当建立目录结构:
#mkdir -p /chroot/mysql/dev#mkdir -p
/chroot/mysql/etc#mkdir -p /chroot/mysql/tmp#mkdir -p
/chroot/mysql/var/tmp#mkdir -p /chroot
/mysql/usr/local/mysql/libexec#mkdir -p
/chroot/mysql/usr/local/mysql/share
/mysql/english
然后设定目录权限:
#chown -R root:sys /chroot/mysql#chmod -R 755 /chroot/mysql#chmod 777 /chroot/mysql/tmp
3.拷贝mysql目录下的程序和文件到chroot下:
#cp -p /usr/local/mysql/libexec
/mysqld /chroot/mysql/usr/
local/mysql/libexec/#cp -p /usr/local/mysql/share
/mysql/english/errmsg.sys/chroot/mysql/usr/local
/mysql/share/mysql/english/#cp -p /etc/hosts
/chroot/mysql/etc/#cp -p /etc/host.conf /chroot
/mysql/etc/#cp -p /etc/resolv.conf /chroot
/mysql/etc/#cp -p
/etc/group /chroot/mysql/etc
/#cp -p /etc/passwd
/chroot/mysql/etc/passwd#cp -p
/etc/my.cnf /chroot/mysql/etc/
Jul
30
.NET的数据库天然支持MSSQLServer,但是并非其他数据库不支持,而是微软基于自身利益需要,在支持、营销上推自己的数据库产品;但是作为平台战略,他并非排斥其他数据库,而是参考java体系提出了一套数据库访问规范,让各个第三方进行开发,提供特定的驱动。
MySQL是免费的数据库,在成本上具有无可替代的优势,但是目前来讲,并没有提供。微软把MySQL当作ODBC数据库,可以按照ODBC.Net规范进行访问,具体参考
http://www.microsoft.com/china/community/Columns/Luyan/6.mspx
而实际上,针对ODBC。Net的需要配置DSN的麻烦,而是出现了一个开源的系统MySQLDriverCS,对MySQL的开发进行了封装,实现了.net环境下对于MySQL数据库系统的访问。
http://sourceforge.net/projects/mysqldrivercs/
通过阅读源代码,我们看到MySQLDriverCS的思路是利用C函数的底层库来操纵数据库的,通常提供对MySQL数据库的访问的数据库的C DLL是名为libmySQL.dll的驱动文件,MySQLDriverCS作为一个.net库进行封装C风格的驱动。
具体如何进行呢?
打开工程后,我们看到其中有一个比较特殊的.cs文件CPrototypes.cs:
以下是引用片段:
#region LICENSE
/*
MySQLDriverCS: An C# driver for MySQL.
Copyright (c) 2002 Manuel Lucas Vi馻s Livschitz.
This file is part of MySQLDriverCS.
MySQLDriverCS is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, o
(at your option) any later version.
MySQLDriverCS is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY o FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with MySQLDriverCS; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02-307 USA
*/
#endregion
using System;
using System.Data;
using System.Runtime.InteropServices;
namespace MySQLDriverCS
{
//[StructLayout(LayoutKind.Sequential)]
public class MYSQL_FIELD_FACTORY
{
static string version;
public static IMYSQL_FIELD GetInstance()
{
if (version==null)
{
version = CPrototypes.GetClientInfo();
}
if (version.CompareTo("4..2-alpha")>=0)
{
return new MYSQL_FIELD_VERSION_5();
}
else
return new MYSQL_FIELD_VERSION_3();
}
}
public interface IMYSQL_FIELD
{
string Name{get;}
uint Type{get;}
long Max_Length {get;}
}
///<summary>
/// Field descriptor
///</summary>
[StructLayout(LayoutKind.Sequential)]//"3.23.32", 4.0.-alpha
internal class MYSQL_FIELD_VERSION_3: IMYSQL_FIELD
{
///<summary>
/// Name of column
///</summary>
public string name;
///<summary>
/// Table of column if column was a field
///</summary>
public string table;
//public string og_table; /* og table name if table was an alias */
//public string db; /* Database for table */
///<summary>
/// def
///</summary>
public string def;
///<summary>
/// length
///</summary>
public long length;
///<summary>
/// max_length
///</summary>
public long max_length;
///<summary>
/// Div flags
///</summary>
public uint flags;
///<summary>
/// Number of decimals in field
///</summary>
public uint decimals;
///<summary>
/// Type of field. Se mysql_com.h for types
///</summary>
public uint type;
///<summary>
/// Name
///</summary>
public string Name
{
get{return name;}
}
///<summary>
/// Type
///</summary>
public uint Type
{
get{return type;}
}
///<summary>
/// Max_Length
///</summary>
public long Max_Length
{
get {return max_length;}
}
}
///<summary>
/// Field descriptor
///</summary>
[StructLayout(LayoutKind.Sequential)]
internal class MYSQL_FIELD_VERSION_5: IMYSQL_FIELD
{
///<summary>
/// Name of column
///</summary>
public string name;
///<summary>
/// oiginal column name, if an alias
///</summary>
public string og_name;
///<summary>
/// Table of column if column was a field
///</summary>
public string table;
///<summary>
/// og table name if table was an alias
///</summary>
public string og_table;
///<summary>
/// Database for table
///</summary>
public string db;
///<summary>
/// Catalog for table
///</summary>
//public string catalog;
///<summary>
/// def
///</summary>
public string def;
///<summary>
/// length
///</summary>
public long length;
///<summary>
/// max_length
///</summary>
public long max_length;
///<summary>
/// name_length
///</summary>
//public uint name_length;
///<summary>
/// og_name_length
///</summary>
public uint og_name_length;
///<summary>
/// table_length
///</summary>
public uint table_length;
///<summary>
/// og_table_length
///</summary>
public uint og_table_length;
///<summary>
/// db_length
///</summary>
public uint db_length;
///<summary>
/// catalog_length
///</summary>
public uint catalog_length;
///<summary>
/// def_length
///</summary>
public uint def_length;
///<summary>
/// Div flags
///</summary>
public uint flags;
///<summary>
/// Number of decimals in field
///</summary>
public uint decimals;
///<summary>
/// Character set
///</summary>
public uint charsetnr;
///<summary>
/// Type of field. Se mysql_com.h for types
///</summary>
public uint type;
///<summary>
/// Name
///</summary>
public string Name
{
get {return name;}
}
///<summary>
/// Type
///</summary>
public uint Type
{
get {return type;}
}
///<summary>
/// Max_Length
///</summary>
public long Max_Length
{
get {return max_length;}
}
}
//[StructLayout(LayoutKind.Explicit)]
public enum enum_field_types
{
FIELD_TYPE_DECIMAL, FIELD_TYPE_TINY,
FIELD_TYPE_SHORT, FIELD_TYPE_LONG,
FIELD_TYPE_FLOAT, FIELD_TYPE_DOUBLE,
FIELD_TYPE_NULL, FIELD_TYPE_TIMESTAMP,
FIELD_TYPE_LONGLONG,FIELD_TYPE_INT24,
FIELD_TYPE_DATE, FIELD_TYPE_TIME,
FIELD_TYPE_DATETIME, FIELD_TYPE_YEAR,
FIELD_TYPE_NEWDATE,
FIELD_TYPE_ENUM=247,
FIELD_TYPE_SET=248,
FIELD_TYPE_TINY_BLOB=249,
FIELD_TYPE_MEDIUM_BLOB=250,
FIELD_TYPE_LONG_BLOB=25,
FIELD_TYPE_BLOB=252,
FIELD_TYPE_VAR_STRING=253,
FIELD_TYPE_STRING=254,
FIELD_TYPE_GEOMETRY=255
};
///<summary>
/// C prototypes warpper for mysqllib.
///</summary>
internal class CPrototypes
{
[ DllImport( "libmySQL.dll", EntryPoint="mysql_init" )]
unsafe public static extern void* mysql_init(void* must_be_null);
[ DllImport( "libmySQL.dll", EntryPoint="mysql_close" )]
unsafe public static extern void mysql_close(void* handle);
// BEGIN ADDITION 2004-07-0 BY Alex Seewald
// Enables us to call mysql_option to activate compression and timeout
[ DllImport( "libmySQL.dll", EntryPoint="mysql_options" )]
unsafe public static extern void mysql_options(void* mysql, uint option, uint *value);
// END ADDITION 2004-07-0 By Alex Seewald
[ DllImport( "libmySQL.dll", EntryPoint="mysql_real_connect" )]
unsafe public static extern void* mysql_real_connect(void* mysql, string host, string user, string passwd, string db, uint port, string unix_socket, int client_flag);
[ DllImport( "libmySQL.dll", EntryPoint="mysql_query" )]
unsafe public static extern int mysql_query(void*mysql, string query);
[ DllImport( "libmySQL.dll", EntryPoint="mysql_store_result" )]
unsafe public static extern void *mysql_store_result(void *mysql);
[ DllImport( "libmySQL.dll", EntryPoint="mysql_free_result" )]
unsafe public static extern void mysql_free_result(void*result);
[ DllImport( "libmySQL.dll", EntryPoint="mysql_errno" )]
unsafe public static extern uint mysql_errno(void*mysql);
[ DllImport( "libmySQL.dll", EntryPoint="mysql_error" )]
unsafe public static extern string mysql_error(void*mysql);
[ DllImport( "libmySQL.dll", EntryPoint="mysql_field_count" )]
unsafe public static extern uint mysql_field_count(void*mysql);
[ DllImport( "libmySQL.dll", EntryPoint="mysql_affected_rows" )]
unsafe public static extern ulong mysql_affected_rows(void*mysql);
[ DllImport( "libmySQL.dll", EntryPoint="mysql_num_fields" )]
unsafe public static extern uint mysql_num_fields(void*result);
[ DllImport( "libmySQL.dll", EntryPoint="mysql_num_rows" )]
unsafe public static extern ulong mysql_num_rows(void *result);
[ DllImport( "libmySQL.dll", EntryPoint="mysql_fetch_field_direct" )]
unsafe public static extern IntPtr mysql_fetch_field_direct(void*result, uint fieldnr);
///<returns>Returns a string that represents the client library version</returns>
[DllImport("libmySQL.dll",CharSet=System.Runtime.InteropServices.CharSet.Ansi,
EntryPoint="mysql_get_client_info", ExactSpelling=true)]
public static extern string GetClientInfo();
[ DllImport( "libmySQL.dll", EntryPoint="mysql_fetch_row" )]
unsafe public static extern IntPtr mysql_fetch_row(void*result);
[ DllImport( "libmySQL.dll", EntryPoint="mysql_selct_db" )]
unsafe public static extern int mysql_selct_db(void*mysql,string dbname);
[ DllImport( "libmySQL.dll", EntryPoint="mysql_fetch_lengths" )]
unsafe public static extern UInt32 *mysql_fetch_lengths(void*result);
}
}
基本上是将C风格的基础数据结构进行.net的重新定义,然后通过InteropServices进行访问。
具体如何利用这个库进行操作,可以参考其中的例子。
MySQL是免费的数据库,在成本上具有无可替代的优势,但是目前来讲,并没有提供。微软把MySQL当作ODBC数据库,可以按照ODBC.Net规范进行访问,具体参考
http://www.microsoft.com/china/community/Columns/Luyan/6.mspx
而实际上,针对ODBC。Net的需要配置DSN的麻烦,而是出现了一个开源的系统MySQLDriverCS,对MySQL的开发进行了封装,实现了.net环境下对于MySQL数据库系统的访问。
http://sourceforge.net/projects/mysqldrivercs/
通过阅读源代码,我们看到MySQLDriverCS的思路是利用C函数的底层库来操纵数据库的,通常提供对MySQL数据库的访问的数据库的C DLL是名为libmySQL.dll的驱动文件,MySQLDriverCS作为一个.net库进行封装C风格的驱动。
具体如何进行呢?
打开工程后,我们看到其中有一个比较特殊的.cs文件CPrototypes.cs:
以下是引用片段:
#region LICENSE
/*
MySQLDriverCS: An C# driver for MySQL.
Copyright (c) 2002 Manuel Lucas Vi馻s Livschitz.
This file is part of MySQLDriverCS.
MySQLDriverCS is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, o
(at your option) any later version.
MySQLDriverCS is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY o FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with MySQLDriverCS; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02-307 USA
*/
#endregion
using System;
using System.Data;
using System.Runtime.InteropServices;
namespace MySQLDriverCS
{
//[StructLayout(LayoutKind.Sequential)]
public class MYSQL_FIELD_FACTORY
{
static string version;
public static IMYSQL_FIELD GetInstance()
{
if (version==null)
{
version = CPrototypes.GetClientInfo();
}
if (version.CompareTo("4..2-alpha")>=0)
{
return new MYSQL_FIELD_VERSION_5();
}
else
return new MYSQL_FIELD_VERSION_3();
}
}
public interface IMYSQL_FIELD
{
string Name{get;}
uint Type{get;}
long Max_Length {get;}
}
///<summary>
/// Field descriptor
///</summary>
[StructLayout(LayoutKind.Sequential)]//"3.23.32", 4.0.-alpha
internal class MYSQL_FIELD_VERSION_3: IMYSQL_FIELD
{
///<summary>
/// Name of column
///</summary>
public string name;
///<summary>
/// Table of column if column was a field
///</summary>
public string table;
//public string og_table; /* og table name if table was an alias */
//public string db; /* Database for table */
///<summary>
/// def
///</summary>
public string def;
///<summary>
/// length
///</summary>
public long length;
///<summary>
/// max_length
///</summary>
public long max_length;
///<summary>
/// Div flags
///</summary>
public uint flags;
///<summary>
/// Number of decimals in field
///</summary>
public uint decimals;
///<summary>
/// Type of field. Se mysql_com.h for types
///</summary>
public uint type;
///<summary>
/// Name
///</summary>
public string Name
{
get{return name;}
}
///<summary>
/// Type
///</summary>
public uint Type
{
get{return type;}
}
///<summary>
/// Max_Length
///</summary>
public long Max_Length
{
get {return max_length;}
}
}
///<summary>
/// Field descriptor
///</summary>
[StructLayout(LayoutKind.Sequential)]
internal class MYSQL_FIELD_VERSION_5: IMYSQL_FIELD
{
///<summary>
/// Name of column
///</summary>
public string name;
///<summary>
/// oiginal column name, if an alias
///</summary>
public string og_name;
///<summary>
/// Table of column if column was a field
///</summary>
public string table;
///<summary>
/// og table name if table was an alias
///</summary>
public string og_table;
///<summary>
/// Database for table
///</summary>
public string db;
///<summary>
/// Catalog for table
///</summary>
//public string catalog;
///<summary>
/// def
///</summary>
public string def;
///<summary>
/// length
///</summary>
public long length;
///<summary>
/// max_length
///</summary>
public long max_length;
///<summary>
/// name_length
///</summary>
//public uint name_length;
///<summary>
/// og_name_length
///</summary>
public uint og_name_length;
///<summary>
/// table_length
///</summary>
public uint table_length;
///<summary>
/// og_table_length
///</summary>
public uint og_table_length;
///<summary>
/// db_length
///</summary>
public uint db_length;
///<summary>
/// catalog_length
///</summary>
public uint catalog_length;
///<summary>
/// def_length
///</summary>
public uint def_length;
///<summary>
/// Div flags
///</summary>
public uint flags;
///<summary>
/// Number of decimals in field
///</summary>
public uint decimals;
///<summary>
/// Character set
///</summary>
public uint charsetnr;
///<summary>
/// Type of field. Se mysql_com.h for types
///</summary>
public uint type;
///<summary>
/// Name
///</summary>
public string Name
{
get {return name;}
}
///<summary>
/// Type
///</summary>
public uint Type
{
get {return type;}
}
///<summary>
/// Max_Length
///</summary>
public long Max_Length
{
get {return max_length;}
}
}
//[StructLayout(LayoutKind.Explicit)]
public enum enum_field_types
{
FIELD_TYPE_DECIMAL, FIELD_TYPE_TINY,
FIELD_TYPE_SHORT, FIELD_TYPE_LONG,
FIELD_TYPE_FLOAT, FIELD_TYPE_DOUBLE,
FIELD_TYPE_NULL, FIELD_TYPE_TIMESTAMP,
FIELD_TYPE_LONGLONG,FIELD_TYPE_INT24,
FIELD_TYPE_DATE, FIELD_TYPE_TIME,
FIELD_TYPE_DATETIME, FIELD_TYPE_YEAR,
FIELD_TYPE_NEWDATE,
FIELD_TYPE_ENUM=247,
FIELD_TYPE_SET=248,
FIELD_TYPE_TINY_BLOB=249,
FIELD_TYPE_MEDIUM_BLOB=250,
FIELD_TYPE_LONG_BLOB=25,
FIELD_TYPE_BLOB=252,
FIELD_TYPE_VAR_STRING=253,
FIELD_TYPE_STRING=254,
FIELD_TYPE_GEOMETRY=255
};
///<summary>
/// C prototypes warpper for mysqllib.
///</summary>
internal class CPrototypes
{
[ DllImport( "libmySQL.dll", EntryPoint="mysql_init" )]
unsafe public static extern void* mysql_init(void* must_be_null);
[ DllImport( "libmySQL.dll", EntryPoint="mysql_close" )]
unsafe public static extern void mysql_close(void* handle);
// BEGIN ADDITION 2004-07-0 BY Alex Seewald
// Enables us to call mysql_option to activate compression and timeout
[ DllImport( "libmySQL.dll", EntryPoint="mysql_options" )]
unsafe public static extern void mysql_options(void* mysql, uint option, uint *value);
// END ADDITION 2004-07-0 By Alex Seewald
[ DllImport( "libmySQL.dll", EntryPoint="mysql_real_connect" )]
unsafe public static extern void* mysql_real_connect(void* mysql, string host, string user, string passwd, string db, uint port, string unix_socket, int client_flag);
[ DllImport( "libmySQL.dll", EntryPoint="mysql_query" )]
unsafe public static extern int mysql_query(void*mysql, string query);
[ DllImport( "libmySQL.dll", EntryPoint="mysql_store_result" )]
unsafe public static extern void *mysql_store_result(void *mysql);
[ DllImport( "libmySQL.dll", EntryPoint="mysql_free_result" )]
unsafe public static extern void mysql_free_result(void*result);
[ DllImport( "libmySQL.dll", EntryPoint="mysql_errno" )]
unsafe public static extern uint mysql_errno(void*mysql);
[ DllImport( "libmySQL.dll", EntryPoint="mysql_error" )]
unsafe public static extern string mysql_error(void*mysql);
[ DllImport( "libmySQL.dll", EntryPoint="mysql_field_count" )]
unsafe public static extern uint mysql_field_count(void*mysql);
[ DllImport( "libmySQL.dll", EntryPoint="mysql_affected_rows" )]
unsafe public static extern ulong mysql_affected_rows(void*mysql);
[ DllImport( "libmySQL.dll", EntryPoint="mysql_num_fields" )]
unsafe public static extern uint mysql_num_fields(void*result);
[ DllImport( "libmySQL.dll", EntryPoint="mysql_num_rows" )]
unsafe public static extern ulong mysql_num_rows(void *result);
[ DllImport( "libmySQL.dll", EntryPoint="mysql_fetch_field_direct" )]
unsafe public static extern IntPtr mysql_fetch_field_direct(void*result, uint fieldnr);
///<returns>Returns a string that represents the client library version</returns>
[DllImport("libmySQL.dll",CharSet=System.Runtime.InteropServices.CharSet.Ansi,
EntryPoint="mysql_get_client_info", ExactSpelling=true)]
public static extern string GetClientInfo();
[ DllImport( "libmySQL.dll", EntryPoint="mysql_fetch_row" )]
unsafe public static extern IntPtr mysql_fetch_row(void*result);
[ DllImport( "libmySQL.dll", EntryPoint="mysql_selct_db" )]
unsafe public static extern int mysql_selct_db(void*mysql,string dbname);
[ DllImport( "libmySQL.dll", EntryPoint="mysql_fetch_lengths" )]
unsafe public static extern UInt32 *mysql_fetch_lengths(void*result);
}
}
基本上是将C风格的基础数据结构进行.net的重新定义,然后通过InteropServices进行访问。
具体如何利用这个库进行操作,可以参考其中的例子。
Jul
30
随着网络的普及,基于网络的应用也越来越多。网络数据库就是其中之一。通过一台或几台服务器可以为很多客户提供服务,这种方式给人们带来了很多方便,但也给不法分子造成了可乘之机。由于数据都是通过网络传输的,这就可以在传输的过程中被截获,或者通过非常手段进入数据库。由于以上原因,数据库安全就显得十分重要。因此,本文就以上问题讨论了MySQL数据库在网络安全方面的一些功能。
账户安全
账户是MySQL最简单的安全措施。每一账户都由用户名、密码以及位置(一般由服务器名、IP或通配符)组成。如用户john从server进行登录可能和john从server2登录的权限不同。
MySQL的用户结构是用户名/密码/位置。这其中并不包括数据库名。下面的两条命令为database和database2设置了Selct用户权限。
GRANT Selct ON database.* to 'abc'@'server' IDENTIFIED BY 'password';GRANT Selct ON database2.* to 'abc'@'server' IDENTIFIED BY 'password2';
第一条命令设置了用户abc在连接数据库database时使用password。第二条命令设置了用户abc在连接数据库database2时使用password2。因此,用户abc在连接数据库database和database2的密码是不一样的。
上面的设置是非常有用的。如果你只想让用户对一个数据库进行有限的访问,而对其它数据库不能访问,这样可以对同一个用户设置不同的密码。如果不这样做,当用户发现这个用户名可以访问其它数据库时,那将会造成麻烦。
MySQL使用了很多授权表来跟踪用户和这些用户的不同权限。这些表就是在mysql数据库中的MyISAM表。将这些安全信息保存在MySQL中是非常有意义的。因此,我们可以使用标准的SQL来设置不同的权限。
一般在MySQL数据库中可以使用3种不同类型的安全检查:
·登录验证
也就是最常用的用户名和密码验证。一但你输入了正确的用户名和密码,这个验证就可通过。
·授权
在登录成功后,就要求对这个用户设置它的具体权限。如是否可以删除数据库中的表等。
·访问控制
这个安全类型更具体。它涉及到这个用户可以对数据表进行什么样的操作,如是否可以编辑数据库,是否可以查询数据等等。
访问控制由一些特权组成,这些特权涉及到所何使用和操作MySQL中的数据。它们都是布尔型,即要么允许,要么不允许。下面是这些特权的列表:
·Selct
Selct是设定用户是否可以使用Selct来查询数据。如果用户没有这个特权,那么就只能执行一些简单的Selct命令,如计算表达式(Selct +2),或是日期转换(Selct Unix_TIMESTAMP(NOW( )))等。
·Insrt
·Upate
·INDEX
INDEX决定用户是否可以对表的索引进行设置。如果用户没有这个权限,那么将无法设置表中的索引。
·Altr
·Crate
·GRANT
如果一个用户拥有这个GRANT权限,那么他就可以将自己的权限授给别的用户。也就是说,这个用户可以和其它用户共享自己的权限。
·REFERENCES
有了REFERENCES权限,用户就可以将其它表的一个字段作为某一个表的外键约束。
除了以上的权限外,MySQL还有一些权限可以对整个MySQL进行操作。
·Reload
这个权限可以使用户有权执行各种FLUSH命令,如FLUSH TABLES, FLUSH STATUS等。
·Shutdown
这个权限允许用户关闭MySQL
·Process
通过这个权限,用户可以执行SHOW PROCESSLIST和KILL命令。这些命令可以查看MySQL的处理进程,可以通过这种方式查看SQL执行的细节。
·File
这个权限决定用户是否可以执行LOAD DATA INFILE命令。给用户这个权限要慎重,因为有这个权限的用户可以将任意的文件装载到表中,这样对MySQL是十分危险的。
·Super
这个权限允许用户终止任何查询(这些查询可能并不是这个用户执行的)。
以上几种权限是非常危险的,在给用户授权限时要非常谨慎。
MySQL中的SSL
以上的账户安全只是以普通的Socket进行数据传输的,这样非常不安全。因此,MySQL在4.版以后提供了对SSL(Secure Scokets Layer)的支持。MySQL使用的是免费的OpenSSL库。
由于MySQL的Linux版本一般都是随Linux本身一起发布,因此,它们默认时都不使用SSL进行传输数据。如果要打开SSL功能,需要对hava_openssl变量进行设置:
MySQL的Windows版本已经将OpenSSL加入了。也面的命令是查看你的MySQL是否打开了SSL功能。
SHOW VARIABLES LIKE 'have_openssl'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | have_openssl | NO | +---------------+-------+ row in set (0.00 sec)
如果返回的是NO,那么说明你需要将OpenSSL编译进自己的MySQL。
在有时你可能需要将用户名和密码进行加密传输。在这时可以使用下面GRANT命令:
GRANT ALL PRIVILEGES ON ssl_only_db.* to 'abc'@'%' IDENTIFIED BY "password!" REQUIRE SSL;
还可以通过 REQUIRE x509 选项进行SSL传输:
GRANT ALL PRIVILEGES ON ssl_only_db.* to 'abc'@'%' IDENTIFIED BY "password!" REQUIRE x509;
你还可以使用REQUIRE SUBJECT来指定一个特定的客户端证书来访问数据库。
GRANT ALL PRIVILEGES ON ssl_only_db.* to 'abc'@'%'IDENTIFIED BY "password!"REQUIRE SUBJECT "/C=US/ST=New York/L=Albany/O=Widgets Inc./CN=client-ray.example.com/[email protected]";
也许你并不关心使用的是什么客户许可,而仅仅关心的是你的证书。那么你可以使用REQUIRE ISSUER来实现:
GRANT ALL PRIVILEGES ON ssl_only_db.* to 'abc'@'%' IDENTIFIED BY "password!"REQUIRE ISSUER "/C=US/ST=New+20York/L=Albany/O=Widgets Inc./CN=cacert.example.com/[email protected]";
SSL还可以直接通过密码进行加密。可以使用REQUIRE CIPHER设置密码。
GRANT ALL PRIVILEGES ON ssl_only_db.* 'abc'@'%' IDENTIFIED BY "password!"REQUIRE CIPHER "EDH-RSA-DES-CBC3-SHA";
上面使用了GRANT命令对用户权限进行设置。而这些信息都是保存在授权表中,这些表是安全系统的心脏。在这些表中保存了每一个用户和客户机所具有的权限。如果正确地操作这些表,将会对数据库的安全起到积极的作用,而如果使用不慎,将是非常危险的。
下面让我们来看看MySQL中的最要的5个授权表。
user
用户表保存了用户的权限和被加密的密码。这个表负责确定哪些用户和客户机可以连接到服务器上。
host
这个表为每一个客户机分配权限,它并不考虑用户的权限。MySQL在确定是否接收还是拒绝一个连接时,首先考虑的是user表。而使用GRANT或REVOKE命令并不影响host表,我们可以通过手工方式修改这个表中的内容。
db
db表保存了数据库层的权限信息。
tables_priv
这个表存储了表的权限信息。
columns_priv
这个表保存了单独列的权限信息。通过这个表,可以将操作某一列的权限授予一个用户。
哈希加密
如果数据库保存了敏感的数据,如银行卡密码,客户信息等,你可能想将这些数据以加密的形式保存在数据库中。这样即使有人进入了你的数据库,并看到了这些数据,也很难获得其中的真实信息。
在应用程序的大量信息中,也许你只想交很小的一部分进行加密,如用户的密码等。这些密码不应该以明文的形式保存,它们应该以加密的形式保存在数据库中。一般情况下,大多数系统,这其中包括MySQL本身都是使用哈希算法对敏感数据进行加密的。
哈希加密是单向加密,也就是说,被加密的字符串是无法得到原字符串的。这种方法使用很有限,一般只使用在密码验证或其它需要验证的地方。在比较时并不是将加密字符串进行解密,而是将输入的字符串也使用同样的方法进行加密,再和数据库中的加密字符串进行比较。这样即使知道了算法并得到了加密字符串,也无法还原最初的字符串。银行卡密码就是采用的这种方式进行加密。
MySQL提供了4个函数用于哈希加密:PASSWORD, ENCRYPT, SHA和MD5。下面让我们试一试这4个函数,看看会得到什么结果。我们以加密字符串"pa55word"为例进行说明:
让我们先来看看MD5函数
Selct MD5('pa55word'); +----------------------------------+ | MD5('pa55word') | +----------------------------------+ | a7a433755d6542fd005e8b43afd4 | +----------------------------------+ row in set (0.3 sec) 下面是PASSWORD函数 Selct PASSWORD('pa55word'); +----------------------+ | PASSWORD('pa55word') | +----------------------+ | d35c6556b8cab45 | +----------------------+ row in set (0.00 sec) 下面是ENCRYPT函数 Selct ENCRYPT('pa55word'); +---------------------+ | ENCRYPT('pa55word') | +---------------------+ | up2Ecb0Hdj25A | +---------------------+ row in set (0.7 sec)
上面的每个函数都返回了一个加密后的字符串。为了区分加密字符串的大小写,最好在使用ENCRYPT生成加密字符串时,将这个字段定义成CHAR BINARY类型。
上面列举了3种加密的方法,但我认为使用MD5加密是最好的。这是因为这样做可以将明文密码显示在处理列表中或是查询日志中,这样便于跟踪。如下面的Insrt语句使用插入了一条记录,其中的密码使用了MD5进行加密:
Insrt INTO table (user, pw) VALUE ('user', MD5('password') )
可以通过如下的语句进行密码验证:
Selct * FROM table Whre user = 'user' AND pw = MD5('password')
哈希加密方法可以很好地对密码进行加密,使用了这种方法加密,密码将无法恢复成明文。
账户安全
账户是MySQL最简单的安全措施。每一账户都由用户名、密码以及位置(一般由服务器名、IP或通配符)组成。如用户john从server进行登录可能和john从server2登录的权限不同。
MySQL的用户结构是用户名/密码/位置。这其中并不包括数据库名。下面的两条命令为database和database2设置了Selct用户权限。
GRANT Selct ON database.* to 'abc'@'server' IDENTIFIED BY 'password';GRANT Selct ON database2.* to 'abc'@'server' IDENTIFIED BY 'password2';
第一条命令设置了用户abc在连接数据库database时使用password。第二条命令设置了用户abc在连接数据库database2时使用password2。因此,用户abc在连接数据库database和database2的密码是不一样的。
上面的设置是非常有用的。如果你只想让用户对一个数据库进行有限的访问,而对其它数据库不能访问,这样可以对同一个用户设置不同的密码。如果不这样做,当用户发现这个用户名可以访问其它数据库时,那将会造成麻烦。
MySQL使用了很多授权表来跟踪用户和这些用户的不同权限。这些表就是在mysql数据库中的MyISAM表。将这些安全信息保存在MySQL中是非常有意义的。因此,我们可以使用标准的SQL来设置不同的权限。
一般在MySQL数据库中可以使用3种不同类型的安全检查:
·登录验证
也就是最常用的用户名和密码验证。一但你输入了正确的用户名和密码,这个验证就可通过。
·授权
在登录成功后,就要求对这个用户设置它的具体权限。如是否可以删除数据库中的表等。
·访问控制
这个安全类型更具体。它涉及到这个用户可以对数据表进行什么样的操作,如是否可以编辑数据库,是否可以查询数据等等。
访问控制由一些特权组成,这些特权涉及到所何使用和操作MySQL中的数据。它们都是布尔型,即要么允许,要么不允许。下面是这些特权的列表:
·Selct
Selct是设定用户是否可以使用Selct来查询数据。如果用户没有这个特权,那么就只能执行一些简单的Selct命令,如计算表达式(Selct +2),或是日期转换(Selct Unix_TIMESTAMP(NOW( )))等。
·Insrt
·Upate
·INDEX
INDEX决定用户是否可以对表的索引进行设置。如果用户没有这个权限,那么将无法设置表中的索引。
·Altr
·Crate
·GRANT
如果一个用户拥有这个GRANT权限,那么他就可以将自己的权限授给别的用户。也就是说,这个用户可以和其它用户共享自己的权限。
·REFERENCES
有了REFERENCES权限,用户就可以将其它表的一个字段作为某一个表的外键约束。
除了以上的权限外,MySQL还有一些权限可以对整个MySQL进行操作。
·Reload
这个权限可以使用户有权执行各种FLUSH命令,如FLUSH TABLES, FLUSH STATUS等。
·Shutdown
这个权限允许用户关闭MySQL
·Process
通过这个权限,用户可以执行SHOW PROCESSLIST和KILL命令。这些命令可以查看MySQL的处理进程,可以通过这种方式查看SQL执行的细节。
·File
这个权限决定用户是否可以执行LOAD DATA INFILE命令。给用户这个权限要慎重,因为有这个权限的用户可以将任意的文件装载到表中,这样对MySQL是十分危险的。
·Super
这个权限允许用户终止任何查询(这些查询可能并不是这个用户执行的)。
以上几种权限是非常危险的,在给用户授权限时要非常谨慎。
MySQL中的SSL
以上的账户安全只是以普通的Socket进行数据传输的,这样非常不安全。因此,MySQL在4.版以后提供了对SSL(Secure Scokets Layer)的支持。MySQL使用的是免费的OpenSSL库。
由于MySQL的Linux版本一般都是随Linux本身一起发布,因此,它们默认时都不使用SSL进行传输数据。如果要打开SSL功能,需要对hava_openssl变量进行设置:
MySQL的Windows版本已经将OpenSSL加入了。也面的命令是查看你的MySQL是否打开了SSL功能。
SHOW VARIABLES LIKE 'have_openssl'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | have_openssl | NO | +---------------+-------+ row in set (0.00 sec)
如果返回的是NO,那么说明你需要将OpenSSL编译进自己的MySQL。
在有时你可能需要将用户名和密码进行加密传输。在这时可以使用下面GRANT命令:
GRANT ALL PRIVILEGES ON ssl_only_db.* to 'abc'@'%' IDENTIFIED BY "password!" REQUIRE SSL;
还可以通过 REQUIRE x509 选项进行SSL传输:
GRANT ALL PRIVILEGES ON ssl_only_db.* to 'abc'@'%' IDENTIFIED BY "password!" REQUIRE x509;
你还可以使用REQUIRE SUBJECT来指定一个特定的客户端证书来访问数据库。
GRANT ALL PRIVILEGES ON ssl_only_db.* to 'abc'@'%'IDENTIFIED BY "password!"REQUIRE SUBJECT "/C=US/ST=New York/L=Albany/O=Widgets Inc./CN=client-ray.example.com/[email protected]";
也许你并不关心使用的是什么客户许可,而仅仅关心的是你的证书。那么你可以使用REQUIRE ISSUER来实现:
GRANT ALL PRIVILEGES ON ssl_only_db.* to 'abc'@'%' IDENTIFIED BY "password!"REQUIRE ISSUER "/C=US/ST=New+20York/L=Albany/O=Widgets Inc./CN=cacert.example.com/[email protected]";
SSL还可以直接通过密码进行加密。可以使用REQUIRE CIPHER设置密码。
GRANT ALL PRIVILEGES ON ssl_only_db.* 'abc'@'%' IDENTIFIED BY "password!"REQUIRE CIPHER "EDH-RSA-DES-CBC3-SHA";
上面使用了GRANT命令对用户权限进行设置。而这些信息都是保存在授权表中,这些表是安全系统的心脏。在这些表中保存了每一个用户和客户机所具有的权限。如果正确地操作这些表,将会对数据库的安全起到积极的作用,而如果使用不慎,将是非常危险的。
下面让我们来看看MySQL中的最要的5个授权表。
user
用户表保存了用户的权限和被加密的密码。这个表负责确定哪些用户和客户机可以连接到服务器上。
host
这个表为每一个客户机分配权限,它并不考虑用户的权限。MySQL在确定是否接收还是拒绝一个连接时,首先考虑的是user表。而使用GRANT或REVOKE命令并不影响host表,我们可以通过手工方式修改这个表中的内容。
db
db表保存了数据库层的权限信息。
tables_priv
这个表存储了表的权限信息。
columns_priv
这个表保存了单独列的权限信息。通过这个表,可以将操作某一列的权限授予一个用户。
哈希加密
如果数据库保存了敏感的数据,如银行卡密码,客户信息等,你可能想将这些数据以加密的形式保存在数据库中。这样即使有人进入了你的数据库,并看到了这些数据,也很难获得其中的真实信息。
在应用程序的大量信息中,也许你只想交很小的一部分进行加密,如用户的密码等。这些密码不应该以明文的形式保存,它们应该以加密的形式保存在数据库中。一般情况下,大多数系统,这其中包括MySQL本身都是使用哈希算法对敏感数据进行加密的。
哈希加密是单向加密,也就是说,被加密的字符串是无法得到原字符串的。这种方法使用很有限,一般只使用在密码验证或其它需要验证的地方。在比较时并不是将加密字符串进行解密,而是将输入的字符串也使用同样的方法进行加密,再和数据库中的加密字符串进行比较。这样即使知道了算法并得到了加密字符串,也无法还原最初的字符串。银行卡密码就是采用的这种方式进行加密。
MySQL提供了4个函数用于哈希加密:PASSWORD, ENCRYPT, SHA和MD5。下面让我们试一试这4个函数,看看会得到什么结果。我们以加密字符串"pa55word"为例进行说明:
让我们先来看看MD5函数
Selct MD5('pa55word'); +----------------------------------+ | MD5('pa55word') | +----------------------------------+ | a7a433755d6542fd005e8b43afd4 | +----------------------------------+ row in set (0.3 sec) 下面是PASSWORD函数 Selct PASSWORD('pa55word'); +----------------------+ | PASSWORD('pa55word') | +----------------------+ | d35c6556b8cab45 | +----------------------+ row in set (0.00 sec) 下面是ENCRYPT函数 Selct ENCRYPT('pa55word'); +---------------------+ | ENCRYPT('pa55word') | +---------------------+ | up2Ecb0Hdj25A | +---------------------+ row in set (0.7 sec)
上面的每个函数都返回了一个加密后的字符串。为了区分加密字符串的大小写,最好在使用ENCRYPT生成加密字符串时,将这个字段定义成CHAR BINARY类型。
上面列举了3种加密的方法,但我认为使用MD5加密是最好的。这是因为这样做可以将明文密码显示在处理列表中或是查询日志中,这样便于跟踪。如下面的Insrt语句使用插入了一条记录,其中的密码使用了MD5进行加密:
Insrt INTO table (user, pw) VALUE ('user', MD5('password') )
可以通过如下的语句进行密码验证:
Selct * FROM table Whre user = 'user' AND pw = MD5('password')
哈希加密方法可以很好地对密码进行加密,使用了这种方法加密,密码将无法恢复成明文。