对于Web应用来说,注射式攻击由来已久,攻击方式也五花八门,常见的攻击方式有SQL注射、命令注射以及新近才出现的XPath注射等等。本文将以SQL注射为例,在源码级对其攻击原理进行深入的讲解。

一、注射式攻击的原理

注射式攻击的根源在于,程序命令和用户数据(即用户输入)之间没有做到泾渭分明。这使得攻击者有机会将程序命令当作用户输入的数据提交给We程序,以发号施令,为所欲为。

为了发动注射攻击,攻击者需要在常规输入中混入将被解释为命令的“数据”,要想成功,必须要做三件事情:

1.确定Web应用程序所使用的技术

注射式攻击对程序设计语言或者硬件关系密切,但是这些可以通过适当的踩点或者索性将所有常见的注射式攻击都搬出来逐个试一下就知道了。为了确定所采用的技术,攻击者可以考察Web页面的页脚,查看错误页面,检查页面源代码,或者使用诸如Nessus等工具来进行刺探。

2.确定所有可能的输入方式

Web应用的用户输入方式比较多,其中一些用户输入方式是很明显的,如HTML表单;另外,攻击者可以通过隐藏的HTML表单输入、HTTP头部、cookies、甚至对用户不可见的后端AJAX请求来跟Web应用进行交互。一般来说,所有HTTP的GET和POST都应当作用户输入。为了找出一个Web应用所有可能的用户输入,我们可以求助于Web代理,如Burp等。

3.查找可以用于注射的用户输入

在找出所有用户输入方式后,就要对这些输入方式进行筛选,找出其中可以注入命令的那些输入方式。这个任务好像有点难,但是这里有一个小窍门,那就是多多留意Web应用的错误页面,很多时候您能从这里得到意想不到的收获。

二、SQL注射原理

上面对注射攻击做了一般性的解释,下面我们以SQL注射为例进行讲解,以使读者对注射攻击有一个感性的认识,至于其他攻击,原理是一致的。

SQL注射能使攻击者绕过认证机制,完全控制远程服务器上的数据库。SQL是结构化查询语言的简称,它是访问数据库的事实标准。目前,大多数Web应用都使用SQL数据库来存放应用程序的数据。几乎所有的Web应用在后台都使用某种SQL数据库。跟大多数语言一样,SQL语法允许数据库命令和用户数据混杂在一起的。如果开发人员不细心的话,用户数据就有可能被解释成命令,这样的话,远程用户就不仅能向Web应用输入数据,而且还可以在数据库上执行任意命令了。

三、绕过用户认证

我们这里以一个需要用户身份认证的简单的Web应用程序为例进行讲解。假定这个应用程序提供一个登录页面,要求用户输入用户名和口令。用户通过HTTP请求发送他们的用户名和口令,之后,Web应用程序检查用户传递来用户名和口令跟数据库中的用户名和口令是否匹配。这种情况下,会要求在SQL数据库中使用一个数据库表。开发人员可以通过以下SQL语句来创建表:

CreateTABLEuser_table(

idINTEGERPRIMARYKEY,

usernameVARCHAR(32),

passwordVARCHAR(41)

);

上面的SQL代码将建立一个表,该表由三栏组成。第一栏存放的是用户ID,如果某人经过认证,则用此标识该用户。第二栏存放的是用户名,该用户名最多由32字符组成。第三栏存放的是口令,它由用户的口令的hash值组成,因为以明文的形式来存放用户的口令实在太危险,所以通常取口令的散列值进行存放。我们将使用SQL函数PASSWORD()来获得口令的hash值,在MySQL中,函数PASSWORD()的输出由41字符组成。

对一个用户进行认证,实际上就是将用户的输入即用户名和口令跟表中的各行进行比较,如果跟某行中的用户名和口令跟用户的输入完全匹配,那么该用户就会通过认证,并得到该行中的ID。假如用户提供的用户名和口令分别为lonelynerd15和mypassword,那么检查用户ID过程如下所示:

SelectidFROMuser_tableWhereusername=’lonelynerd15’ANDpassword=PASSWORD(’mypassword’)

如果该用户位于数据库的表中,这个SQL命令将返回该用户相应的ID,这就意味着该用户通过了认证;否则,这个SQL命令的返回为空,这意味着该用户没有通过认证。

下面是用来实现自动登录的Java代码,它从用户那里接收用户名和口令,然后通过一个SQL查询对用户进行认证:

Stringusername=req.getParameter("username");

Stringpassword=req.getParameter("password");

Stringquery="SelectidFROMuser_tableWhere"+

"username=’"+username+"’AND"+

"password=PASSWORD(’"+password+"’)";

ResultSetrs=stmt.executeQuery(query);

intid=-1;//-1impliesthattheuserisunauthenticated.

