分析过程
试验码:
Regname:ligyuan
Regcode:1234 5678 abcd efgh
运行软件,有nag和剩余时间提示,点注册弹出注册对话框,输入试验码,下断点
bp getDlgItem,bp GetDlgItemTextA,bp GetWindowTextA |
点确定,没有被断下。弹出错误对话框,点try again,程序被截下,Ctrl+F9返回 F9几次后,弹出了注册对话框,再次输入试验码,点确定程序运行返回到这里:
100020C1 51 push ecx
100020C2 68 2D1F0010 push BSSuppor.10001F2D
100020C7 FF71 0C push dword ptr ds:[ecx+C]
100020CA FF71 10 push dword ptr ds:[ecx+10]
100020CD FF71 04 push dword ptr ds:[ecx+4]
100020D0 FF15 54D10010 call dword ptr ds:[<&USER32.DialogBoxParamA>] ;
100020D6 8BF0 mov esi,eax
100020D8 83FE FF cmp esi,-1
100020DB 75 05 jnz short BSSuppor.100020E2
100020DD E8 1EEFFFFF call BSSuppor.10001000
100020E2 8BC6 mov eax,esi ;F8单步运行
100020E4 5E pop esi
100020E5 C3 retn ;运行到这后返回
/////////////////////////////////////////////////////////////////////////
10002DC6 8B06 mov eax,dword ptr ds:[esi] ;来到这里
10002DC8 FFB0 CC010000 push dword ptr ds:[eax+1CC]
10002DCE 8D4D E8 lea ecx,dword ptr ss:[ebp-18]
10002DD1 E8 46FAFFFF call BSSuppor.1000281C ;这里是把每一组注册码
转为16进制
10002DD6 8B06 mov eax,dword ptr ds:[esi]
10002DD8 8B4D AC mov ecx,dword ptr ss:[ebp-54] ;第一组的16进制送ecx
10002DDB 8988 F0010000 mov dword ptr ds:[eax+1F0],ecx ;转存到ds:[eax+1F0]
10002DE1 8B06 mov eax,dword ptr ds:[esi]
10002DE3 8B4D B0 mov ecx,dword ptr ss:[ebp-50] ;第二组的16进制送ecx
10002DE6 8988 F4010000 mov dword ptr ds:[eax+1F4],ecx ;转存到ds:[eax+1F4]
10002DEC 8B06 mov eax,dword ptr ds:[esi]
10002DEE 8B4D B4 mov ecx,dword ptr ss:[ebp-4C] ;第三组的16进制送ecx
10002DF1 8988 F8010000 mov dword ptr ds:[eax+1F8],ecx ;转存到ds:[eax+1F8]
10002DF7 8B06 mov eax,dword ptr ds:[esi]
10002DF9 8B4D B8 mov ecx,dword ptr ss:[ebp-48] ;第四组的16进制送ecx
10002DFC 8988 FC010000 mov dword ptr ds:[eax+1FC],ecx ;转存到ds:[eax+1FC]
10002E02 8B0E mov ecx,dword ptr ds:[esi]
10002E04 8D45 90 lea eax,dword ptr ss:[ebp-70]
10002E07 50 push eax
10002E08 E8 8EFEFFFF call BSSuppor.10002C9B
10002E0D 8B1E mov ebx,dword ptr ds:[esi]
10002E0F 8BCB mov ecx,ebx
10002E11 E8 AEFBFFFF call BSSuppor.100029C4
10002E16 85C0 test eax,eax
10002E18 /74 08 je short BSSuppor.10002E22
10002E1A |6A 02 push 2
10002E1C |5F pop edi
10002E1D |E9 02010000 jmp BSSuppor.10002F24
10002E22 \8D45 BC lea eax,dword ptr ss:[ebp-44]
10002E25 50 push eax
10002E26 8BCB mov ecx,ebx
10002E28 E8 24FFFFFF call BSSuppor.10002D51
10002E2D 8945 F0 mov dword ptr ss:[ebp-10],eax
10002E30 8B0E mov ecx,dword ptr ds:[esi]
10002E32 8B81 F8010000 mov eax,dword ptr ds:[ecx+1F8]
10002E38 8B91 FC010000 mov edx,dword ptr ds:[ecx+1FC]
10002E3E 52 push edx
10002E3F 8945 EC mov dword ptr ss:[ebp-14],eax
10002E42 FF75 EC push dword ptr ss:[ebp-14]
10002E45 8B81 F4010000 mov eax,dword ptr ds:[ecx+1F4]
10002E4B 8B89 F0010000 mov ecx,dword ptr ds:[ecx+1F0]
10002E51 50 push eax
10002E52 51 push ecx
10002E53 FF75 F0 push dword ptr ss:[ebp-10]
10002E56 33DB xor ebx,ebx
10002E58 43 inc ebx
10002E59 8D4D E8 lea ecx,dword ptr ss:[ebp-18]
10002E5C 885D FC mov byte ptr ss:[ebp-4],bl
10002E5F E8 E9FAFFFF call BSSuppor.1000294D ;关键call,F7跟进
10002E64 57 push edi
10002E65 53 push ebx
10002E66 8D4D BC lea ecx,dword ptr ss:[ebp-44]
10002E69 8945 F0 mov dword ptr ss:[ebp-10],eax
10002E6C C645 FC 00 mov byte ptr ss:[ebp-4],0
10002E70 E8 9DE4FFFF call BSSuppor.10001312
10002E75 397D F0 cmp dword ptr ss:[ebp-10],edi
10002E78 0F85 A6000000 jnz BSSuppor.10002F24
下面是跟进后,里面的关键部分,中间省略了一些过程
//////////////////////////////////////////////////////////////对输入的用户名进行处理
10002874 3B7B 14 cmp edi,dword ptr ds:[ebx+14] ;edi是否大于或等于
用户名的长度
10002877 7D 2F jge short BSSuppor.100028A8 ;大就跳
10002879 C745 08 01000>mov dword ptr ss:[ebp+8],1
10002880 57 push edi
10002881 8BCB mov ecx,ebx
10002883 E8 BFFFFFFF call BSSuppor.10002847 ;读取用户名的一个字符
10002888 8038 20 cmp byte ptr ds:[eax],20 ;字符的ASCII值是否为0X20
1000288B 75 0A jnz short BSSuppor.10002897 ;不是就跳
1000288D 47 inc edi
1000288E FF45 08 inc dword ptr ss:[ebp+8]
10002891 837D 08 64 cmp dword ptr ss:[ebp+8],64 ;是否大于0X64
10002895 ^ 7C E9 jl short BSSuppor.10002880 ;不是往上跳取下一个字符
10002897 57 push edi
10002898 8BCB mov ecx,ebx
1000289A E8 A8FFFFFF call BSSuppor.10002847
1000289F 8A00 mov al,byte ptr ds:[eax] ;用户名字符的ASCII值送al
100028A1 884435 E8 mov byte ptr ss:[ebp+esi-18],al ;al转送到堆栈中
100028A5 47 inc edi
100028A6 EB 05 jmp short BSSuppor.100028AD
100028A8 C64435 E8 40 mov byte ptr ss:[ebp+esi-18],40 ;用户名长度小于0X10时,用40填充
100028AD 46 inc esi
100028AE 83FE 10 cmp esi,10 ;比较是否进行了0X10 次操作
100028B1 ^ 7C C1 jl short BSSuppor.10002874 ;不是往上跳继续
///////////////////////////////////////////////////////下面是由上面处理后的用户名
得出注册码的过程
100028BC 8D7C1D E8 lea edi,dword ptr ss:[ebp+ebx-18] ;用户名的基址送edi
100028C0 C745 08 04000>mov dword ptr ss:[ebp+8],4 ;ss:[ebp+8]=4,
用来得出4位注册码
100028C7 8B4D FC mov ecx,dword ptr ss:[ebp-4] ;为ecx赋值一个内存地址
100028CA E8 58FFFFFF call BSSuppor.10002827 ;算法call
100028CF 0FBE0F movsx ecx,byte ptr ds:[edi] ;取用户名的一个字符值送ecx
100028D2 33D2 xor edx,edx
100028D4 8D4408 F6 lea eax,dword ptr ds:[eax+ecx-A] ;eax=eax+ecx-0xa
100028D8 6A 0A push 0A
100028DA 59 pop ecx ;ecx=0xa
100028DB F7F1 div ecx ;eax=eax/ecx,edx=eax%ecx
100028DD 83C7 04 add edi,4 ;edi+=4,相当于隔3个字符取
下一字符
100028E0 80C2 30 add dl,30 ;dl+=30
100028E3 889435 E8FEFF>mov byte ptr ss:[ebp+esi-118],dl ;得到值的对应字符送到存储
空间保存
100028EA 46 inc esi ;esi++
100028EB FF4D 08 dec dword ptr ss:[ebp+8] ;从4减到0
100028EE ^ 75 D7 jnz short BSSuppor.100028C7 ;不为0就往上跳继续下一个字符
100028F0 C68435 E8FEFF>mov byte ptr ss:[ebp+esi-118],20 ;每4个字符用空格隔开
100028F8 46 inc esi
100028F9 43 inc ebx ;ebx++(ebx初始为0)
100028FA 83FB 04 cmp ebx,4 ;比较ebx是否小于4
100028FD ^ 7C BD jl short BSSuppor.100028BC ;小就往上跳,获得另一4位
注册码
100028FF C68435 E7FEFF>mov byte ptr ss:[ebp+esi-119],0
10002907 33F6 xor esi,esi
10002909 8D85 FAFEFFFF lea eax,dword ptr ss:[ebp-106]
1000290F 8A18 mov bl,byte ptr ds:[eax] ;下面这段代码是把上面4组
注册码反向
10002911 8D8C35 E8FEFF>lea ecx,dword ptr ss:[ebp+esi-118]
10002918 0FBE11 movsx edx,byte ptr ds:[ecx]
1000291B 8819 mov byte ptr ds:[ecx],bl
1000291D 46 inc esi
1000291E 8810 mov byte ptr ds:[eax],dl
10002920 48 dec eax
10002921 83FE 09 cmp esi,9
10002924 ^ 7C E9 jl short BSSuppor.1000290F ;这个变换后得到的就是
正确的注册码
///////////////////////////////////////////////////////////////跟进算法call
10002827 8B01 mov eax,dword ptr ds:[ecx]
10002829 69C0 FD430300 imul eax,eax,343FD ;eax*=0X343FD
1000282F 05 C39E2600 add eax,269EC3 ;eax+=0x269ec3
10002834 8901 mov dword ptr ds:[ecx],eax ;eax的值保存在ds:[ecx]地址中
10002836 C1F8 10 sar eax,10 ;eax>>=10
10002839 25 FF7F0000 and eax,7FFF ;eax^=0x7fff
1000283E 99 cdq ;edx符号扩展
1000283F 6A 0A push 0A
10002841 59 pop ecx ;ecx=0xa
10002842 F7F9 idiv ecx ;eax=eax/ecx,edx=eax%0xa
10002844 8BC2 mov eax,edx ;eax=edx
10002846 C3 retn
////////////////////////////////////////////////////////下面这里是输入的家假码与
真码比较的部分
1000297D 8B45 0C mov eax,dword ptr ss:[ebp+C] ;假码第1部分送eax
10002980 3B45 FC cmp eax,dword ptr ss:[ebp-4] ;与真码第1部分比较
10002983 8B5D 18 mov ebx,dword ptr ss:[ebp+18] ;假码第2部分送ebx
10002986 8B7D 14 mov edi,dword ptr ss:[ebp+14] ;假码第3部分送edi
10002989 8B55 10 mov edx,dword ptr ss:[ebp+10] ;假码第4部分送edx
1000298C 75 0F jnz short BSSuppor.1000299D ;不等就跳
1000298E 3B55 F8 cmp edx,dword ptr ss:[ebp-8] ;与真码第2部分比较
10002991 75 0A jnz short BSSuppor.1000299D
10002993 3B7D F4 cmp edi,dword ptr ss:[ebp-C] ;与真码第3部分比较
10002996 75 05 jnz short BSSuppor.1000299D
10002998 3B5D F0 cmp ebx,dword ptr ss:[ebp-10] ;与真码第4部分比较
1000299B 74 1A je short BSSuppor.100029B7 ;都相等就跳到结束(成功)
1000299D B9 D2040000 mov ecx,4D2 ;上面任一部分不同都会来到这里4d2=1234
100029A2 3BC1 cmp eax,ecx ;第一部分是不是为1234
100029A4 75 16 jnz short BSSuppor.100029BC
100029A6 B8 2E160000 mov eax,162E ;162e=5678
100029AB 3BD0 cmp edx,eax ;第4部分是否为5678
100029AD 75 0D jnz short BSSuppor.100029BC
100029AF 3BF9 cmp edi,ecx ;第3部分是不是为1234
100029B1 75 09 jnz short BSSuppor.100029BC
100029B3 3BD8 cmp ebx,eax ;第2部分是否为5678
100029B5 75 05 jnz short BSSuppor.100029BC;满足上面的4个比较也能成功注册
100029B7 33C0 xor eax,eax ;因此有一个万能码1234-5678-1234-5678
100029B9 40 inc eax
100029BA EB 02 jmp short BSSuppor.100029BE
100029BC 33C0 xor eax,eax |
一个简单的注册机:
void main(){
char regname[50],regcode[20];
long temp1=0,temp2=0;
printf("请输入Regname:");
gets(regname);
int stlen=strlen(regname);
if(stlen<16)
for(;stlen<16;stlen++)
regname[stlen]=0x40;
for(int i=0, t=0;i<4;i++, t=0){
if(i)regcode[19-5*i]=0x2d;
for(int j=0;j<16;j+=4,t++){
temp1*=0x343FD;
temp1+=0x269ec3;
temp2=temp1;
__asm{
mov eax,temp2
sar eax,010h
and eax,07FFFh
cdq
mov ecx,0ah
idiv ecx
mov temp2,edx
}
temp2=temp2+regname[j+i]-0xa;
temp2=temp2%0xa+0x30;
regcode[18-5*i-t]=temp2;
}
}
regcode[19]='\0';
printf("你的Regcode:%s\n",regcode);
} |
请输入Regname:ligyuan
你的Regcode:5153-4723-9940-1266
也可以用万能码:1234-5678-1234-5678
软件的注册保护没有过多的考虑,找到关键点后能够轻松的实现算法注册机,还留了万能码,差一点我就中了头奖。这样,我这个菜鸟也才有了练手的机会,由于代码中没有考虑到输入空格时的处理,因此有很多不足之处,还望不要笑话鄙人。
正如我们前言所说尽管Apache服务器应用最为广泛,设计上非常安全的程序。但是同其它应用程序一样,Apache也存在安全缺陷。毕竟它是完全源代码,Apache服务器的安全缺陷主要是使用HTTP协议进行的拒绝服务攻击(denial of service)、缓冲区溢出攻击以及被攻击者获得root权限三缺陷和最新的恶意的攻击者进行“拒绝服务”(DoS)攻击。合理的网络配置能够保护Apache服务器免遭多种攻击。我们来介绍一下主要的安全缺陷。
主要安全缺陷
(1)使用HTTP协议进行的拒绝服务攻击(denial of service)的安全缺陷
这种方法攻击者会通过某些手段使服务器拒绝对HTTP应答。这样会使Apache对系统资源(CPU时间和内存)需求的剧增,最终造成Apache系统变慢甚至完全瘫痪。
(2)缓冲区溢出的安全缺陷
该方法攻击者利用程序编写的一些缺陷,使程序偏离正常的流程。程序使用静态分配的内存保存请求数据,攻击者就可以发送一个超长请求使缓冲区溢出。
(3)被攻击者获得root权限的安全缺陷
该安全缺陷主要是因为Apache服务器一般以root权限运行(父进程),攻击者会通过它获得root权限,进而控制整个Apache系统。
(4)恶意的攻击者进行“拒绝服务”(DoS)攻击的安全缺陷
这个最新在6月17日发现的漏洞,它主要是存在于Apache的chunk encoding中,这是一个HTTP协议定义的用于接受web用户所提交数据的功能。 所有说使用最高和最新安全版本对于加强Apache Web服务器的安全是至关重要的。
正确维护和配置Apache服务器
虽然Apache服务器的开发者非常注重安全性,由于Apache服务器其庞大的项目, 难免会存在安全隐患。正确维护和配置Apache WEB服务器就很重要了。我们应注意的一些问题:
(1)Apache服务器配置文件
Apache Web服务器主要有三个配置文件,位于/usr/local/apache/conf目录下。 这三个文件是:
httpd.conf----->主配置文件
srm.conf------>填加资源文件
access.conf--->设置文件的访问权限 |
(2)Apache服务器的目录安全认证
在Apache Server中是允许使用 .htaccess做目录安全保护的,欲读取这保护的目录需要先键入正确用户帐号与密码。这样可做为专门管理网页存放的目录或做为会员区等。在保护的目录放置一个档案,档名为.htaccss。
AuthName "会员专区"
AuthType "Basic" |
AuthUserFile "/var/tmp/xxx.pw" ----->把password放在网站外 require valid-user 到apache/bin目录,建password档 % ./htpasswd -c /var/tmp/xxx.pw username1 ----->第一次建档要用参数"-c" % /htpasswd /var/tmp/xxx.pw username2 这样就可以保护目录内的内容,进入要用合法的用户。
注:采用了Apache内附的模组。
也可以采用在httpd.conf中加入:
options indexes followsymlinks
allowoverride authconfig
order allow,deny
allow from all |
(3)Apache服务器访问控制
我们就要看三个配置文件中的第三个文件了,即access.conf文件,它包含一些指令控制允许什么用户访问Apache目录。应该把deny from all设为初始化指令,再使用allow from指令打开访问权限。
order deny,allow
deny from all
allow from safechina.net |
设置允许来自某个域、IP地址或者IP段的访问。
(4)Apache服务器的密码保护问题
我们再使用.htaccess文件把某个目录的访问权限赋予某个用户。系统管理员需要在httpd.conf或者rm.conf文件中使用 AccessFileName指令打开目录的访问控制。如:
AuthName PrivateFiles
AuthType Basic
AuthUserFile /path/to/httpd/users
require Phoenix
# htpasswd -c /path/to/httpd/users Phoenix |
设置Apache服务器的WEB和文件服务器
我们在Apache服务器上存放WEB服务器的文件,供用户访问,并设置/home/ftp/pub目录为文件存放区域,用http://download.your.com/pub/来访问。在防火墙上设置apache反向代理技术,由防火墙代理访问。
(1)Apache服务器的设置
Apache服务器采用默认配置。主目录为/home/httpd/html,主机域名为Phoenix.your.com, 且别名到www.your.com中, 并且设置srm.conf加一行别名定义如下:
Alias /pub /home/ftp/pub/ |
更改默认应用程序类型定义如下:
DefaultType application/octet-stream |
最后在/etc/httpd/conf/access.conf中增加一项定义
Options Indexes
AllowOverride AuthConfig
order allow,deny
allow from all |
注:Options Indexes允许在找不到index.html文件的情况下允许列出目录/文件列表。AllowOverride AuthConfig允许做基本的用户名和口令验证。这样的话,需要在/home/ftp/pub目录下放入.htaccess,内容如下:
[root@ pub]# more .htaccess
AuthName Branch Office Public Software Download Area
AuthType Basic
AuthUserFile /etc/.usrpasswd
require valid-user |
用# htpasswd -c /etc/.usrpasswd user1 分别创建不同的允许访问/pub下文件服务的外部用户名和口令。
(2)在防火墙上配置反向代理技术.
在/etc/httpd/conf/httpd.conf 中加入 NameVirtualHost xxx.xxx.xxx.xxx # xxx.xxx.xxx.xxx ----->是防火墙外部在互联网上永久IP地址:
servername www.your.com
errorlog /var/log/httpd/error_log
transferlog /var/log/httpd/access_log
rewriteengine on
proxyrequests off
usecanonicalname off
rewriterule ^/(.*)$ http://xxx.xxx.xx.x/$1 Apache服务器的IP地址。
servername http://download.your.com/pub/
errorlog /var/log/httpd/download/error_log
transferlog /var/log/httpd/download/access_log
rewriteengine on
proxyrequests off
usecanonicalname off
rewriterule ^/(.*)$ http://xxx.xxx.xx.x/$1 同上Apache服务器的IP地址。 |
设置防火墙上的DNS,让download.your.com和www.your.com 都指向防火墙的外部网地址xxx.xxx.xxx.xxx。
用http://www.your.com访问主页,用http://download.your.com/pub/访问公共文件的下载区。
注:还需要在apache服务器主机上建立目录/var/log/httpd/download/,否则会出错。另外,也可以设置防火墙主机上的/home/httpd/html/index.html的属性为750来阻止访问,这是防外部用户能访问到防火墙上的Apache服务器的http://www.your.com中。
总结:Apache Server是一个非常优秀,非常棒的服务器,只要你正确配置和维护好Apache服务器,你就会感受到Apache Server 所带来的好处,同样希望你能够通过阅读本文达到理论和实践双丰收的目的。
验证你的Apache来源途径
不要以为在Google上能够搜索到合适的Apache版本。如果你需要下载最新版本的Apache,那么你最好通过一个权威的镜像站点来下载。然而,即使这样也可能有问题,事实上,曾经就有黑客入侵过apache.org官方网站。所以,采用类似PGP的工具来验证Apache的数字签名就显得尤为重要。
保持更新Apache的补丁程序
如果你安装了Apache,你就必须及时更新安全补丁。如果没有及时的更新,那你的系统很容易受到网络上那些高危病毒的攻击。幸好,有几个简便方法可以更新Apache的补丁。参考我们关于保持更新Apache补丁的文章了解更多关于Apache服务器公告列表、Linux包管理系统和RedHat操作系统更新服务的信息。
避免使用.htaccess文件(分布式配置文件)
很多情况下需要几个管理员和内容管理者共同管理Apache服务器。一个常用的共享管理办法就是使用.htaccess文件,这样可以很灵活地对管理员以外的用户提供不同的配置控制权限。然而,这些文件也使得在集中安全管理之外还有相当多的安全控制权限——这些文件允许安全专业人士以外的其他用户改变服务器的访问控制许可配置。那些对粒度访问控制根本不熟悉的用户修改的配置可能在无意中会危害到你的系统安全。所以,除非必须使用,否则我们应该尽可能地避免使用这种访问控制系统。
监视系统日志
Apache为管理员提供了很全面的日志管理工具来对服务器的活动进行事后分析。Apache提供了多种不同的记录日志,但是对安全专业人士最重要的是访问日志。这个灵活的工具还具有了相当多的自定义功能,你可以按照你的需要很方便地记录尽可能多或者少的日志,以保证有效的分析。至少,你应该记录那些失败的认证企图和系统产生的错误。使用像AWStats一样的免费工具可以很轻松地完成分析任务。但是必须明确的一点是:监视日志只是一种事后分析手段。你可以利用它回顾和判断对服务器的攻击(和攻击企图),但是希望及时查看日志来对紧急情况做出快速反应是不可能的。如果需要进行预判反应,你应该考虑使用入侵预防系统如信息安全杂志评选的2003年度最新兴技术奖得主:Lucid Security公司的ipAngel系统。
管理文件系统
我们已经讨论了使用(或不使用).htaccess文件对管理文件访问权限的重要性。禁止通过文件系统许可对Apache服务器进行非授权修改也是很重要的。特别值得一提的是,你应该保证只有根用户才能修改存储在“/usr/local/apache ”目录的文件(或者你选择的任何Apache服务器的根目录)。确保只有根用户才能修改日志文件也很关键,这样可以防止用户掩盖他们的操作。
Apache 服务器日常配置
1、如何设 置请求等待时间
在httpd.conf里面设置:
其中n为整数,单位是秒。
设置这个TimeOut适用于三种情况:
2、如何接收一个get请求的总时间
接收一个post和put请求的TCP包之间的时间
TCP包传输中的响应(ack)时间间隔
3、如何使得apache监听在特定的端口
修改httpd.conf里面关于Listen的选项,例如:
是使apache监听在8000端口
而如果要同时指定监听端口和监听地址,可以使用:
Listen 192.170.2.1:80
Listen 192.170.2.5:8000 |
这样就使得apache同时监听在192.170.2.1的80端口和192.170.2.5的8000端口。
当然也可以在httpd.conf里面设置:
这样来实现类似的效果。
4、如何设置apache的最大空闲进程数
修改httpd.conf,在里面设置:
其中n是一个整数。这样当空闲进程超过n的时候,apache主进程会杀掉多余的空闲进程而保持空闲进程在n,节省了系统资源。如果在一个apache非常繁忙的站点调节这个参数才是必要的,但是在任何时候把这个参数调到很大都不是一个好主意。
同时也可以设置:
来限制最少空闲进程数目来加快反应速度。
5、apache如何设置启动时的子服务进程个数
在httpd.conf里面设置:
这样启动apache后就有5个空闲子进程等待接受请求。
也可以参考MinSpareServers和MaxSpareServers设置。
6、如何在apache中设置每个连接的最大请求数
在httpd.conf里面设置:
这样就能保证在一个连接中,如果同时请求数达到100就不再响应这个连接的新请求,保证了系统资源不会被某个连接大量占用。但是在实际配置中要求尽量把这个数值调高来获得较高的系统性能。 |
7、如何在apache中设置session的持续时间
在apache1.2以上的版本中,可以在httpd.conf里面设置:
KeepAlive on
KeepAliveTimeout 15 |
这样就能限制每个session的保持时间是15秒。session的使用可以使得很多请求都可以通过同一个tcp连接来发送,节约了网络资源和系统资源。
8、如何使得apache对客户端进行域名验证
可以在httpd.conf里面设置:
HostnameLookups on off double |
如果是使用on,那么只有进行一次反查,如果用double,那么进行反查之后还要进行一次正向解析,只有两次的结果互相符合才行,而off就是不进行域名验证。
如果为了安全,建议使用double;为了加快访问速度,建议使用off。
9、如何使得apache只监听在特定的ip
修改httpd.conf,在里面使用
这样就能使得apache只监听外界对192.168.0.1的http请求。如果使用:
就表明apache监听所有网络接口上的http请求。
当然用防火墙也可以实现。
10、apache中如何限制http请求的消息主体的大小
在httpd.conf里面设置:
n是整数,单位是byte。cgi脚本一般把表单里面内容作为消息的主体提交给服务器处理,所以现在消息主体的大小在使用cgi的时候很有用。比如使用cgi来上传文件,如果有设置:
那么上传文件超过100k的时候就会报错。
11、如何修改apache的文档根目录
修改httpd.conf里面的DocumentRoot选项到指定的目录,比如:
这样http://localhost/index.html就是对应/www/htdocs/index.html
12、如何修改apache的最大连接数
在httpd.conf中设置:
n是整数,表示最大连接数,取值范围在1和256之间,如果要让apache支持更多的连接数,那么需要修改源码中的httpd.h文件,把定义的HARD_SERVER_LIMIT值改大然后再编译。
13、如何使每个用户有独立的cgi-bin目录
有两种可选择的方法:
(1)在Apache配置文件里面关于public_html的设置后面加入下面的属性:
ScriptAliasMatch ^/~([^/]*)/cgi-bin/(.*) /home/$1/cgi-bin/$2
(2)在Apache配置文件里面关于public_html的设置里面加入下面的属性:
<CENTER><ccid_nobr>
<table width="400" border="1" cellspacing="0" cellpadding="2"
bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center">
<tr>
<td bgcolor="e6e6e6" class="code" style="font-size:9pt">
<pre><ccid_code>
Options ExecCGI
SetHandler cgi-script |
14、如何调整Apache的最大进程数
Apache允许为请求开的最大进程数是256,MaxClients的限制是256.如果用户多了,用户就只能看到Waiting for reply....然后等到下一个可用进程的出现。这个最大数,是Apache的程序决定的--它的NT版可以有1024,但Unix版只有256,你可以在src/include/httpd.h中看到:
#ifndef HARD_SERVER_LIMIT
#ifdef WIN32
#define HARD_SERVER_LIMIT 1024
#else
#define HARD_SERVER_LIMIT 256
#endif
#endif |
你可以把它调到1024,然后再编译你的系统。
15、如何屏蔽来自某个Internet地址的用户访问Apache服务器
可以使用deny和allow来限制访问,比如要禁止202.202.202.xx网络的用户访问:
order deny,allow
deny from 202.202.202.0/24 |
16、如何在日志里面记录apache浏览器和引用信息
你需要把mod_log_config编译到你的Apache服务器中,然后使用下面类似的配置:
CustomLog logs/access_log "%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i""
17、如何修改Apache返回的头部信息
问题分析:当客户端连接到Apache服务器的时候,Apache一般会返回服务器版本、非缺省模块等信息,例如:
Server: Apache/1.3.26 (Unix) mod_perl/1.26 |
解决:
你可以在Apache的配置文件里面作如下设置让它返回的关于服务器的信息减少到最少:
注意:
这样设置以后Apache还会返回一定的服务器信息,比如:
但是这个不会对服务器安全产生太多的影响,因为很多扫描软件是扫描的时候是不顾你服务器返回的头部信息的。你如果想把服务器返回的相关信息变成:
Server: It iS a nOnE-aPaCHe Server |
那么你就要去修改源码了。