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) 编辑 收藏 举报