while(rs.next()){

id=rs.getInt("id");

}

开头两行代码从HTTP请求中取得用户输入,然后在下一行开始构造一个SQL查询。执行查询,然后在while()循环中得到结果,如果一个用户名和口令对匹配,就会返回正确的ID。否则,id的值仍然为-1,这意味着用户没有通过认证。表面上看,如果用户名和口令对匹配,那么该用户通过认证;否则,该用户不会通过认证——但是,事实果真如此吗?非也!读者也许已经注意到了,这里并没有对SQL命令进行设防,所以攻击者完全能够在用户名或者口令字段中注入SQL语句,从而改变SQL查询。为此,我们仔细研究一下上面的SQL查询字符串:

Stringquery="SelectidFROMuser_tableWhere"+

"username=’"+username+"’AND"+

"password=PASSWORD(’"+password+"’)";

上述代码认为字符串username和password都是数据,不过,攻击者却可以随心所欲地输入任何字符。如果一位攻击者输入的用户名为

’OR1=1—

而口令为

x

那么查询字符串将变成下面的样子:

SelectidFROMuser_tableWhereusername=’’OR1=1–’ANDpassword

=PASSWORD(’x’)

该双划符号–告诉SQL解析器,右边的东西全部是注释,所以不必理会。这样,查询字符串相当于:

SelectidFROMuser_tableWhereusername=’’OR1=1

如今的Select语句跟以前的已经大相径庭了,因为现在只要用户名为长度为零的字符串’’或1=1这两个条件中一个为真,就返回用户标识符ID——我们知道,1=1是恒为真的。所以这个语句将返回user_table中的所有ID。在此种情况下,攻击者在username字段放入的是SQL指令’OR1=1–而非数据。

四、构造SQL注射代码

为了成功地注入SQL命令,攻击者必须将开发人员的现有SQL命令转换成一个合法的SQL语句,当然,要盲注是有些难度的,但一般都是这样:

'OR1=1–

或者

')OR1=1–

此外,许多Web应用提供了带来错误报告和调试信息,例如,利用'OR1=1–对Web应用进行盲注时,经常看到如下所示的错误信息:

Errorexecutingquery:
YouhaveanerrorinyourSQLsyntax;
checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear
'Select(title,body)FROMblog_tableWherecat='OR1=1'atline1

该错误信息详细地为我们展示了完整的SQL语句,在此种情况下,SQL数据库所期待的好象是一个整数,而非字符串,所以可以注入字符串OR1=1–,把单引号去掉就应该能成功注入了。对于大多数SQL数据库,攻击者可以在一行中放入多个SQL语句,只要各个语句的语法没有错误就行。在下面的代码中,我们展示了如何将username设为'OR1=1并把password设为x来返回最后的用户ID:

Stringquery="SelectidFROMuser_tableWhere"+

"username='"+username+"'AND"+

"password=PASSWORD('"+password+"')";

当然,攻击者可以注入其它的查询,例如,把username设为:

'OR1=1;DropTABLEuser_table;–

而这个查询将变成:

SelectidFROMuser_tableWhereusername=''OR1=1;DropTABLEuser_table;–'ANDpassword=PASSWORD('x');

它相当于:

SelectidFROMuser_tableWhereusername=''OR1=1;DropTABLEuser_table;

这个语句将执行句法上完全正确的Select语句,并利用SQLDrop命令清空user_table。

注射式攻击不必非要进行盲式攻击,因为许多Web应用是利用开放源代码工具开发的,为了提高注射式攻击的成功率,我们可以下载免费的或者产品的试用版,然后在自己的系统上搭建测试系统。如果在测试系统上发现了错误,那么很可能同样的问题也会存在于所有使用该工具的Web应用身上。

五、小结

我们在本文中向读者介绍了注射攻击的根本原因,即没有对数据和命令进行严格区分。然后通过一些程序源码对SQL的攻击进行了细致的分析,使我们对SQL注射机理有了一个深入的认识。如果您是一名web应用开发人员,那么您就当心了,一定不要盲目相信用户端的输入,而要对用户输入的数据进行严格的“消毒”处理,否则的话,SQL注射将会不期而至。

八月 31st, 2008

Posted In: 未分类

SQL注入流行很久了,我们找漏洞注入目的无非是想得到数据库内的东西,比如用户名密码等,更进一步的MSSQL数据库还可以借此获得权限。基于Access的基础来说,如果我们不用注入就可以得到整个数据库,不是更好吗?于是暴库成了一个比注入更简单的入侵手段。
有关暴库的方法,高手们常在入侵文章中提到,但多是一笔带过,有些就某一个方法谈的,也多是就方法进行探讨。最近有一篇《再谈%5c暴库的利用》的文章,算是对暴库进行了一些总结,因而在网是流传很广。但仍没有谈及原理,而且结论也只是就于经验,似是而非,于是决定来谈谈暴库的原理与规律。不到之处,大家多指教。

