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,并没有正确解挂,因此,不得不采取在命令行输入的模式,所以今后需要在加强这方面的学习,让这个程序能够自动的执行,而不是还要手动输入命令。最后,本学期的课就到此为止了,感谢老师的教导和陪伴,祝您生活愉快,阖家幸福。

转载于:https://www.cnblogs.com/LiuFarrell/p/9836998.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352419.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python脚本编程100例_python100例,python经典例题

肯定有用&#xff0c;练习就是实战。对于刚学习编程的同学&#xff0c;我觉得跟着例子学习&#xff0c;会有很大的进步。至少让你熟悉语法和理解编程的一些技巧。当你能熟练掌握python编程的方法后&#xff0c;你需要学习一些第三方库&#xff0c;python的第三方库很强大。具体…

windows Server 2003 尝试安装.NET Framework 4 失败

在windows Server 2003 尝试安装.NET Framework 4 失败 提示出“产生阻滞问题”&#xff0c;这个是系统没有安装WIC产生的。 到https://www.microsoft.com/zh-cn/download/details.aspx?id17718 下载WIC后进行安装&#xff0c;安装WIC后能正常安装.NET Framework 4。

java 在线编辑器_最好的Markdown开源在线编辑器,没有之一!

点击上方蓝色字体&#xff0c;选择“设为星标”回复”666“获取面试宝典Editor.md 是一款开源的、可嵌入的 Markdown 在线编辑器(组件)&#xff0c;基于 CodeMirror、jQuery 和 Marked 构建。主要特性支持“标准” Markdown / CommonMark 和 Github 风格的语法&#xff0c;也可…

log4j 多线程死锁问题_Log4j线程死锁–案例研究

log4j 多线程死锁问题此案例研究描述了影响Weblogic Portal 10.0生产环境的Apache Log4j线程争用问题的完整根本原因分析和解决方案。 它还将展示在开发和支持Java EE应用程序时适当的Java类加载器知识的重要性。 本文也是您提高线程转储分析技能和了解线程竞争条件的另一个机会…

谜题6:多重转型

转型被用来将一个数值从一种类型转换到另一种类型。下面的程序连续使用了三个转型。那么它到底会打印出什么呢&#xff1f; public class Multicast{public static void main (String[] args){ System.out.println((int)(char)(byte) -1); } } 无论你怎样分析这个程序&#xf…

nginx 简介篇

Nginx(发音为“engine x”)是一款由俄罗斯软件工程师Igor Sysoev写的开源的web服务器。自从2004年发布以来nginx一直关注于高性能、高并发、低内存的使用,另外还有一些特色的Web服务器功能&#xff0c;如负载均衡、缓存、访问和带宽控制以及能够有效的与各种应用集成这些特点使…

MySQl Got a packet bigger than ' max_allowed_packet' bytes

在my.ini中最后增加一行max_allowed_packet16M即可&#xff08;根据实际情况设置&#xff09;。

防止缓存爆炸的快速提示

在很多情况下&#xff0c;您都可以从应用程序中的常用对象缓存中受益&#xff0c;特别是在面向Web和微服务的环境中。 您可以在Java中执行的最简单的缓存类型可能是引入一个私有HashMap&#xff0c;在计算对象之前先对其进行查询&#xff0c;以确保您不会重复执行此操作。 这是…

