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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
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
相关文章
|
5天前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
7天前
|
存储 Java 数据库连接
php学习笔记-代码基本语法-day01
本文是关于PHP编程语言的基础语法学习笔记,内容包括PHP的介绍、注释风格、数据类型、命名规范、常量和变量的使用,以及变量和常量相关的常用函数。文中详细解释了PHP的基本语法元素和一些易混淆的概念,如传值赋值与传址赋值、可变变量,以及如何检查变量是否已定义或为空。
php学习笔记-代码基本语法-day01
|
3天前
|
程序员 数据库连接 PHP
PHP中的异常处理:提升代码的健壮性
【9月更文挑战第30天】在编程的世界里,错误和异常是不可避免的。本文将深入探索PHP中异常处理的机制,揭示如何通过有效的异常管理来增强代码的健壮性和可靠性。我们将从基础概念出发,逐步深入到高级应用,最后通过实际代码示例来巩固理论知识。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的指导和启示。
16 6
|
7天前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性
设计模式在PHP开发中至关重要,如单例模式确保类仅有一个实例并提供全局访问点,适用于管理数据库连接或日志记录。工厂模式封装对象创建过程,降低系统耦合度;策略模式定义算法系列并使其可互换,便于实现不同算法间的切换。合理选择设计模式需基于需求分析,考虑系统架构,并通过测试驱动开发验证有效性,确保团队协作一致性和代码持续优化。设计模式能显著提升代码质量,解决开发中的设计难题。
24 8
|
4天前
|
设计模式 算法 PHP
PHP中的设计模式:提升代码的灵活性与可维护性
在本文中,我们将深入探讨PHP编程语言中的一种重要概念——设计模式。设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它代表了最佳的实践,被有经验的面向对象的软件开发人员所采用。本文将通过具体的实例,展示如何在PHP项目中应用设计模式,以提高代码的灵活性和可维护性。无论你是PHP初学者还是经验丰富的开发者,都能从中获得有价值的见解。
|
6天前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入探索与实践在软件开发的广袤天地中,PHP以其独特的魅力和强大的功能,成为无数开发者手中的得力工具。而在这条充满挑战与机遇的征途上,设计模式犹如一盏明灯,指引着我们穿越代码的迷雾,编写出更加高效、灵活且易于维护的程序。今天,就让我们聚焦于设计模式中的璀璨明珠——策略模式,深入探讨其在PHP中的实现方法及其实际应用价值。
策略模式,这一设计模式的核心在于它为软件设计带来了一种全新的视角和方法。它允许我们在运行时根据不同情况选择最适合的解决方案,从而极大地提高了程序的灵活性和可扩展性。在PHP这门广泛应用的编程语言中,策略模式同样大放异彩,为开发者们提供了丰富的创作空间。本文将从策略模式的基本概念入手,逐步深入到PHP中的实现细节,并通过一个具体的实例来展示其在实际项目中的应用效果。我们还将探讨策略模式的优势以及在实际应用中可能遇到的挑战和解决方案,为PHP开发者提供一份宝贵的参考。
|
5天前
|
设计模式 存储 数据库连接
探索PHP中的设计模式:提高代码的可维护性与扩展性
本文将深入探讨PHP中常用的设计模式,包括单例模式、工厂模式和观察者模式。通过具体的代码示例,展示如何在实际项目中应用这些设计模式,以提高代码的可维护性与扩展性。无论你是PHP初学者还是有一定经验的开发者,都可以通过本文的学习,提升你的编程技巧和项目架构能力。
|
7天前
|
存储 PHP 开发者
深入探索PHP中的面向对象编程:提升代码的重用性与维护性
在PHP开发中,面向对象编程(OOP)是一种重要的编程范式,它不仅提高了代码的重用性和组织性,还大大增强了程序的可维护性和扩展性。本文将详细探讨PHP中面向对象编程的核心概念,如类和对象、继承、多态以及封装等,并通过实例展示如何在实际项目中有效应用这些概念来构建高效且易于维护的代码。通过深入理解和运用OOP,开发者能够编写出更加结构化和模块化的应用程序,从而应对复杂项目的挑战。
|
5月前
|
机器学习/深度学习 存储 搜索推荐
利用机器学习算法改善电商推荐系统的效率
电商行业日益竞争激烈,提升用户体验成为关键。本文将探讨如何利用机器学习算法优化电商推荐系统,通过分析用户行为数据和商品信息,实现个性化推荐,从而提高推荐效率和准确性。
210 14
|
5月前
|
机器学习/深度学习 算法 搜索推荐
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
下一篇
无影云桌面