“%5c”暴库******************
这种方法被认为是暴库绝招,很是流行了一阵,但是和其它漏洞一样,随着知道的人多了,防备也加强了,没以前那么有效。这种方法简单点说就是在打开网页时,把网址址中的“/”换成“%5c”,然后提交,就可以暴出数据库的路径。
  实际上,并不是所有网址都有效,需要“asp?id=”这样的网页地址,或者说表示有调用数据库的行为的地址。如果你确认这个网页有调用数据库的,后面不是这样的也可以,比如Chklogin.asp等也可以(还有其它条件,后面再谈)。先举个黑防第四轮实验室中的例子:
http://219.237.81.46/yddown%5cview.asp?id=3
把第二个“/”换成“%5c”:
http://219.237.81.46/yddown%5cview.asp?id=3
提交后会得到如下返回结果:
Microsoft JET Database Engine 错误 ’80004005’
’D:111adminrds_dbd32rfd213fg.mdb’不是一个有效的路径。 确定路径名称拼写是否正确,以及是否连接到文件存放的服务器。
/yddown/conn.asp,行12

这是黑防实验室的一个系统,暴库是小编们故意开放的,因为它的关口不是注入,而是进入后台后如何获得WebShell。可以看到我们直接获取了数据库地址,可以下载了。
现在很多人都知道这个方法了,我就不多举例了。但清楚暴库原理的人估计是不多的,有人成功,有人不成功,《再谈%5c暴库的利用》一文总结说,须变换第二个“/”为“%5c”才行。很有实用性,但这个结论只是一种经验,其实并不正确,让我们先看看它的原理。
“%5c”暴库法,它不是网页本身的漏洞,而是利用了IIS解码方式中的一个特性,如果IIS安全设置不周全,而网页设计者未考虑IIS错误,就会被人利用。为何要用“%5c”?它实际上是“”的十六进制代码,也就是“”的另一种表示法。在电脑中,它们是同一个东东,但提交“”和“%5c”却会产生不同的结果。在IE中,我们把下面第一个地址中的“/”换成“”提交:
http://219.237.81.46/yddown/view.asp?id=3
http://219.237.81.46/yddownview.asp?id=3
二者的访问结果是一样的。IE会自动把“”转变成“/”,从而访问到同一地址。但是,当我们把“/”换成十六进制写法“%5c”时,IE不会对此进行转换。地址中的“%5c”被原样提交了,抓包结果如下:
GET /yddown%5cview.asp?id=3 HTTP/1.1
当IIS收到并做出解析时,又会将%5c还原成“”。这样,IIS中网址的相对路径就变成/yddownview.asp,这一点很重要,问题正是从这里开始的。
在ASP网页中,凡调用数据库时,都会用到一个连接数据库的网页Conn.asp,它会创建一个数据库连接对象,定义要调用的数据库路径,一个典型的Conn.asp如下:
<% dim conn dim dbpath set conn=server.createobject("adodb.connection") DBPath = Server.MapPath("admin/rds_dbd32rfd213fg.mdb") conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & DBPath %>
大家注意第4句:“DBPath = Server.MapPath("admin/rds_dbd32rfd213fg.mdb")”,Server.MapPath方法的作用是将网站中的相对路径转变成物理上的绝对路径,为何要这样?因为连接数据库时,须指明它的绝对路径才能读取和写入。那什么是相对路径、绝对路径?IIS为了不让访问者知道真实的实际路径,并且确保网站不因变换地址而影响使用,它采用了一种相对路径来表示目录与文件之间的关系。也就是网址目录只表示从根目录起的相对位置。比如网站:http://219.237.81.46的根目录为:“D:111”,雨点下载目录则在根目录(D:111)内的“yddown”下,我们网站访问该站时,就是在访问D:111yddown目录,而http://219.237.81.46/yddown/admin/只表明了Admin与Yddown这个目录的相对关系,把这个网站放在E盘,也一样不改变Admin位于Yddown目录下的关系。
当Server.MapPath方法将相对路径转为真实路径时,它实际是三部分路径加在一起得到真实路径的:网页目前执行时所在的相对路径,也就是从网站物理根目录起的相对路径,比如上面例子中Conn.asp处在从根目录起的“/yddown/”下;然后调用的数据库的相对路径是admin/rds_dbd32rfd213fg.mdb,这样就得到从根目录起的完整相对路径:“/yddown/admin/rds_dbd32rfd213fg.mdb”。这些都只是相对的路径,如何变为真实路径呢?
  设置过IIS的人都会知道,每一个网站,都必须指定它在硬盘上的物理目录,比如上例中,网站根目录所在的物理目录为:“D:111”,Server.MapPath方法正是通过把“网站根目录的物理地址+完整的相对路径”,从而得到真实的物理路径,数据库在硬盘上的物理路径是:D:111yddownadminrds_dbd32rfd213fg.mdb。IIS以“”表示真实路径的目录关系,而以“/”表示虚拟路径,这可能就是IE会自动把我们地址中的“”转为“/”的原因。
  明白这些,我们再来理解暴库就不难了,当我们提交:http://219.237.81.46/yddown%5cview.asp?id=3时,View.asp调用Conn.asp后,得到的网页相对路径是这样的:“/yddown”,再加上“admin/rds_dbd32rfd213fg.mdb”,就得到“/yddown+admin/rds_dbd32rfd213fg.mdb”。在IIS中,“/”和“”代表着不同的意义,遇到了“”时,认为它已到了根目录所在的物理路径,不再往上解析(为何不再往上解析?后面还会分析),于是网站的完整相对路径变成了:“admin/rds_dbd32rfd213fg.mdb”,再加上根目录的物理路径,得到的真实路径变成:“D:111adminrds_dbd32rfd213fg.mdb”,而这个路径是不存在的,数据库连接当然会失败,于是IIS会报错,并给出错误原因:
