1. 程式人生 > 實用技巧 >永恆之黑(CVE-2020-0796)漏洞復現

永恆之黑(CVE-2020-0796)漏洞復現

宿舍管理是高校管理的重要組成部分,一套優秀的管理系統不僅可以降低宿舍管理的難度,也能在一定程度上減少學校管理費用的支出,能是建設現代化高校管理體系的重要標誌。

本篇文章將帶你從執行環境搭建、系統設計、系統編碼到整個系統的實現,對整個過程進行詳細描述,特別適合作為程式設計師的進階專案案列,同樣也是高校學生畢業設計系統實現的不二之選!

演示地址:宿舍管理系統演示地址,點我檢視

1、系統架構模式

本宿舍管理系統採用B/S架構模式。

B/S架構的全稱為Browser/Server,即瀏覽器/伺服器結構。Browser指的是Web瀏覽器,與C/S架構相比,B/S模式極少數事務邏輯在前端實現,它的主要事務邏輯在伺服器端實現。B/S架構的系統無須特別安裝,只有Web瀏覽器即可。

B/S架構的分層:

與C/S架構只有兩層不同的是,B/S架構有三層,分別為:

  • 第一層表現層:主要完成使用者和後臺的互動及最終查詢結果的輸出功能。
  • 第二層邏輯層:主要是利用伺服器完成客戶端的應用邏輯功能。
  • 第三層資料層:主要是進行資料持久化儲存。

2、技術選型

選擇合適的技術,整個專案就已經成功了一半,經過對系統需求和系統自身特點的分析,加上現代B/S模式主流架構解決方案,對本系統技術選型如下:

資料表現層: Html+JavaScript+CSS+VUE

業務邏輯層 Java+Spring+SpringMVC

資料持久層: MySql+MyBatis

開發工具: Eclipse

3、使用者分析

本系統主要應用於高校宿舍管理,使用人群如下:

  • 系統管理員:管理整個系統的安全執行,各個功能使用。
  • 宿舍管理員:管理自己負責的宿管和學生
  • 學生:檢視瀏覽資訊,提交任務

4、功能分析

系統管理員:

  1. 新增、修改、刪除公告資訊
  2. 新增、修改、刪除宿舍管理員資訊
  3. 新增、修改、刪除學生資訊
  4. 宿舍樓管理及其宿舍管理員分配
  5. 學生寢室管理
  6. 釋出考勤、打卡任務
  7. 檢視、修改個人資訊


宿舍管理員:

  1. 檢視公告
  2. 檢視、刪除自己管理的學生
  3. 新增、修改、刪除考勤記錄
  4. 檢視學生打卡記錄
  5. 檢視、修改個人資訊


學生:

  1. 檢視公告
  2. 檢視考勤記錄
  3. 完成打卡任務,檢視打卡記錄
  4. 檢視、修改個人資訊

5、資料庫設計

分析系統需求,資料庫應有以下幾張表:

t_admin:

主要用於儲存系統管理員資料

欄位名稱 型別 是否主鍵 說明
adminId int 管理員Id,唯一
userName varchar 使用者名稱
password varchar 密碼
name varchar 真實名稱
sex varchar 性別
sex varchar 電話

t_dormbuild: 儲存宿舍樓資訊

欄位名稱 型別 是否主鍵 說明
dormBuildId int 宿舍樓Id,唯一
dormBuildName varchar 宿舍樓名稱
dormBuildDetail varchar 描述

t_dormmanager: 主要儲存宿舍管理員資訊

欄位名稱 型別 是否主鍵 說明
dormManId varchar 宿舍管理員Id,唯一
userName varchar 使用者名稱,用於登入系統
password varchar 密碼
dormBuildId int 宿舍樓Id
dormBuildDetail varchar 描述
name varchar 真實姓名
sex varchar 性別
tel varchar 電話

t_notice: 用於儲存公告資訊

欄位名稱 型別 是否主鍵 說明
noticeId int 公告Id,唯一
noticePerson varchar 公告發布人
date date 公告發布日期
content varchar 釋出內容

t_punchclock: 用於儲存打卡釋出記錄

欄位名稱 型別 是否主鍵 說明
id int Id,唯一
theme varchar 打卡主題
detail varchar 打卡說明
date varchar 釋出日期
person varchar 釋出人

t_punchclockrecord: 用於儲存打卡資訊

