精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>电脑技术>>● FreeBSD>>有待整理的文章-新加的文章都在这里>>通过 web 界面修改系统邮件用户密码 (cgi)

主题:通过 web 界面修改系统邮件用户密码 (cgi)
发信人: cinc(Commander)
整理人: hackerbay(2002-09-06 16:48:52), 站内信件
以前写的通过 web 修改系统邮件用户(/etc/master.passwd) 的一个 cgi 程序:
如果你使用系统用户作为邮件用户,应该用的着。:)

apache owner: nobody.nogroup

Installation 
-----------------------------------------------------------------------------
login as root
修改 Showform() 函数中的 单位名称和域名
#cc -lcrypt -o chgpwd chgpwd.c
#cp chgpwd /path/to/cgi-bin/
#cd /path/to/cgi-bin/
#chown root.nogroup chgpwd (所有者和权限的设置有些忘记了,好像是这样的)
#chmod 4550 chgpwd
#ls -l chgpwd
-r-sr-x---   1 root  nogroup  7408 Aug 14 22:50 chgpwd
# 浏览 http://mail.mydomain.com/cgi-bin/chgpwd 测试
-----------------------------------------------------------------------------

chgpwd.c
-----------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pwd.h>

void Showform();
char* GetParameter(char* name , char* querystring);

int main(){
struct passwd * account;
char* querystring;
char* username;
char* oldpwd;
char* newpwd1;
char* newpwd2;
char command[100];
int length;
char * ptr;

printf ("Content-type:text/html\n\n");

ptr = getenv("CONTENT_LENGTH");

if (!ptr ){
 Showform(); 
}else{ // Perform Input
 length = atoi(ptr);
 querystring = (char*) malloc (length+1);
 fread (querystring , sizeof(char),length,stdin);
 // Parse Parameter
 username = GetParameter("username" ,querystring);
 oldpwd   = GetParameter("oldpwd"   ,querystring);
 newpwd1  = GetParameter("newpwd1"  ,querystring);
 newpwd2  = GetParameter("newpwd2"  ,querystring);
 if (strcmp(username,"root")==0){
  Showform(4);
  exit(4);
 }
//  printf ("%s:%s:%s:%s",username,oldpwd,newpwd1,newpwd2);
 // Check Validity
 setuid(0);
 // Check username , password
 while (account=getpwent()){
  // Find this User
  if (strcmp(username,account->pw_name)==0){
   // Found
//    printf ("%s",crypt(oldpwd,account->pw_passwd));
   // Username Password can't login
   if (strcmp(account->pw_passwd,crypt(oldpwd,account->pw_passwd))!=0){
    Showform (1);
    exit(1);
   }
   // Two New Password Not Match
   if (strcmp(newpwd1,newpwd2) !=0){
    Showform (2);
    exit(2);
   }
   // New Password too Short
   if (strlen(newpwd1) < 4 ){
Showform (3);
exit(3);
}
// Start Modify
strcpy (command , "chpass -p '");
strcat (command , crypt(newpwd1,account->pw_passwd));
   strcat (command , "' ");
   strcat (command , username);
//    printf ("Command:%s",command);
   system (command);
   Showform(0);
  }
 }
}
return 0;
}
void Showform(int errorcode){
printf ("<Html>
         <Title>Change Password</Title>
         <Body>
          修改邮箱密码:某某单位\n
          <form Method=post>\n
           用户帐号:<Input type=text name=username>@mydomain.com<p>\n
           旧的密码:<Input type=password name=oldpwd><p>\n
           新的密码:<Input type=password name=newpwd1><p>\n
           再次输入:<Input type=password name=newpwd2><p>\n
           <Input type=submit name=submit value=确认><p>\n
          </form>\n");
switch (errorcode){
 case 0 : printf ("修改成功") ; break;
 case 1 : printf ("用户名和旧密码无法登录"); break;
 case 2 : printf ("新密码两次输入不符"); break;
 case 3 : printf ("密码长度必须大于3"); break;
 case 4 : printf ("不能修改root的密码"); break;
}
printf ("</Body></Html>");
}
char* GetParameter(char* name , char* querystring){
char string[200];
char* start,end;
char* parameter;
int i=0;

parameter = (char*)malloc(20);
strcpy (string , querystring);
strcat (string,"&");
start = strstr (querystring,name);
start += strlen(name)+1;
while ((*start) != '&'){
 parameter [i++]=*start;
 start++;
}
parameter[i]='\0';
return parameter;
}

----------------------------------------------------------------------------- 





----
前途是光明的
道路是曲折的  
      

[关闭][返回]