Microsoft JET Database Engine 错误 ’80004005’
’D:111adminrds_dbd32rfd213fg.mdb’不是一个有效的路径。 确定路径名称拼写是
否正确,以及是否连接到文件存放的服务器。
/yddown/conn.asp,行12
这就是暴库方法的来历。
  《再谈%5c暴库的利用》一文中说,必须是网址中的第二级目录才可以成功,第一个不行。我们从理论上来分析一下,看到底有无规律。还以上面网址为例,如果将第一个“/”换成“%5c”,得到的网站相对路径变成“yddows/admin/rds_dbd32rfd213fg.mdb”,解析到“”时,认为已到物理目录,不再往前解析。而事实上,它确实也是根目录,所以得到的物理路径为:“D:111dydowadminrds_dbd32rfd213fg.mdb”,这个路径是正确的,所以不会出错,当然不会暴出数据库路径。
第二个“/”换成“%5c”的情况,我们上面已作分析,那是不是真的就是二级页面才可以暴出呢?事实上,只是因为二级页面较为常见,并不是真理。如果这个下载系统是某一个网站中的三级目录,那第三个“/”成功的可能性更大。也就是说,最右边第一个成功可能性大!
我先举个例子,再说原因:
http://nice.xmu.edu.cn/channely/blog/showlog.asp?cat_id=31&log_id=246
这个网址变第二个“/”为“%5c”时,网站打开很慢,但没有出错。当我们把第三个“/”变成“%5c”后,提交:
http://nice.xmu.edu.cn/channely/blog%5cshowlog.asp?cat_id=31&log_id=246
数据库暴出来了:
Microsoft JET Database Engine 错误 ’80004005’
’H:channelylog_mdb%29dlog_mdb%29.asp’不是一个有效的路径。 确定路径名称拼写是否正确,以及是否连接到文件存放的服务器。
/channely/blog/conn.asp,行18
为何这样?这是因为网站用了虚拟目录,也就是说这个网站的子目录Channely并不在网站根目录内。设置过IIS的人会知道,可以将网站目录外的一个真实物理目录设置为网站的虚拟目录。也就是说,网站的相对对径并不总是从根目录算起,很可能在某个子目录就指向了物理目录。

上面的结果很显然,Channely已位于H:盘的根目录上,上面再没有目录。事实上,很可能网站在D:盘或E:盘,而通过IIS中设置Channely虚拟子目录指向网站根目录以外的“H:channely”。
这里,我们可以更清楚的看到,微软IIS为何没有到根目录,只要遇上“”就认为已到物理绝对路径,不再往上解析的原因,就是为了处理这种网站虚拟目录与根目录不在一起的情况。它优先查询每个目录是否指向了物理路径,如果指向了,则把它换成绝对路径,而它上面的相对地址不再解析转换。
从以上分析可知,我们只有在数据库相对地址和它的目录绝对地址之间使用“”(“%5c”)才能达到目的。上例中,如果在第二处使用,它只会影响到IIS寻找虚拟的Channely目录地址,而Conn.asp中解析出的数据库地“H:channelybloglog_mdb%29dlog_mdb%29.asp”仍是对的。
《再谈%5c暴库的利用》中还说了一种针对只有一级目录的解决方法:“其实一级目录我们也同样可以成功的,我们可以通过构造一个多级目录来达到暴库的目的。如:
http://www.target.com/noexists/..%5clist.asp?id=1
这样大家就会有新的惊喜了,呵呵。”真的吗?从理论上分析,这种方法是不会成功的。因为遇到“%5c”时,页面不再解析,所以中间构造的目录不论是真是假,都是不起作用而被舍弃了,相对路径还是到了根目录,路径不会出错。为了证明,我特意找了一个例子:
http://www.om88.com/Article_Show.asp?ArticleID=481
这个网站我们先用Conn.asp方法暴出数据库(后面将讲解这个方法),说明服务器和网站设置是可以暴库的。提交:
http://www.om88.com/inc/conn.asp
可以看到是可以暴库的,我们再提交:
http://www.om88.com/abc/..%5cArticle_Show.asp?ArticleID=481
却暴不出库,仍得到正常页面(换成存在的路径结果也一样),但图片无法显示。这是因为相对路径变了,所以无法正确找到图片路径,但绝对路径解析时被“%5c”舍弃了,没有出错,当然暴不出库了。