欄位名稱 型別 是否主鍵 說明
id int 記錄Id,唯一
punchClock_id varchar 打卡Id
punchClock_date date 釋出日期
punchClock_theme varchar 打卡主題
punchClock_detail varchar 打卡說明
punchClock_person varchar 釋出人
name varchar 學生姓名
dormName varchar 寢室號
tel varchar 學生電話
stuNum varchar 學生學號
dormBuildId int 宿舍樓
isRecord tinyint 是否已經打卡

t_record: 用於儲存考勤記錄

欄位名稱 型別 是否主鍵 說明
recordId int 考勤Id,唯一
studentNumber varchar 學生學號
dormBuildId int 宿舍樓
dormName varchar 寢室號
date varchar 考勤日期
detail varchar 詳細說明

t_student: 學生表,用於存放學生資訊

欄位名稱 型別 是否主鍵 說明
studentId int 學生Id,唯一
stuNum varchar 學號
password varchar 密碼
name varchar 姓名
dormBuildId int 宿舍樓
dormName varchar 寢室號
sex varchar 性別
tel varchar 電話

6、執行環境搭建

前面已經提到,本系統使用SSM框架,搭建過程較為繁瑣,因此將此部分獨立出來,作為一個專題,具體搭建過程請參考《手把手教你搭建SSM框架(Eclipse版)》 這篇文章。搭建過程若出現其他問題,可以在公眾號【C you again】 後臺私信。

7、專案工程結構

根據第六步搭建完系統執行環境後,工程結構目錄如下圖所示


對工程結構各個目錄的解釋:

com.cya.controller

controller包用於存放接收請求的類,充當前後端資料互動的“橋樑”

com.cya.service

service包是所有業務邏輯的介面

com.cya.service.impl

service.impl包用於存放service介面的所有實現類

com.cya.mapper

mapper包用於存放對資料庫操縱的介面和對應的xml實現

com.cya.entity

entity包用於存放專案中用到的所有實體類,它與資料庫中的表相對應

resources檔案下存放SSM框架整合的必要配置檔案,詳情請看《手把手教你搭建SSM框架(Eclipse版)》

dorm是存放所有model層檔案的父級資料夾,其中admin,dormManager、student三個子資料夾存放系統管理員、宿舍管理員、學生三個角色對應的HTML檔案。

8、功能實現及展示

由於系統包含功能眾多,在此無法一一列舉,所以挑選幾個代表做展示,如需獲取完整原始碼請在公眾號【C you again】回覆“宿舍管理系統”。

8.1 登入功能實現

專案啟動成功後,在瀏覽器位址列輸入:http://localhost:8080/dormManage/ 進入使用者登入介面如下圖所示:

在此介面使用者可以選擇不同的角色登入,輸入每個角色對應的登入資訊後,首先會判斷輸入資訊的有效性,做出相應的響應或提示。登入功能具體的實現程式碼如下,此處僅展示controller層程式碼,如下:

package com.cya.controller;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.management.relation.Role;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.tomcat.util.digester.ArrayStack;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.cya.entity.Login;
import com.cya.entity.Result;
import com.cya.service.ILoginService;
import com.cya.service.impl.LoginServiceImpl;

@Controller
@ResponseBody
public class LoginController {
	
	@Autowired
	private ILoginService loginServiceImpl;
	
	@RequestMapping("login")
	public List login(HttpServletRequest request, @RequestBody Login login) {
		List list=loginServiceImpl.login(login);
		if(list.size()==1) {
			HttpSession session=request.getSession();
			session.setAttribute(login.getRole(), list);
			System.out.println("session="+session.getAttribute(login.getRole()));
		}
		return list;
	}
	
	@RequestMapping("getSession")
	public List getSession(HttpServletRequest request,@RequestBody Login login){
		System.out.println(login);
		System.out.println(request.getSession().getAttribute(login.getRole()));
		List list=new ArrayList<>();
		list.add(request.getSession().getAttribute(login.getRole()));
		return list;
	}
	
	@RequestMapping("exitSys")
	public Result exitSys(HttpServletRequest request) {
		String exit="";
		try {
			if(request.getParameter("exit")!=null) {
				exit=request.getParameter("exit");
			}
			request.getSession().removeAttribute(exit);
			return new Result(true, "登出成功");
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			return new Result(false, "登出失敗");
		}
	}
}

8.2 釋出公告功能實現