设置过mysql远程连接后仍然无法进行远程连接 (mysql mysql报错2003 can't connect)

1、在控制面板上-〉系统和安全-》 window是防火墙-》打开或关闭Windows防火墙-》关闭Windows防火墙&#xff08;不推荐),这样mysql就可以进行远程连接但是有一个问题就是不安全。所以采取以下的方法。 2、 解决方法: (1.控制面板 打开防火墙,在进入规则中新建一个规则. (2. 选…

go 二进制程序守护_图解 Go 程序是怎样跑起来的

Go语言中文网&#xff0c;致力于每日分享编码、开源等知识&#xff0c;欢迎关注我&#xff0c;会有意想不到的收获&#xff01;刚开始写这篇文章的时候&#xff0c;目标非常大&#xff0c;想要探索 Go 程序的一生&#xff1a;编码、编译、汇编、链接、运行、退出。它的每一步具…

nginx 配置从零开始

作为一个 nginx 的初学者记录一下从零起步的点滴。 基本概念 Nginx 最常的用途是提供反向代理服务&#xff0c;那么什么反向代理呢&#xff1f;正向代理相信很多大陆同胞都在这片神奇的土地上用过了&#xff0c;原理大致如下图&#xff1a; 代理服务器作为客户端这边的中介接…

[MySQL]经常无故崩溃amd.dll , boot1.exe病毒

近段时间有大量客户反馈&#xff0c;mysql经常无故崩溃或者是在C盘根目录出现 amd.dll , boot1.exe文件此病毒为mysql数据库的漏洞所导致&#xff0c;目前所有版本均有此问题目前已经有大量的客户出现这个问题请收到此消息后立刻检查自己的C盘目录&#xff0c;是否有amd.dll , …

Spring启动和缓存抽象

缓存是大多数应用程序的主要组成部分&#xff0c;只要我们设法避免磁盘访问&#xff0c;缓存就会保持强劲。 Spring对各种配置的缓存提供了强大的支持 。 您可以根据需要简单地开始&#xff0c;然后进行更多可定制的操作。 这将是spring提供的最简单的缓存形式的示例。 Sprin…

关于python的if条件语句,whilefor循环等的简单说。

if 条件1:# 语句体# elif 条件2:# 语句体# elif 条件3:# 语句体# else:# 语句体 #从键盘输入一个值# num 8# num1 int(input("请输入一个整数&#xff1a;"))if num1 num: print("您猜对了")elif num1 < num:print("您猜小了")else:print(…

haproxy配置代理tomcat和nginx_你真的掌握LVS、Nginx及HAProxy工作原理吗?

当前大多数的互联网系统都使用了服务器集群技术&#xff0c;集群是将相同服务部署在多台服务器上构成一个集群整体对外提供服务。图片来自 Unsplash这些集群可以是 Web 应用服务器集群&#xff0c;也可以是数据库服务器集群&#xff0c;还可以是分布式缓存服务器集群等等。在实…

PostgreSQL新手入门

自从MySQL被Oracle收购以后&#xff0c;PostgreSQL逐渐成为开源关系型数据库的首选。 本文介绍PostgreSQL的安装和基本用法&#xff0c;供初次使用者上手。以下内容基于Debian操作系统&#xff0c;其他操作系统实在没有精力兼顾&#xff0c;但是大部分内容应该普遍适用。 一、安…

使用Junit和Easytest进行数据驱动的测试

在本文中&#xff0c;我们将看到如何使用Junit进行数据驱动的测试。 为此&#xff0c;我将使用一个名为EasyTest的库。 众所周知&#xff0c;对于TestNG&#xff0c;它已内置了数据提供程序。 通过简单的测试&#xff0c;我们可以使用Junit进行数据驱动的测试。 什么是数据驱…

Matlab代码的耗时分析、优化、加速

Profile(分析&#xff09; 在加速你的matlab程序之前&#xff0c;你需要知道你的代码哪一部分运行最慢。matlab提供个简单的机制&#xff0c;让你能够知道你 的代码的某一部分运行所占用CPU时间。通过在代码段开始添加tic&#xff0c;及在结束添加toc&#xff1b;matlab就能计算…

python整数逆序输出_利用Python实现倒序任意整数

这是很早以前学习C时候做过的一个练习题&#xff0c;题目的要求大概是把用户输入的三位数倒序输出&#xff0c;比如说用户输入123&#xff0c;然后程序应该输出的结果是321。如果遇到用户输入100&#xff0c;那么程序应该输出1。然后我给扩展一下&#xff0c;这个程序来适应于三…

谜题61:日期游戏

下面的程序演练了Date和Calendar类的某些基本特性&#xff0c;它会打印出什么呢&#xff1f; import java.util.*;public class DatingGame {public static void main(String[ ] args) { Calendar cal Calendar.getInstance(); cal.set(1999, 12, 31); // Year, Month, Day Sy…