Conn.asp暴库******************
这里的Conn.asp只是表示数据库调用文件,因为多数都是这个名字(有些网站改名,我们也视同Conn.asp)。其实,这种暴库法是最先出现的,以前很多牛人都对此进行过探讨,我记得黑防也在特别早的时候专门讨论了这个方法。只是在“%5c”暴库******************出现后,倒较少有人提及。其实个人认为,“%5c”暴******************随着服务器设置安全性的加强,用武之地会越来越少。而Conn.asp暴库******************发挥的余地更大,可以人为构造,臭要饭的当年著名的动网大挪移实现暴库,其实也属于此类。
在上面http://www.om88.com/的一例中,用“%5c”暴不出数据库路径,因为没有二级目录,但用第二种却可以暴出,它是动力系统的。我们再来看另外一个盗帅的例子:http://www.51see.org/
提交:
http://www.51see.org/db/user.asp
得到如下结果:。
“Microsoft JET Database Engine 错误 ’80004005’
’d:Hostingwwwrootuilady_comhtdocsdbdbdownloadwoaini12345.asp’不是一个有效的路径。 确定路径名称拼写是否正确,以及是否连接到文件存放的服务器。
/db/user.asp,行6 ”
有人可能会说,这么简单就暴库,好爽!是不是所有网站都可以这样啊?当然不是,已作了防护的站点肯定不行,没作防护的,要暴库也是有条件的。如果说第一种暴库法是利用了绝对路径出错,那么,这种暴库法就是利用了相对路径出错。
一般来说,只要Conn.asp不在根目录的系统,而调用文件在根目录,就会出现这种问题。当然这种说法也是经验性的,准确的说就是,Conn.asp与调用它的文件如果相对位置改变了,就会报错,暴出数据库路径。这样说可能有人不明白,不要紧,接着看你就会明白的。
我们从动力文章系统说起。
动力文章系统的Conn.asp位于系统下的INC目录下,而很多调用它的文件在系统根目录下,比如User_ChkLogin.asp等,这样当Conn.asp执行时,它是在系统根目录“D:wwwrootzyx688wwwroot”下执行的。因此,Conn.asp文件中,调用数据库时它考虑到执行时的目录路径,因而数据库的相对地址写成如下:
db="database/fp360609.asp"
这样,当它在系统根目录下执行时,数据库的相对路径为根目录下的“database”目录,但当我们直接请求它时,它工作的当前目录是在根目录下的INC目录内,这时数据库的相对路径就变成了“inc/database/fp360609.asp”,这样它当然出错,得到的绝对路径中也多出了“inc”。为了让大家看得更清楚,我们举一个可以用两种方法暴库的网站,比较一下看有何不同。提交:
http://www.pofen.com/sc/down%5cshow.asp?id=437
得到:
“Microsoft JET Database Engine 错误 ’80004005’
’D:Webdatapofen.comscdbdownload.mdb’不是一个有效的路径。 确定路径名称拼写是否正确,以及是否连接到文件存放的服务器。
/sc/down/db/user.asp,行6 ”
再提交:
http://www.pofen.com/sc/down/db/user.asp
得到:
Microsoft JET Database Engine 错误 ’80004005’
’D:Webdatapofen.comscdowndbdbdownload.mdb’不是一个有效的路径。 确定路径名称拼写是否正确,以及是否连接到文件存放的服务器。
/sc/down/db/user.asp,行6
两种方法得到的绝对路径,一个比实际路径少了,一个则多了,这两个系统都是因为Conn.asp不在系统根目录下而引起的。那是不是Conn.asp放在根目录,与调用的文件在一个目录下就无事呢?如果在一起,当然没事,但牛人自有牛法子,可以通过构造方法来造成相对路径变化,一样能达到暴库的目的。比如,动网的大挪移手法,将Conn.asp移位,从而暴库。
当然,实际操作中,因为Conn.asp移走后,网站无法工作,所以没有成功,但这种思路还是给很多人启发。如果有一种方法可以复制而不是移动,或者说,移动的不是Conn.asp,而是调用Conn.asp的其它文件,比如Chklogin之类,理论上就可以成功。今天刚看到一个暴动易系统路径的最新方法,其原理就是构造错误而达到获得真实路径的目的。

