优先队列处理文件的锁定和自动解锁

 【背景】最近要做一个防篡改的功能,一开始是采用事件型的方式实现的,结果发现会有一种情况"如果某个文件短时间一直被外部进行多次恶意操作"时,一直防也不是个事,应该在加一层防护—文件锁定,这样就舒服多了

【好处】避免短时间站点被频繁攻击,保证安全性的同时,尽量保证业务正常运行

【实现思路】

        一开始是想着用全局map去存储每一个文件的修改次数和最后一次时间,后面发现这样子操作,需要注意内存释放问题,一不小心就会导致内存泄漏的情况。

        所以盯上了一个好东西——优先队列,通过结构体进行实现

【具体实现逻辑】

        先定义了两个结构体和一个数据结构,FileInfo用于存储文件的修改次数和最后修改时间,UnlockTask用于存储待解锁的文件名和预定解锁时间。

type FileInfo struct {ModCount intLastMod  time.Time
}type UnlockTask struct {FileName stringTime     time.Time
}type UnlockQueue []*UnlockTask

        再写下实现heap.Interface接口的方法,主要用于操作优先队列,用堆操作(如Push和Pop)来管理队列。

func (q UnlockQueue) Len() int { return len(q) }func (q UnlockQueue) Less(i, j int) bool {return q[i].Time.Before(q[j].Time)
}func (q UnlockQueue) Swap(i, j int) {q[i], q[j] = q[j], q[i]
}func (q *UnlockQueue) Push(x interface{}) {item := x.(*UnlockTask)*q = append(*q, item)
}func (q *UnlockQueue) Pop() interface{} {old := *qn := len(old)item := old[n-1]*q = old[0 : n-1]return item
}

主实现函数:

  • 首先,OnFileModified函数会在文件被修改时被调用,更新文件的修改次数和最后修改时间。

  • 然后,CheckFileModCount函数定时检查文件的修改次数,如果在5秒内文件被修改了10次,就会调用lockFile函数锁定文件,并将其添加到优先队列中,预定在60秒后解锁。

  • 最后,CheckUnlockQueue函数会检查优先队列,如果到了预定的解锁时间,就会调用unlockFile函数解锁文件。

// 在文件被篡改时调用这个函数
func OnFileModified(fileName string) {info, ok := fileMap[fileName]if !ok {info = &FileInfo{ModCount: 0, LastMod: time.Now()}fileMap[fileName] = info}//fmt.Printf("---检测该文件【%s】被篡改,次数+1", fileName)info.ModCount++info.LastMod = time.Now()
}// 定时检查文件修改次数
func CheckFileModCount() {for fileName, info := range fileMap {if time.Since(info.LastMod).Seconds() < 5 && info.ModCount >= 10 {fmt.Printf("---检测到文件【%s】在5s内,被篡改了10次,即将封锁该文件", fileName)lockFile(fileName)queueLock.Lock()heap.Push(&unlockQueue, &UnlockTask{FileName: fileName, Time: time.Now().Add(60 * time.Second)})queueLock.Unlock()}}
}// 检查解锁队列
func CheckUnlockQueue() {queueLock.Lock()for unlockQueue.Len() > 0 && time.Now().After(unlockQueue[0].Time) {task := heap.Pop(&unlockQueue).(*UnlockTask)unlockFile(task.FileName)}queueLock.Unlock()
}// 锁定文件
func lockFile(fileName string) {cmd := exec.Command("chattr", "+i", fileName)err := cmd.Run()if err != nil {fmt.Printf("Error locking file %s: %v\n", fileName, err)}
}// 解锁文件
func unlockFile(fileName string) {cmd := exec.Command("chattr", "-i", fileName)err := cmd.Run()if err != nil {fmt.Printf("Error unlocking file %s: %v\n", fileName, err)}
}

main.go 主调用函数

func main() {heap.Init(&core.UnlockQueue{})// 当文件确定被篡改时,调用这个函数core.OnFileModified(event.Name)go func() {for {core.CheckFileModCount()core.CheckUnlockQueue()time.Sleep(1 * time.Second)}}()
}

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

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

相关文章

云原生:企业数字化转型的引擎与未来

一&#xff0c;引言 随着信息技术的飞速发展&#xff0c;企业数字化转型已成为时代的必然趋势。在这场深刻的变革中&#xff0c;云原生技术以其独特的优势&#xff0c;逐渐成为推动企业数字化转型的核心动力。本文将详细探讨云原生技术的内涵、发展历程&#xff0c;以及在企业数…

【Java开发指南 | 第八篇】Java变量、构造方法、创建对象

专栏&#xff1a;Java开发指南 CSDN秋说 文章目录 Java变量构造方法创建对象 Java变量 局部变量&#xff1a;在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中&#xff0c;方法结束后&#xff0c;变量就会自动销毁。成员变量&#xff08;…

研究生,该学单片机还是plc。?

PLC门槛相对较低&#xff0c;但是在深入学习和应用时&#xff0c;仍然有很高的技术要求。我这里有一套单片机入门教程&#xff0c;不仅包含了详细的视频 讲解&#xff0c;项目实战。如果你渴望学习单片机&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;私信22&am…

OpenHarmony实战开发-图片选择和下载保存案例。

介绍 本示例介绍图片相关场景的使用&#xff1a;包含访问手机相册图片、选择预览图片并显示选择的图片到当前页面&#xff0c;下载并保存网络图片到手机相册或到指定用户目录两个场景。 效果图预览 使用说明 从主页通用场景集里选择图片选择和下载保存进入首页。分两个场景点…

Linux UDP通信系统

