科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航



ZDNet>网络频道>ZD评测>系统安全之关于Alarm Master破解的分析

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

我这个菜鸟也才有了练手的机会,由于代码中没有考虑到输入空格时的处理,因此有很多不足之处

来源:赛迪网安全社区 2007年10月17日

关键字:Master alarm 系统安全

分析过程

试验码:

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里面设置:

TimeOut n

其中n为整数,单位是秒。

设置这个TimeOut适用于三种情况:

2、如何接收一个get请求的总时间

接收一个post和put请求的TCP包之间的时间

TCP包传输中的响应(ack)时间间隔

3、如何使得apache监听在特定的端口

修改httpd.conf里面关于Listen的选项,例如:

Listen 8000

是使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里面设置:

Port 80

这样来实现类似的效果。

4、如何设置apache的最大空闲进程数

修改httpd.conf,在里面设置:

MaxSpareServers n

其中n是一个整数。这样当空闲进程超过n的时候,apache主进程会杀掉多余的空闲进程而保持空闲进程在n,节省了系统资源。如果在一个apache非常繁忙的站点调节这个参数才是必要的,但是在任何时候把这个参数调到很大都不是一个好主意。

同时也可以设置:

MinSpareServers n

来限制最少空闲进程数目来加快反应速度。

5、apache如何设置启动时的子服务进程个数

在httpd.conf里面设置:

StartServers 5

这样启动apache后就有5个空闲子进程等待接受请求。

也可以参考MinSpareServers和MaxSpareServers设置。

6、如何在apache中设置每个连接的最大请求数

在httpd.conf里面设置:

MaxKeepAliveRequests 100

这样就能保证在一个连接中,如果同时请求数达到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,在里面使用

BindAddress 192.168.0.1

这样就能使得apache只监听外界对192.168.0.1的http请求。如果使用:

BindAddress *

就表明apache监听所有网络接口上的http请求。

当然用防火墙也可以实现。

10、apache中如何限制http请求的消息主体的大小

在httpd.conf里面设置:

LimitRequestBody n

n是整数,单位是byte。cgi脚本一般把表单里面内容作为消息的主体提交给服务器处理,所以现在消息主体的大小在使用cgi的时候很有用。比如使用cgi来上传文件,如果有设置:

LimitRequestBody 102400

那么上传文件超过100k的时候就会报错。

11、如何修改apache的文档根目录

修改httpd.conf里面的DocumentRoot选项到指定的目录,比如:

DocumentRoot /www/htdocs

这样http://localhost/index.html就是对应/www/htdocs/index.html

12、如何修改apache的最大连接数

在httpd.conf中设置:

MaxClients n

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的配置文件里面作如下设置让它返回的关于服务器的信息减少到最少:

ServerTokens Prod

注意:

这样设置以后Apache还会返回一定的服务器信息,比如:

Server: Apache

但是这个不会对服务器安全产生太多的影响,因为很多扫描软件是扫描的时候是不顾你服务器返回的头部信息的。你如果想把服务器返回的相关信息变成:

Server: It iS a nOnE-aPaCHe Server

那么你就要去修改源码了。

推广二维码
邮件订阅

如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

重磅专题