防范暴库
说白了,暴库是因为IIS服务器会对每个执行错误给出详细说明,并停止执行,IIS的默认设置又是将错误信息返回给用户。因此,要避免暴库,就应改变IIS的默认设置,选取错误时只给一个出错的通知,不给详细信息。
其实,有些虚拟主机为了便于站长调试,一般不关掉信息返回,作为网站管理者,又无法对虚拟主机设置时,只能在网页中加强防范。就是在可能出错的页面加上这一句:“On Error Resume Next”。它的意思是出错后,恢复执行下面的语句,也就是不理会出错,当然就不会给出错误信息了。动易系统3.62版加上这句话后,现在就暴不出路径了,而天意商务网的Conn.asp也不在根目录,但因为加了这句,也暴不出数据库了。

八月 31st, 2008

Posted In: 未分类

安装MySQL

建立mysql组和mysql用户
[root@localhost lamp]#groupadd mysql
[root@localhost lamp]#useradd -g mysql mysql

解压源代码
[root@localhost lamp]#tar -zxvf mysql-5.0.33.tar.gz
[root@localhost lamp]#cd mysql-5.0.33

建立配置参数
[root@localhost mysql-5.0.33]#./configure –prefix=/usr/local/mysql –sysconfdir=/usr/local/mysql –without-isam –without-debug –enable-assembler –with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock –with-mysqld-user=mysql –with-extra-charset=all –with-client-ldflags=-all-static –with-mysqld-ldflags=-all-static –localstatedir=/usr/local/mysql/data –enable-thread-safe-client

我这里配置的参数比较多,因为我懒,也没有耐心仔细解释每个参数的意义了。如果你觉得很麻烦的话,也可以使用比较简单一点的参数,例如:
[root@localhost mysql-5.0.33]#./configure –prefix=/usr/local/mysql –enable-thread-safe-client

这最后一个参数一定要加上,目的是为了使用MySQL的客户端线程,否则的话后面编译PHP时是要出错的。

编译
[root@localhost mysql-5.0.33]#make
[root@localhost mysql-5.0.33]#make install

只要步骤3没有出任何错误,那么现在这个过程就会是整个安装过程中最费时的步骤,因此我建议在你按下回车以后,最好找一点有意义的事情(许三多说的,不是我说的……)做。反正我利用这个时间把DS论坛的首页帖子翻了一遍。

复制配置文件
[root@localhost mysql-5.0.33]#cp support-files/my-medium.cnf /etc/my.cnf

初始化数据库
[root@localhost mysql-5.0.33]#cd /usr/local/mysql
[root@localhost mysql]#bin/mysql_install_db –user=mysql

修改目录权限
  注意,在修改目录权限的时候,我按照源代码包中的INSTALL-SOURCE文档提示的进行权限设置时,发现MySQL没法启动成功,后来我干脆按照自己的方式进行设置后,数据库就可以启动了,问题在哪里呢?下面是两种方法,哪种方法适合你,你就用哪种吧。

方法一(原版):
[root@localhost mysql]#chown -R root .
[root@localhost mysql]#chown -R var
[root@localhost mysql]#chgrp -R mysql .

方法二(俺的版本):
[root@localhost mysql]#mkdir tmp
[root@localhost mysql]#chown -R root .
[root@localhost mysql]#chgrp -R mysql .
[root@localhost mysql]#chown -R mysql data
[root@localhost mysql]#chown -R mysql tmp

为什么没有为var设置权限那句呢?因为我发现我的这个目录里面并没有这个目录,你让我怎么设置呢?

启动服务器
  按照INSTALL-SOURCE文档的说法,使用下面的命令就可以启动MySQL数据库了:
[root@localhost mysql]#bin/mysqld_safe –user=mysql &

其实,MySQL数据库早就提供了另外一种更加方便的启动方式。进入/usr/local/mysql/share/mysql/下面会找到一个 mysql.server文件,它的属性是755。我们把它复制到/etc/init.d/下面,并把它加入到系统服务表中,您就可以在任何地方用 service mysql start语句来启动它,并用service mysql stop停止它。怎么做呢?
[root@localhost mysql]#cp ./mysql.server /etc/init.d/mysql
[root@localhost mysql]#chkconfig –add mysql
[root@localhost mysql]#service mysql start

