基于机器学习的PHP-WebShell扫描工具(附完整代码)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 基于机器学习的PHP-WebShell扫描工具(附完整代码)

总体设计


后端设计如下:


image.png


  • index 项目信息
  • user 与用户相关的处理
  • login 登录
  • register 登录
  • forget 忘记密码
  • logut 登出
  • job 任务相关处理
  • upload 上传 webshell 文件
  • scan 对上传的文件进行扫描
  • count 统计当前用户所有的扫描任务与已上传的文件
  • search 具体描述某一任务,重点为改任务的结果

其中,仅 index 允许游客访问。

环境为开发环境,上传的是生产环境


User 应用设计

后端设计

参考的项目

User 其 MVT 中的 Moduleview 部分,参考于基于 Django2.2 可重用登录与注册系统

模型如下:


classUser(models.Model):"""
    用户模型
    """name=models.CharField(max_length=128,unique=True)password=models.CharField(max_length=256)email=models.EmailField(unique=True)c_time=models.DateTimeField(auto_now_add=True)has_confirmed=models.BooleanField(default=False)def__str__(self):returnself.nameclassMeta:ordering=["-c_time"]verbose_name="用户"verbose_name_plural="用户"classConfirmString(models.Model):"""
    邮箱确认模型
    """code=models.CharField(max_length=256)user=models.OneToOneField('User',on_delete=models.CASCADE)c_time=models.DateTimeField(auto_now_add=True)def__str__(self):returnself.user.name+":   "+self.codeclassMeta:ordering=["-c_time"]verbose_name="确认码"verbose_name_plural="确认码"

其他功能

之后的 View 部分是在基于 Django2.2 可重用登录与注册系统的基础上,补充部分功能:

  • 忘记密码
  • 重置密码
  • django simple captcha refresh


忘记密码

其中重置密码没有独立出来,是属于忘记密码的一部分

相关模型如下:

classConfirmString(models.Model):"""
    邮箱确认模型
    """code=models.CharField(max_length=256)user=models.OneToOneField('User',on_delete=models.CASCADE)c_time=models.DateTimeField(auto_now_add=True)def__str__(self):returnself.user.name+":   "+self.codeclassMeta:ordering=["-c_time"]verbose_name="确认码"verbose_name_plural="确认码"


应用逻辑如下:

  • 用户在 user/forget/index 的表单中,添加需要重置密码的用户邮箱
  • 若无改用户,则弹出无该用户的警告
  • 有该邮箱,则往用户邮箱发送重置密码的链接,此时
  • 重置密码的链接大致为 user/forget/confirm/?code=*
  • 当 code 是在 ConfirmString 实例中时,将 userhas_confirmed,使其在重置密码期间无法登录,之后携
  • code 转到 user/forget/change/?code=*
  • 若数据库中没有该 code,则拒绝
  • user/forget/change/?code=* 中,根据 code 查询一对一匹配的 user,再根据添加的表单修改密码,之后 confirm.user.save()confirm.delete()


django simple captcha refresh

在原项目基础上,需要修改 Templateurls.py

  • urls.py

captcha.views 内置就有刷新验证码的方法

