为什么会是443端口
引言在使用Nginx进行HTTPS服务配置时,我遇到一个问题:只有443端口可以访问HTTPS服务。我很好奇为什么会是443端口。 443端口的历史原因443端口是HTTP Secure(HTTPS)服务的默认端口,这个数字并非随意选择。在互联网的早期,端口号被分配给特定的服务,而443端口被指定为SSL(Secure Sockets Layer)服务的端口,这是HTTPS的前身。随着时间的推移,SSL被TLS(Transport Layer Security)取代,但443端口作为安全通信端口的传统得以保留。 SSL/TLS协议SSL/TLS协议是用于在互联网上提供安全通信的加密协议。它通过加密数据、验证身份和确保数据完整性来保护通信的安全。在HTTPS中,SSL/TLS协议用于加密客户端和服务器之间的数据传输,确保数据在传输过程中不被窃听或篡改。SSL是Secure Sockets Layer的缩写,TLS是Transport Layer Security的缩写,SSL中文含义是“安全套接字层”。TLS是the Transport Layer S...
始化COM库
COM 是一种微软的软件组件技术,它允许不同的应用程序之间进行通信和交互。在 Windows 操作系统中,许多应用程序和服务都使用 COM 来实现其功能。 pythoncom.CoInitialize() 在 Python 程序中的作用是初始化 COM(Component Object Model)库。 当你在 Python 程序中使用 pythoncom.CoInitialize() 时,你是在告诉 Python 解释器需要初始化 COM 库,以便能够使用 COM 相关的功能。这通常在以下情况下需要: 使用 COM 库:如果你需要在 Python 程序中使用 COM 库来与其他应用程序或服务进行交互,你需要首先初始化 COM 库。 多线程环境:在多线程环境中,每个线程都需要独立地初始化 COM 库。如果你在多线程程序中使用 COM,你需要在每个线程中调用 pythoncom.CoInitialize()。 避免冲突:COM 库的初始化是线程安全的,但在同一线程中多次初始化可能会导致问题。因此,通常建议在程序开始时调用一次 pythoncom.CoInitialize(),...
优雅地废弃代码
Python 中的 @deprecated 装饰器:优雅地废弃代码在软件开发过程中,我们经常会遇到需要废弃旧代码的情况。这可能是因为代码存在安全问题、性能问题,或者是因为有了更好的替代方案。Python 提供了一种优雅的方式来处理这种情况,那就是使用 @deprecated 装饰器。本文将详细介绍 @deprecated 装饰器的使用方法、实现原理以及最佳实践。 什么是 @deprecated 装饰器?@deprecated 装饰器是一个用于标记函数、方法或类为已废弃的工具。当被标记的代码被调用时,它会触发一个 DeprecationWarning 警告,提醒开发者该功能将在未来版本中被移除或更改。 如何使用 @deprecated 装饰器?Python 标准库中的 warnings 模块提供了 warn 函数,可以用来发出警告。结合 functools 模块中的 wraps 装饰器,我们可以创建一个自定义的 @deprecated 装饰器。 12345678910111213import warningsfrom functools import wrapsdef deprec...
流式返回
什么是web流式返回流式返回,顾名思义,就是将返回的数据流式返回给客户端,而不是等待所有数据都准备好再返回给客户端。这样做的优点是,客户端可以在数据传输的过程中就开始处理数据,而不需要等待所有数据都传输完成。 如何实现web流式返回实现web流式返回的方式有很多种,下面介绍几种常见的方式: 使用HTTP/2协议HTTP/2协议支持多路复用,可以同时传输多个请求和响应,从而实现流式返回。使用HTTP/2协议可以实现更高效的流式返回。 使用WebSocket协议WebSocket协议可以实现全双工通信,可以实时地将数据从服务器推送到客户端。使用WebSocket协议可以实现实时的流式返回。以python websocket为例: 1234567891011import asyncioimport websocketsasync def echo(websocket, path): async for message in websocket: await websocket.send(message)start_server = we...
剪切板取证
代码如下打开剪贴板: 1win32clipboard.OpenClipboard() 这行代码打开剪贴板,以便读取其中的数据。 获取剪贴板中的文本数据: 1text = win32clipboard.GetClipboardData(win32clipboard.CF_UNICODETEXT) 这行代码从剪贴板中获取 Unicode 文本数据。 构建源数据字典: 1234source_data = { "type": "txt", "content": text} 这行代码将获取到的文本数据封装成一个字典,其中 type 表示数据类型为文本,content 是文本的具体内容。 处理数据并写入文件: 123clean_data = get_line(self, source_data, self.display)data = json.dumps(clean_data, ensure_ascii=False)write_file(self.file, data) 这行代码调用 get_lin...
获取windows的USB记录
USBDeview某个刑侦专家说过,走过必定留下痕迹,所以在一台电脑上,存在过的USB记录也是可以获取的。当然想法去解析记录可以,也可以直接使用USBDeview,解析软件最终结果。USBDeview 是一款可以列出当前连接到你的计算机上或者曾经连接到你的计算机上的所有 USB 设备的小型实用工具。 实现检查并终止指定进程: 12345678910111213pe_name = "USBDeview.exe"for process in psutil.process_iter(): try: name = process.name() except: name = "" try: if name == pe_name: setting.log.error("检测到%s已在运行, 正在终止重启" % name) process.terminate() except Exception as e: se...
获取windows的环境变量
遍历系统环境变量: 1for path in wmi.WMI().Win32_Environment(): 这部分代码使用 wmi 模块遍历系统中的所有环境变量。 提取每个环境变量的信息: 12345678item = { "Name": getattr(path, "Name"), "SystemVariable": getattr(path, "SystemVariable"), "UserName": getattr(path, "UserName"), "Description": getattr(path, "Description"), "Caption": getattr(path, "Caption"), "VariableValue": getattr(path, "VariableValu...
浏览器历史记录
浏览器历史记录浏览器历史记录会以db后缀文件的形式,以明文存放在本地目录,用户可以通过解析这个文件查看浏览器最近访问,包括访问时间,网站图标等等。chrome内核的浏览器跟Firefox浏览器虽然都是保存在db文件中,但是数据结构完全不一样,需要做区分处理。 chrome浏览器获取所有用户信息: 12for user in wmi.WMI().Win32_UserAccount(): user_name = user.Name 这行代码使用 wmi 模块获取所有用户账户信息,并遍历这些信息,提取每个用户的用户名。 初始化 MD5 列表: 1md5_list = [] 这行代码创建了一个空列表,用于存储已经处理过的历史记录文件的 MD5 值,以避免重复处理。 获取每个用户的历史记录文件路径: 123for path in self.get_path(user_name): if os.path.isdir(path): continue 这行代码调用 self.get_path(user_name) 方法获取指定用户的历史记录文件路径,并遍历这些路径。如果...
开机自启动
开机自启动自启动程序是指在系统启动时自动运行的程序。这些程序可能会影响系统的启动速度和性能,因此了解如何获取和管理这些程序是非常重要的。本文将介绍一种使用 Python 实现的方法,通过调用系统命令和处理 CSV 文件来获取自启动程序的信息。 windows代码实现确定 autorunsc 程序的名称: 1autorunsc_name = "autorunsc64.exe" if platform.architecture()[0] == "64bit" else "autorunsc32.exe" 这行代码根据当前系统的架构(64 位或 32 位)来确定 autorunsc 程序的文件名。终止正在运行的 autorunsc 进程: 1234567891011for process in psutil.process_iter(): try: name = process.name() except: name = "" try: if n...
后台终端的使用
Screen命令使用指南screen 是一个非常强大的命令行工具,它允许用户在远程服务器上开启多个终端会话,并在它们之间自由切换。它特别适合于需要长时间运行的命令和断线后恢复的场景。 安装 Screen在大多数 Linux 发行版中,screen 可以通过包管理器安装。以下是在不同系统中安装 screen 的命令: Ubuntu/Debian:1sudo apt-get install screen CentOS/RHEL:1sudo yum install screen Fedora:1sudo dnf install screen 基本使用创建新的 Screen 会话要创建一个新的 screen 会话,可以使用以下命令: 1screen -S session_name 这里 session_name 是你为会话指定的名称,你可以用它来标识和管理不同的会话。 列出当前的 Screen 会话要查看当前所有的 screen 会话,可以使用: 1screen -ls 这将列出所有活动的会话以及它们的状态。 重新连接到 Screen 会话如果你之前创建了一个...