测试数据库服务器
到此,MySQL已经安装完毕了,是不是成功了呢?测试一下就知道了。
[root@localhost mysql]#bin/mysql -u root -p
[root@localhost mysql]#Enter password:

需要输入密码?!密码是什么呢?
root用户的默认密码是空,直接输入回车就可以了。
看看是不是出现下面的信息了:
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 2
Server version: 5.0.33-log Source distribution

Type 'help;' or 'h' for help. Type 'c' to clear the buffer.

mysql>

那么恭喜你,MySQL数据库安装成功,并且已经启动了!
  下一个!
  下面是不是就该Apache出场了呢?别急,在安装Apache之前先把zlib包装上,因为Apache需要用到它。

  安装zlib

解压源代码
[root@localhost lamp]#cd /home/downloads/software/lamp/
[root@localhost lamp]#cd zlib-1.2.3
[root@localhost zlib-1.2.3]#tar -zxvf zlib-1.2.3.tar.gz

配置参数
[root@localhost zlib-1.2.3]#./configure –prefix=/usr/local/zlib

编译安装
[root@localhost zlib-1.2.3]#make
[root@localhost zlib-1.2.3]#make install

  安装完毕了,下面该拿Apache开刀了!

  安装Apache

解压源代码
[root@localhost zlib-1.2.3]#cd ..
[root@localhost lamp]#tar -zxvf httpd-2.2.4.tar.gz

配置参数
[root@localhost lamp]#cd httpd-2.2.4
[root@localhost httpd-2.2.4]#./configure –prefix=/usr/local/httpd –enable-so –with-mysql=/usr/local/mysql –enable-cgi –with-config-file-path=/usr/local/httpd/conf –enable-track-vars –enable-mods-shared=all –enable-cache –enable-disk-cache –enable-mem-cache –enable-rewrite –with-mpm=worker –with-z-dir=/usr/local/zlib

编译没有出错,就可以进行编译安装了。如果出了错,没办法,好好找找错误处在哪里咯,呵呵……

编译安装
[root@localhost httpd-2.2.4]#make
[root@localhost httpd-2.2.4]#make install

只要配置参数时没有错误,这一步基本上不会出错的。