目录 一、socket编程接口 1、socket 常见API socket()&#xff1a;创建套接字 bind()&#xff1a;将用户设置的ip和port在内核中和我们的当前进程关联 listen() accept() 2、sockaddr结构 3、inet系列函数 二、UDP网络程序—发送消息 1、服务器udp_server.hpp initS…

Hadoop HDFS:海量数据的存储解决方案

引言 在大数据时代&#xff0c;数据的存储与处理成为了业界面临的一大挑战。Hadoop的分布式文件系统&#xff08;Hadoop Distributed File System&#xff0c;简称HDFS&#xff09;作为一个高可靠性、高扩展性的文件系统&#xff0c;提供了处理海量数据的有效解决方案。本文将…

stm32开发之threadx整合letter-shell 组件记录

前言 使用过rt-thread的shell 命令交互的方式&#xff0c;觉得比较方便,所以在threadx中也移植个shell的组件。这里使用的是letter-shellletter-shell 核心的逻辑在于组件通过链接文件自动初始化或自动添加的两种方式&#xff0c;方便开发源码仓库 实验(核心代码) shell 线程…

rhce day1

一 . 在系统中设定延迟任务要求如下 在系统中建立 easylee 用户&#xff0c;设定其密码为 easylee 延迟任务由 root 用户建立 要求在 5 小时后备份系统中的用户信息文件到 /backup 中 确保延迟任务是使用非交互模式建立 确保系统中只有 root 用户和 easylee 用户可以执行延…

✌粤嵌—2024/3/11—跳跃游戏

代码实现&#xff1a; 方法一&#xff1a;递归记忆化 int path; int used[10000];bool dfs(int *nums, int numsSize) {if (path numsSize - 1) {return true;}for (int i 1; i < nums[path]; i) {if (used[path i]) {continue;}path i;used[path] 1;if (dfs(nums, num…

“华为杯“华南理工大学程序设计竞赛 L-再一道好题

题目 #include<bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second const int maxn 1e6 5; const int inf 1e9 5;using namespace std;int n, m;void solve(){int res 0;int q;string s;int k;cin …

北京市为例的空气质量分析报告分析【免费送】

原始数据&#xff1a; 日期名称类型所属区拥挤指数速度客流指数20240405世界之花假日广场购物;购物中心大兴区2.46621.369.4920240405华润五彩城购物;购物中心海淀区2.01329.7111.1720240405北京市百货大楼购物;购物中心东城区1.85615.938.2320240405apm购物;购物中心东城区1.…

C#开源项目推荐

winform界面开发 SunnyUI SharpSCADALite工业控制数据采集 https://github.com/qwe7922142/SharpSCADALite net中国集合优秀Net项目 https://gitee.com/dotnetchina 数据库管理系统 https://gitee.com/dotnetchina/SmartSQL 工作流项目 RoadFlow-UnMean 网口通讯 weaving-…

Grok-1.5 Vision:X AI发布突破性的多模态AI模型,超越GPT 4V

在人工智能领域&#xff0c;多模态模型的发展一直是科技巨头们竞争的焦点。 近日&#xff0c;马斯克旗下的X AI公司发布了其最新的多模态模型——Grok-1.5 Vision&#xff08;简称Grok-1.5V&#xff09;&#xff0c;这一模型在处理文本和视觉信息方面展现出了卓越的能力&#x…

Python统计模型线性推理事件前因后果

&#x1f3af;要点 经典统计方法&#xff1a;&#x1f58a; A/B测试&#xff0c;计算两个均值样本的置信区间&#xff0c;&#x1f58a;最小二乘法计算变量估值&#xff0c;&#x1f58a;使用非线性关系式表示线性回归。&#x1f58a;实例&#xff1a;高等教育和数学高分的事件…

批量导入照片

clear clc close all % 创建或获取演示文稿对象 ppt Presentation(new_presentation.pptx, 演示文稿1.pptx); open(ppt); % 添加新的幻灯片 slide1 add(ppt, Title Slide); % 指定第一张图片路径 imagePath1 C:\Users\Administrator\Desktop\001\阵风因子-横风向图20…

Linux usermod命令教程:如何修改用户属性(附案例详解和注意事项)

Linux usermod命令介绍 usermod命令是Linux系统中用来修改用户属性的命令。它可以修改用户的登录名、家目录、登录shell、用户组等信息。 Linux usermod命令适用的Linux版本 usermod命令在大多数Linux发行版中都是可用的&#xff0c;包括Debian、Ubuntu、Alpine、Arch Linux…

即席查询笔记

文章目录 一、Kylin4.x1、Kylin概述1.1 定义1.2 Kylin 架构1.3 Kylin 特点1.4 Kylin4.0 升级 2、Kylin 环境搭建2.1 简介2.2 Spark 安装和部署2.3 Kylin 安装和部署2.4 Kylin 启动环境准备2.5 Kylin 启动和关闭 3、快速入门3.1 数据准备3.2 Kylin项目创建入门3.3 Hive 和 Kylin…

Canvas图形编辑器-数据结构与History(undo/redo)

Canvas图形编辑器-数据结构与History(undo/redo) 这是作为 社区老给我推Canvas&#xff0c;于是我也学习Canvas做了个简历编辑器 的后续内容&#xff0c;主要是介绍了对数据结构的设计以及History能力的实现。 在线编辑: https://windrunnermax.github.io/CanvasEditor开源地…

【个人博客搭建】(3)添加SqlSugar ORM

1、安装sqlsugar。在models下的依赖项那右击选择管理Nuget程序包&#xff0c;输入sqlsugarcore&#xff08;因为我们用的是netcore&#xff0c;而不是net famework所以也对应sqlsugarcore&#xff09;&#xff0c;出来的第一个就是了&#xff0c;然后点击选择版本&#xff0c;一…