在系統管理員端,有釋出公告的許可權,系統管理員點選新增公告按鈕,輸入相關資訊後進行有效性校驗,校驗成功及代表公告發布成功。


成功釋出公告後,會出現在宿舍管理員端和學生端介面,效果圖如下:


公告模組主要程式碼以mapper層實現為例:

 <!-- ******************** 公告 ******************* -->
 
  <select id="getNoticeManage" resultType="com.cya.entity.Notice">
    select * from t_notice
    <where>
      <if test="filter=='date' and key !='' ">
        date like concat("%",#{key},"%")
      </if>
    </where>
  </select>
  
   <insert id="addNoticeManage" parameterType="com.cya.entity.Notice">
    insert into t_notice(noticePerson,date,content) values(#{noticePerson},current_date,#{content})
  </insert>
  
  <select id="getNoticeMangerById" parameterType="Integer" resultType="com.cya.entity.Notice">
     select * from t_notice where noticeId=#{noticeId}
  </select>
  
  <update id="updataNoticeManageById" parameterType="com.cya.entity.Notice">
    update t_notice set noticePerson=#{noticePerson},content=#{content} where noticeId=#{noticeId}
  </update>
  
  <delete id="noticeManagerDeleteById" parameterType="Integer">
  
     delete from t_notice where noticeId=#{noticeId}
  </delete>
 
 <!-- ******************** 公告 ******************* -->

8.3 考勤記錄功能實現

宿舍管理員根據自己所管理樓,對住在管理範圍內的學生進行考勤,並新增考勤記錄,學生端也會顯示考勤資訊。


主要實現程式碼如下:

@RequestMapping("/getRecordMsg")
	public PageResult getRecordMsg(HttpServletRequest request){
		Integer pageNum=1;
		Integer pageSize=20;
		Integer dormBuildId=0;
		String filter=request.getParameter("filter");
		String key=request.getParameter("key");
		if(request.getParameter("pageNum")!=null && request.getParameter("pageNum")!="") {
			pageNum=Integer.parseInt(request.getParameter("pageNum"));
		}
		if(request.getParameter("pageSize")!=null && request.getParameter("pageSize")!="") {
			pageSize=Integer.parseInt(request.getParameter("pageSize"));
		}
		if(request.getParameter("dormBuildId")!=null && request.getParameter("dormBuildId")!="") {
			dormBuildId=Integer.parseInt(request.getParameter("dormBuildId"));
		}
		System.out.println("pageNum="+pageNum);
		System.out.println("pageSize="+pageSize);
		return dormManageServiceImpl.getRecordMsg(pageNum, pageSize, filter, key, dormBuildId);
	}
	
	@RequestMapping("getRecordById")
	public Record getRecordById(Integer recordId) {
		return dormManageServiceImpl.getRecordById(recordId);
	}
	
	
	@RequestMapping("updataRecordMsg")
	public Result updataRecordMsg(@RequestBody Record record) {
		try {
			dormManageServiceImpl.updataRecordMsg(record);
			return new Result(true, "更新成功");
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			return new Result(false, "更新失敗");
		}
	}
	
	@RequestMapping("addRecordMsg")
	public Result addRecordMsg(@RequestBody Record record) {
		try {
			System.out.println(record);
			dormManageServiceImpl.addRecordMsg(record);
			return new Result(true, "新增成功");
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			return new Result(false, "新增失敗");
		}
	}
	
	@RequestMapping("recordManagerDeleteById1")
	public Result recordManagerDeleteById(HttpServletRequest request) {
		Integer recordId=0;
		if(request.getParameter("recordId")!=null && request.getParameter("recordId")!="") {
			recordId=Integer.parseInt(request.getParameter("recordId"));
		}
		try {
			dormManageServiceImpl.recordManagerDeleteById1(recordId);
			return new Result(true, "刪除成功");
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			return new Result(false, "刪除失敗");
		}
	}

9、原始碼下載

若需獲取本系統原始碼請在公眾號【C you again】回覆“宿舍管理系統”

你也可以點選此連結快速回復

10、相關說明

  1. 製作不易,記得點贊+收藏+轉發
  2. 本人技術有限,若有錯誤歡迎指正
  3. 本系統和文章均屬於【C you again】原創,歡迎個人部落格、各大網站轉載,但請註明轉載地址

演示地址:宿舍管理系統演示