测试一下……
安装完毕了,总要测试一下是不是可以用吧,先让我们把httpd服务启动起来:
[root@localhost httpd-2.2.4]#/usr/local/httpd/bin/apachectl start
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName

  怎么会有错误提示呢?别害怕,那时因为在httpd的配置文件里面没有制定主机名,不过不影响使用的。
  用浏览器访问一下本地试试(http://127.0.0.1),屏幕上是不是显示:It works !这个就不用解释了吧,人家已经说得很明白了,俺开始工作了!

系统设置
我想你肯定不想每次启动电脑后,都要打一遍启动Apache服务的命令吧,但是怎么让电脑自动运行呢?别急,有办法,输入下面的命令就可以了:
[root@localhost httpd-2.2.4]#echo "/usr/local/httpd/bin/apachectl start" >> /etc/rc.d/rc.local

这样,每次启动服务器后,Apache就会乖乖的自动启动了,呵呵……
  在开始安装PHP前,还是一样要把它需要的组件先装完,这个是顺序。

  安装libpng

解压源代码
[root@localhost httpd-2.2.4]#cd ..
[root@localhost lamp]#tar -zxvf libpng-1.2.8.tar.gz

复制预编译文件
[root@localhost lamp]#cd libpng-1.2.8
[root@localhost libpng-1.2.8]#cp scripts/makefile.linux make file

说实话,我也不知道软件作者为啥还要搞这一步,把这个文件直接放在目录里面很难么?

编译安装
[root@localhost libpng-1.2.8]#make
[root@localhost libpng-1.2.8]#make install

  安装freetype

解压源代码
[root@localhost libpng-1.2.8]#cd ..
[root@localhost lamp]#tar -zxvf freetype-2.1.10.tar.gz

配置参数
[root@localhost libpng-1.2.8]#cd freetype-2.1.10
[root@localhost freetype-2.1.10]#./configure –prefix=/usr/local/freetype

编译安装
[root@localhost freetype-2.1.10]#make
[root@localhost freetype-2.1.10]#make install

  安装jpegsrc.v6b

解压源文件
[root@localhost freetype-2.1.10]#cd ..
[root@localhost lamp]#tar -zxvf jpegsrc.v6b.tar.gz

建立默认目录
这个模块安装比较麻烦,它不会自己建立目录,所以所有的目录都需要我们自己建立,烦……
[root@localhost lamp]#cd jpeg-6b
[root@localhost jpeg-6b]#mkdir -p /usr/local/jpeg6
[root@localhost jpeg-6b]# mkdir -p /usr/local/jpeg6/bin
[root@localhost jpeg-6b]# mkdir -p /usr/local/jpeg6/lib
[root@localhost jpeg-6b]# mkdir -p /usr/local/jpeg6/include
[root@localhost jpeg-6b]# mkdir -p /usr/local/jpeg6/man
[root@localhost jpeg-6b]# mkdir -p /usr/local/jpeg6/man1
[root@localhost jpeg-6b]# mkdir -p /usr/local/jpeg6/man/man1

配置参数
[root@localhost jpeg-6b]#./configure –prefix=/usr/local/jpeg6/ –enable-shared –enable-static

编译安装
[root@localhost jpeg-6b]#make
[root@localhost jpeg-6b]#make install
[root@localhost jpeg-6b]#make install-lib

  安装libxml2

解压源代码
[root@localhost jpeg-6b]#cd ..
[root@localhost lamp]#tar -zxvf libxml2-2.6.27.tar.gz

建立目录
唉,又是一个需要自己建立目录的……
[root@localhost libxml2-2.6.27]#mkdir -p /usr/local/libxml2

配置参数
[root@localhost libxml2-2.6.27]#./configure –prefix=/usr/local/libxml2

编译安装
[root@localhost libxml2-2.6.27]#make
[root@localhost libxml2-2.6.27]#make install

复制配置文件
俺也不知道为什么要手动复制这个东东!
[root@localhost libxml2-2.6.27]#cp xml2-config /usr/bin

  安装GD库

解压源代码
[root@localhost libxml2-2.6.27]#cd ..
[root@localhost lamp]#tar -zxvf gd-2.0.33.tar.gz

建立安装目录
啥也不说了……
[root@localhost lamp]#cd gd-2.0.33
[root@localhost gd-2.0.33]#mkdir -p /usr/local/gd

配置参数
[root@localhost gd-2.0.33]#./configure –prefix=/usr/local/gd –with-jpeg=/usr/local/jpeg6 –with-freetype=/usr/local/freetype –with-png=/usr/local/lib –with-zlib=/usr/local/zlib

编译安装
[root@localhost gd-2.0.33]#make
[root@localhost gd-2.0.33]#make install

  最后一个主角出场了!

  安装PHP

解压源代码
[root@localhost gd-2.0.33]#cd ..
[root@localhost lamp]#tar -zxvf php-5.2.0.tar.gz

配置参数
[root@localhost lamp]#cd php-5.2.0
[root@localhost php-5.2.0]#./configure –prefix=/usr/local/php –with-apxs2=/usr/local/httpd/bin/apxs –with-gd=/usr/local/gd –enable-gd –enable-gd-native-ttf –with-jpeg-dir=/usr/local/jpeg6 –with-png=/usr/local/lib –with-ttf –with-zlib=/usr/local/zlib –with-freetype-dir=/usr/local/freetype –enable-magic-quotes –with-mysql=/usr/local/mysql –with-mysql-sock=/usr/local/mysql/tmp/mysql.sock –with-iconv –with-mbstring –enable-mbstring –enable-track-vars –enable-force-cgi-redirect –enable-ftp –with-config-file-path=/usr/local/httpd/conf –with-pear=/usr/local/php/pear

编译安装
[root@localhost php-5.2.0]#make
[root@localhost php-5.2.0]#make install

复制配置文件
[root@localhost php-5.2.0]#cp php.ini-dist /usr/local/php/lib/php.ini

修改Apache配置
PHP是要和Apache配合使用,所以当然需要修改一下Apache的配置文件咯……
[root@localhost php-5.2.0]#vi /usr/local/httpd/conf/httpd.conf

找到文件中的“#AddType application/x-gzip .gz .tgz”这行,在下面手动添加两行:
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

保存配置,然后重新启动Apache
[root@localhost php-5.2.0]#/usr/local/httpd/bin/apachectl restart

测试
测试也很简单,在/usr/local/httpd/htdocs/下面建立一个phpinfo.php文件,里面写

  然后呢,在浏览器里面输入“http://127.0.0.1/phpinfo.php”,如果页面上出现了PHP的版权信息及系统配置情况,说明你的PHP已经可以使用了。如果页面上出现的是你刚才写的代码,麻烦了,回头检查一下哪里有问题咯……
  晕,终于写完了,试试吧,看看有没有写错什么

  Over

八月 27th, 2008

Posted In: 未分类

沉默了一个月的BLOG,在今天偶联系了N次IDC之后,总算在次启动,申请呀打电话找人哪,哎~~~~还是以后放在自己的服务器里面好,好久没写东西了,突然间不知道在次写什么东西了?在次郁闷中

八月 26th, 2008

Posted In: 未分类

无觅相关文章插件,快速提升流量