FinalTest 基于web的登录口令修改设计

本次任务主要实现登录口令的修改,当用户修改了登录名和登陆密码以后,下一次登录将会使用新的登录名和登录密码。

FT.1 页面设计

登录的页面主要使用了原来的pass.htm文件,主要是因为我自己做了一个相差不大的界面,如下图所示,但是没有加入“#”这个标志,使得底层代码获取不到表单里的内容。对比了一下原来的界面,并没有增加更多的新功能,所以将专注点就放在了功能的实现上。

 

最终的登录界面如下图,

 

 

在第11课网络服务的基础上,添加框架,将4-Menu&frame文件夹里的内容复制到/work/uClinux-dist/user/cgi_generic里,此时如果编译以后下载到开发板以后只能打开lan页面,我们要打开的是pass页面,所以按照lan页面来修改,

首先,打开template.c文件,新增两个函数passWebPageInput()和passWebPageOutput()函数,还有一个头文件,程序代码如下:

#include<crypt.h>

#define PATH "/etc/passwd"

static char oldname[256];

static char oldpassword[256];

static char newname[256];

static char newpassword[256];

static char newpassword2[256];

void passWebPageInput(char **postvars,int form_method)

{

       int ret;

       int   i;

       char *intf_oldname = (char *)NULL;

       char *intf_oldpassword = (char *)NULL;

       char *intf_newname = (char *)NULL;

       char *intf_newpassword = (char *)NULL;

       char *intf_newpassword2 = (char *)NULL;

 

       TagConvert intfSelectedTag[] =

       {

              { "text", "oldname", CTYPE_STRING, &intf_oldname },

              { "password", "oldpassword", CTYPE_STRING, &intf_oldpassword },

              { "text", "newname", CTYPE_STRING, &intf_newname },

              { "password", "newpassword", CTYPE_STRING, &intf_newpassword },

              { "password", "newpassword2", CTYPE_STRING, &intf_newpassword2 },

             

       };

       int intfTagNum = sizeof(intfSelectedTag)/sizeof(intfSelectedTag[0]);   

 

       for( i=0; i<intfTagNum; i++ )

       {

              ret = cgi_itemval_get(&intfSelectedTag[i]);

              if( ret != 0 )

              {

                     return;

              }

       }

 

       strcpy( oldname, intf_oldname );

       strcpy( oldpassword, intf_oldpassword );

       strcpy( newname, intf_newname );

       strcpy( newpassword, intf_newpassword );

       strcpy( newpassword2, intf_newpassword2 );

 

}

void passWebPageOutput(char **postvars,int form_method)

{

       char *key="ab";

       char user[128]="user ";

       char passwd[128]="passwd ";

       char *name1;

       char *passwd1;

       char str_oldname[40]="", str_oldpassword[40]="" ,str_newname[40]="", str_newpassword[40]="",str_newpassword2[40]="";

       char       *argv[]={str_oldname,str_oldpassword,str_newname,str_newpassword,str_newpassword2};

       int   itemNum=5;

 

       FILE *f;

       f=fopen(PATH,"w");

       fclose(f);

       f=fopen(PATH,"a++");

       fflush(stdout);

       name1=crypt(newname,key);

       strcat(user,name1);

       fputs(user,f);

       fputs("\n",f)

       fflush(stdout);

       passwd1=crypt(newpassword2,key);

       strcat(passwd,passwd1);

       fputs(passwd,f);

       fputs("\n",f);

       fclose(f);

       if( oldname[0] )

              sprintf( str_oldname, "%s", oldname );

       if( oldpassword[0] )

              sprintf( str_oldpassword, "%s", oldpassword );

       if( newname[0] )

              sprintf( str_newname, "%s", newname );

       if( newpassword[0] )

              sprintf( str_newpassword, "%s", newpassword );

       if( newpassword2[0] )

              sprintf(str_newpassword2, "%s", newpassword2 );

       output_html( "passwd.htm", itemNum, argv);

}

在函数passWebPageInput()里可以获得页面表单上的输入数据,包括:旧用户名,旧密码,新用户名,新密码和确认新密码五个数据。

在函数passWebPageOutput()里将获得的数据写入/etc/passwd文件里,这样可以使关闭浏览器以后,可以使用新用户名和密码登录。

 

 

FT.2 用户名和密码保存

在FT.1里实现了修改密码和用户名的功能,但是,在开机重启以后,用户名和密码又恢复到了admin,也就是说,修改以后的密码和用户名并没有保存下来。所以,接下来就实现保存功能。

具体思路:

能够实现保存的在第六课MTD的内容里有介绍,使用mtdblock0来保存用户名和密码,将mtdblock0挂载到/mnt目录下,将修改好的用户名和密码复制到/mnt里,开机的时候,程序通过将/mnt里的内容复制到/etc下,覆盖passwd的内容,此时再登录192.168.0.1,用原来的密码登录就不行了,只能用新的用户名和密码登录。

实现步骤:

修改文件/work/uClinux-dist/vendors/Marvell/Firefox/rc,在尾行加入:

mount -t ext2 /dev/mtdblock0 /mnt

cp /mnt/passwd /etc

如图:

 

修改/work/uClinux-dist/user/cgi_generic/ template.c文件,带代码中实现文件的复制操作:

 编译,下载进入开发板,登录192.168.0.1,输入初始登录密码和用户名:admin,然后进入修改登录口令,将用户名改为admin1,登录密码改为123,如下图:

点击保存,关闭浏览器,然后查看etc/passwd和mnt/passwd里的内容是否被修改了,可以看到已经改为了新的用户名和密码了。

 

在命令行使用umount解挂,命令:umount /mnt,此时,保留在/mnt里的数据就会被保留下来,重启也不会丢失。

接下来重启开发板,再一次的查看/etc/passwd的内容是不是改过之后的密码用户名。

 

经过对比发现,的确保留了修改后的密码,

再重新登录浏览器,使用旧密码登录已经不行了,必须使用新密码

 

FT.3 总结

本次实验并不是完美的,因为还有一个比较难以解决的问题,就是没法在程序中umount,只能在外部命令行输入umount,在程序中试验了无数次umount,并没有正确解挂,因此,不得不采取在命令行输入的模式,所以今后需要在加强这方面的学习,让这个程序能够自动的执行,而不是还要手动输入命令。最后,本学期的课就到此为止了,感谢老师的教导和陪伴,祝您生活愉快,阖家幸福。

posted on 2018-10-23 15:40  Liu_Farrell  阅读(446)  评论(0编辑  收藏  举报

导航