fromcaptcha.viewsimportcaptcha_refresh# 验证码刷新功能,captcha_refresh为captcha.views内置方法,不需要我们单独写urlpatterns=[...path('refresh/',captcha_refresh),# 点击可以刷新验证码]
  • Template
{#刷新验证码的脚本,放到body部分的最后面即可#}
<script>$('.captcha').click(function(){$.getJSON('/captcha/refresh/',function(result){$('.captcha').attr('src',result['image_url']);$('#id_captcha_0').val(result['key']);});});</script>


前端设计

前端设计上是基本参考于 bootstrapdoc 5.0 example.

  • index.html


2fbdb8200c6753e5167408dfc7296b57.png

  • login.html


ca446342fc207cde86e6ddafbc36a0e7.png


Job 应用设计

后端设计


Job 的应用设计上,个人在设计时,分为一些几个功能:

  • Upload 上传 WebShell 文件
  • Count 统计当前用户的上传文件和扫描任务
  • Scan 根据 file 文件创建扫描任务
  • Search 根据 task_id 查询扫描任务结果

在四个任务中,uploadcountsearch 设计相对简单,网上参考也相对较多,这里只是简单介绍。而 scan 中的设计相对麻烦,本质上是利用 celery 来处理扫描任务。


upload


models 中设计相关模型,且添加装饰器,用于在 admin 可以方便地同时删除文件对象和磁盘中的文件。

  • models.py
classModelWithFileField(models.Model):tmp_file=models.FileField(upload_to='./FileUpload/')# 上传目录为 FileUploadfile_user=models.ForeignKey(User,on_delete=models.CASCADE,null=True)'''
    值得注意的一点是,FileUpload中已经存在相同文件名的文件时,会对上传文件的文件名重命名 
    如 1.png 转为 1_fIZVhN3.png
    且存储的文件为 1_fIZVhN3.png
    '''c_time=models.DateTimeField(auto_now_add=True)def__str__(self):returnself.tmp_file.nameclassMeta:ordering=["-c_time"]verbose_name="文件"verbose_name_plural="文件"# 添加装饰器@receiver(post_delete,sender=ModelWithFileField)defdelete_upload_files(sender,instance,**kwargs):files=getattr(instance,'tmp_file')ifnotfiles:returnfname=os.path.join(settings.MEDIA_ROOT,str(files))ifos.path.isfile(fname):os.remove(fname)
  • views.py
defupload_file(request):"""
    上传文件
    :param request:
    :return:
    """ifnotrequest.session.get('is_login',None):# 不允许重复登录returnredirect('/user/index/')ifrequest.method=='POST':form=UploadFileForm(request.POST,request.FILES)ifform.is_valid():user_id=request.session.get('user_id')ifuser_id:tmp_user=models.User.objects.get(id=user_id)instance=ModelWithFileField(tmp_file=request.FILES['file'],file_user=tmp_user)instance.save()message="上传成功!\n存储的文件名为:\n"+instance.tmp_file.namereturnrender(request,'job/upload.html',{'message_success':message})else:returnrender(request,'job/upload.html',{'message_warning':"上传失败"})else:form=UploadFileForm()returnrender(request,'job/upload.html',{'form':form})


scan

scan 设计思路如下:

  1. 利用 celeryredis,作为任务调度模块
  2. 当 scan 成功访问,file 文件存在和无相关任务时,后台分别创建 ScanTaskField 实例和启动 celery 中的 scanTask.delay(file_name=file_name)
  3. 当 celery 中任务完成,自动更新 ScanTaskField 实例(同样需要添加装饰器)


参考文档 docs.celeryproject.org/en/v5.0.5/django/first-steps-with-django

前端设计

前端设计上同样是基本参考于 bootstrapdoc 5.0 example.

job/count


25a289d5e651348d714c278379f70578.png


job/upload


443ebddbc4e15f4901b6281c978e0562.png


应用配置

邮箱功能需要在 settings.py 中配置如下参数:


25b4e1bfb22e7c89019b6ba8dde8e110.png

celery 中设置 workerredis,需要

`docker run --name=redis -d -p 6379:6379 redis`


celery 启动

celery -A ScanWebShell worker -l info

完整代码:https://download.csdn.net/download/pythonyanyan/87390586

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
13天前
|
IDE PHP 开发工具
PHP中的类型提示与严格模式:提高代码可维护性
随着PHP语言的发展,开发者对代码的可读性、可维护性和可靠性有了更高的要求。PHP中的类型提示(Type Hinting)和严格模式(Strict Mode)为开发者提供了更强的类型检查机制,有助于提升代码质量和减少潜在的错误,尤其是在大型项目中。
|
1月前
|
安全 程序员 PHP
PHP中的异常处理:提升代码的健壮性
【10月更文挑战第8天】在编程的世界中,错误和异常是不可避免的。它们就像路上的坑洼,可能会让我们的程序“跌倒”。但是,如果我们能够正确地处理这些异常,就可以让我们的程序更加稳健,就像我们学会了如何在坑洼的路上稳稳地行走一样。本文将介绍PHP中的异常处理机制,以及如何使用它来提升我们的代码质量。
|
7天前
|
机器学习/深度学习 数据采集 人工智能
探索机器学习:从理论到Python代码实践
【10月更文挑战第36天】本文将深入浅出地介绍机器学习的基本概念、主要算法及其在Python中的实现。我们将通过实际案例,展示如何使用scikit-learn库进行数据预处理、模型选择和参数调优。无论你是初学者还是有一定基础的开发者,都能从中获得启发和实践指导。
17 2
|
10天前
|
机器学习/深度学习 数据采集 人工智能
揭秘AI:机器学习的魔法与代码
【10月更文挑战第33天】本文将带你走进AI的世界,了解机器学习的原理和应用。我们将通过Python代码示例,展示如何实现一个简单的线性回归模型。无论你是AI新手还是有经验的开发者,这篇文章都会给你带来新的启示。让我们一起探索AI的奥秘吧!
|
1月前
|
数据采集 移动开发 数据可视化
模型预测笔记(一):数据清洗分析及可视化、模型搭建、模型训练和预测代码一体化和对应结果展示(可作为baseline)
这篇文章介绍了数据清洗、分析、可视化、模型搭建、训练和预测的全过程,包括缺失值处理、异常值处理、特征选择、数据归一化等关键步骤,并展示了模型融合技术。
53 1
模型预测笔记(一):数据清洗分析及可视化、模型搭建、模型训练和预测代码一体化和对应结果展示(可作为baseline)
|
22天前
|
机器学习/深度学习 并行计算 数据挖掘
R语言是一种强大的统计分析工具,广泛应用于数据分析和机器学习领域
【10月更文挑战第21天】R语言是一种强大的统计分析工具,广泛应用于数据分析和机器学习领域。本文将介绍R语言中的一些高级编程技巧,包括函数式编程、向量化运算、字符串处理、循环和条件语句、异常处理和性能优化等方面,以帮助读者更好地掌握R语言的编程技巧,提高数据分析的效率。
38 2
|
30天前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性和扩展性
【10月更文挑战第13天】 本文将探讨PHP中常见的设计模式及其在实际项目中的应用。通过对比传统编程方式,我们将展示设计模式如何有效地提高代码的可维护性和扩展性。无论是单例模式确保类的单一实例,还是观察者模式实现对象间的松耦合,每一种设计模式都为开发者提供了解决特定问题的最佳实践。阅读本文后,读者将能更好地理解和应用这些设计模式,从而提升PHP编程的效率和质量。
|
30天前
|
敏捷开发 存储 数据可视化
解锁团队高效秘诀:5款顶尖PHP任务管理工具推荐
在现代企业中,高效的任务管理系统已成为不可或缺的工具,特别是在团队协作和项目管理中。PHP任务管理系统因其灵活性、开源性和易用性,备受企业管理者、项目团队和开发人员青睐。本文将介绍什么是PHP任务管理系统,其应用场景,以及推荐5款顶级的PHP任务管理系统,帮助企业提升效率和管理能力。
38 2
|
1月前
|
机器学习/深度学习 人工智能 算法
揭开深度学习与传统机器学习的神秘面纱:从理论差异到实战代码详解两者间的选择与应用策略全面解析
【10月更文挑战第10天】本文探讨了深度学习与传统机器学习的区别,通过图像识别和语音处理等领域的应用案例,展示了深度学习在自动特征学习和处理大规模数据方面的优势。文中还提供了一个Python代码示例,使用TensorFlow构建多层感知器(MLP)并与Scikit-learn中的逻辑回归模型进行对比,进一步说明了两者的不同特点。
64 2
|
1月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP开发领域,设计模式是解决常见问题的高效方案集合。它们不是具体的代码,而是一种编码和设计经验的总结。单例模式作为设计模式中的一种,确保了一个类仅有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的基本概念、实现方式及其在PHP中的应用。
单例模式在PHP中的应用广泛,尤其在处理数据库连接、日志记录等场景时,能显著提高资源利用率和执行效率。本文从单例模式的定义出发,详细解释了其在PHP中的不同实现方法,并探讨了使用单例模式的优势与注意事项。通过对示例代码的分析,读者将能够理解如何在PHP项目中有效应用单例模式。

热门文章

最新文章