• 什么是Tor?Tor浏览器更新有什么用?什么是Tor?Tor浏览器更新有什么用?
  • 难怪马斯克裁掉整个安全部门,推特540万用户数据在暗网公开难怪马斯克裁掉整个安全部门,推特540万用户数据在暗网公开
  • 中华人民共和国网络安全法中华人民共和国网络安全法
大横幅1
大横幅2
到期时间:永久 到期时间:推广
到期时间:推广 小横幅4
今日发布0 篇文章 | 本站共发布了1816篇文章
  • Linux常用命令之systemctl用法详解

    Linux systemctl命令是系统和服务管理器的主要命令之一,它可以启动、停止、重启、重新加载和查询系统服务状态等操作。 语法格式: systemctl 参数 [动作] [服务名] 常用参数: -a 显示所有单位 -f 覆盖任何冲突的符号链接 -H 设置要连接的主机名 -M 设置要连接的容器名 -n 设置要显示的日志行数 -o 设置要显示的日志格式 -q 静默执行模式 -r 显示本地容器的单位 -s 设置要发送的进程信号 -t 设置单元类型 –help 显示帮助信息 –version 显示版本信息 常用动作: start 启动服务 stop 停止服务 restart 重启服务 enable 设置服务开机自启 disable 取消服务开机自启 status 查看服务状态 list 显示所有已启动服务 举例: 1、查看特定服务的状态 systemctl status httpd 2、启动特定服务 systemctl start httpd 3、停止特定服务 systemctl stop httpd 4、重新加载服务 必须在服务启动的情况下,重新加载服务,不然报错,它并不支持所有的服务,比如 network systemctl reload httpd 5、将特定服务设置成开机启动 systemctl enable httpd 6、取消开机启动 systemctl disable httpd 7、查看服务是否设置成开机启动 看输出结果,就知道是否是开机启动,enabled 代表开机启动,disabled 代表开机不启动 systemctl is-enabled httpd 8、注销指定服务 注销服务后,服务就没法启用了,这对于禁用高危服务相当有用 systemctl mask httpd 9、取消注销指定服务 重新启用注销的服务 systemctl unmask httpd 10、列出所有可用单元 systemctl list-unit-files  11、列出所有已启动的服务列表信息 systemctl list-units --type=service ...

    2023-11-09 技术教程 38
  • Linux常用命令之ls用法详解

    Linux ls(英文全拼: list directory contents)命令用于显示指定工作目录下之内容(列出目前工作目录所含的文件及子目录)。 语法格式: ls [参数] [文件名] 常用参数: -a 显示所有文件及目录 -A 不显示当前目录和父目录 -d 显示目录自身的属性信息 -i 显示文件的inode属性信息 -l 显示文件的详细属性信息 -m 以逗号为间隔符,水平显示文件信息 -r 依据首字母将文件以相反次序显示 -R 递归显示所有子文件 -S 依据内容大小将文件排序显示 -t 依据最后修改时间将文件排序显示 -X 依据扩展名将文件排序显示 –color 显示信息带有着色效果 例子: 列出/home目录下的所有文件和目录 ls/home 显示当前目录所有文件和目录,包含隐藏文件 ls-a 除了文件名以外,还列出文件类型,权限,拥有者,文件大小等 ls-l 按时间先后顺序列出,新建立的最先显示 ls -t 按文件首英文字母,相反次序列出 ls -r 列出该目录下所有文件和目录,目录的名称后加 “/” ls -F 参数可以多个,按时间先后顺序把文件或目录的详细信息列出 ls -rlt ...

    2023-11-09 技术教程 42
  • Linux常用命令之echo详解

    Linux echo命令可以用于向标准输出或文件写入一行或多行文本。 通常用来输出一些提示信息或测试脚本的输出,也可以用于输出变量的值或执行命令的结果。 语法格式: 语法格式:echo [参数] 字符串或$变量名 常用参数: -e “\a” 发出警告音 -e “\b” 删除前面的一个字符 -e “\c” 结尾不加换行符 -e “\f” 换行后光标仍停留在原来的位置 -e “\n” 换行后光标移至行首 -e “\r” 光标移至行首但不换行 -E 禁止反斜杠转义 -n 不输出结尾的换行符 –version 显示版本信息 –help 显示帮助信息 例子 输出“hello world”,下面的双引号可省略 echo "hello world" 定义变量 string string="Linux" 输出 string 的值 echo $string 取 string 的长度 echo ${#string} 截取字符串,字符串索引从 0 开始,输出 nux echo ${string:2} 从第三个字符,截取 1 个字符,输出 n echo ${string:2:1} 替换字符,把第一个 i 替换成 a,输出 Lanux echo ${string/i/a} 替换所有的 i 为 a,输出 Lanuxa string="Linuxi" echo ${string//i/a} ...

    2023-11-09 技术教程 43
  • 什么是猴子补丁,有什么用

    一、什么是猴子补丁? 猴子补丁:Monkey Patch,主要功能就是动态的属性的替换,模块运行时替换的功能。 说直接点就是程序功能的追加或者变更。 二、Monkey Patch功能简介 Monkey Patch允许在程序运行期间动态的修改一个类或者模块。 三、举个例子 之前一个做游戏的,在很多地方都用了**import json,后来发现ujson比Python自带的json快很多,于是问题来了,几十几百个文件难道要一个一个的把import json替换成import ujson as json吗? 那也太痛苦了,其实只需要在进程开始的地方使用monkey patch**就行了,它是会影响整个进程空间的,同一进程空间中一个module只会被执行一次。 """ file:json_serialize.py """ import time import json # 时间测试装饰器 def run_time(func): def inner(*args, **kwargs): start_time = time.time() result = func(*args, **kwargs) end_time = time.time() print(f'程序用时:{end_time - start_time}') return result return inner @run_time def json_dumps(obj): return json.dumps(obj) # 生成测试字典 test_dict = {i: 1 for i in range(1, 10000001)} 使用json模块执行原程序: """ file:run.py """ from json_serialize import json_dumps, test_dict print(f'json.dumps编码用时:', end='') r1 = json_dumps(test_dict) 原程序的性能太低,我们可以使用ujson将json替换掉! 使用monkey patch修改后: """ file:run.py """ import json import ujson from json_serialize import json_dumps, test_dict def monkey_patch_json(): json.dumps = ujson.dumps monkey_patch_json() print(f'使用猴子补丁之后json.dumps编码用时:', end='') json_dumps(test_dict) 这个时候在这个项目中json模块就被monkey patch修改为了ujson模块。 ...

    2023-11-09 值得一看 35
  • Spring Boot与HttpClient:轻松实现GET和POST请求

    1. HttpClient介绍 HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。   1.1. HttpClient作用 发送HTTP请求 接收响应数据 思考:为什么要在Java程序中发送Http请求?有哪些应用场景呢? 1.2. HttpClient应用场景 当我们在使用扫描支付、查看地图、获取验证码、查看天气等功能时 其实,应用程序本身并未实现这些功能,都是在应用程序里访问提供这些功能的服务,访问这些服务需要发送HTTP请求,并且接收响应数据,可通过HttpClient来实现。 1.3 HttpClient的maven坐标 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.13</version> </dependency> 1.4. HttpClient的核心API HttpClient:Http客户端对象类型,使用该类型对象可发起Http请求。 HttpClients:可认为是构建器,可创建HttpClient对象。 CloseableHttpClient:实现类,实现了HttpClient接口。 HttpGet:Get请求类型。 HttpPost:Post请求类型。 1.5. HttpClient发送请求步骤 创建HttpClient对象 创建Http请求对象 调用HttpClient的execute方法发送请求 2. SpringBoot快速入门HttpClient 对HttpClient编程工具包有了一定了解后,那么,我们使用HttpClient在Java程序当中来构造Http的请求,并且把请求发送出去,接下来,就通过入门案例分别发送GET请求和POST请求,具体来学习一下它的使用方法。 项目结构 创建HttpClient-demo,并导入对应依赖到pom.xml 完整项目结果   pom.xml 依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <artifactId>spring-boot-starter-parent</artifactId> <groupId>org.springframework.boot</groupId> <version>2.7.15</version> </parent> <groupId>com.zbbmeta</groupId> <artifactId>HttpClient-demo</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-boot-starter</artifactId> <version>3.0.2</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.13</version> </dependency> </dependencies> </project> 2.1. GET方式请求 实现步骤: 创建HttpClient对象 创建请求对象 发送请求,接受响应结果 解析结果 关闭资源 在com.zbbmeta.controller包下创建HttpClientController接口类,并创建testGET()方法 package com.zbbmeta.controller; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicHeader; import org.apache.http.util.EntityUtils; import org.junit.jupiter.api.Test; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.Arrays; /** * @author springboot葵花宝典 * @description: TODO */ @RestController @RequestMapping(value = "/httpclient") @Slf4j @Api(tags = "HttpClient测试接口") public class HttpClientController { @GetMapping("/httpget") @ApiOperation(value = "http员工状态") public String testGET() throws Exception{ //创建httpclient对象 CloseableHttpClient httpClient = HttpClients.createDefault(); //创建请求对象 HttpGet httpGet = new HttpGet("http://localhost:8899/admin/employee/status"); //发送请求,接受响应结果 CloseableHttpResponse response = httpClient.execute(httpGet); //获取服务端返回的状态码 int statusCode = response.getStatusLine().getStatusCode(); System.out.println("服务端返回的状态码为:" + statusCode); HttpEntity entity = response.getEntity(); String body = EntityUtils.toString(entity); System.out.println("服务端返回的数据为:" + body); //关闭资源 response.close(); httpClient.close(); return "服务端返回的数据为:" + body; }n "服务端返回的数据为:" + body; } } 启动项目,PostMan访问http://localhost:8899/httpclient/httpget请求 测试结果   2.2. POST方式请求 在HttpClientTest中添加POST方式请求方法,相比GET请求来说,POST请求若携带参数需要封装请求体对象,并将该对象设置在请求对象中。 实现步骤: 创建HttpClient对象 创建请求对象 发送请求,接收响应结果 解析响应结果 关闭资源 在com.zbbmeta.controller包下创建HttpClientController接口类,并创建testPost()方法 @PostMapping("/httppost") @ApiOperation(value = "http员工登录") public String testPost() throws Exception{ //创建httpclient对象 CloseableHttpClient httpClient = HttpClients.createDefault(); //创建请求对象 HttpPost httpPost = new HttpPost("http://localhost:8899/admin/employee/login"); JSONObject jsonObject = new JSONObject(); jsonObject.put("username","admin"); jsonObject.put("password","123456"); StringEntity entity = new StringEntity(jsonObject.toString()); //指定请求编码方式 entity.setContentEncoding("utf-8"); //数据格式 entity.setContentType("application/json"); httpPost.setEntity(entity); //发送请求 CloseableHttpResponse response = httpClient.execute(httpPost); //解析返回结果 int statusCode = response.getStatusLine().getStatusCode(); System.out.println("响应码为:" + statusCode); HttpEntity entity1 = response.getEntity(); String body = EntityUtils.toString(entity1); System.out.println("响应数据为:" + body); //关闭资源 response.close(); httpClient.close(); return body; } 测试结果 ...

    2023-11-09 技术教程 42
  • 记一次某年代久远的某云漏洞到获得cnvd证书

    一、前言 去年在做云安全运维时,忙的都没有空挖漏洞。为了弥补去年一年cnvd证书的空缺,某一天晚上我打开了FOFA搜索关键字"系统",找到了某个系统网站进行测试。 二、思路历程 找到该系统时,首先用插件看了下网站接口是否存在未授权访问。 看了圈都是下载相关的页面,接着就用dirsearch进行目录扫描。 其中在检查扫描到的目录/login.php时,访问该网页时跳出 然后一堆代码一闪而过后,跳转到如下页面 看到上面的情形我猜测网站环境可能是不支持php的,php源码会直接打印出来 接着抓包访问/login.php,果不其然登录页面源码出现了: 在登录的源码中,最有利用价值的莫过于是数据库的账号密码、数据库名称,但是3306端口不一定就是开在公网上的 于是我把FOFA上所有的该系统都扒下来,放进goby中只检测开放了3306端口的系统 在企查查发现该系统的开发商注册资产超过5000万,漏洞目标又有10+,满足申请cnvd证书的条件 已知数据库为KDM3ADB,账号为root,密码为kdc 直接使用sqlmap对数据库进行注入: python3 sqlmap.py -d "mysql://root:kdc@X.X.X.X:3306/KDM3ADB" --tables 这样一张证书就到手了。 验证是dba的权限,以为能一把梭得到源码再审计一波 不过这个注入的地方虽然是dba的权限,但是却没有文件上传的权限,所以无法getshell   拿到数据库了,可以再测试一波弱口令 翻了下密码是这样的,很抽象应该是自己写了加密 回到之前login.php源码泄露里面,其中在登录时有对密码进行解密的源码,看着很头疼,想起了学密码学时候那些交换变换的算法 // 密码加密函数 function EncryptStr($strSo ...

    2023-11-09 技术教程 45
  • 某博不经意间的随拍✨ ​​​

    点击围观  ...

    2023-11-09 福利分享 48
  • HTML毛玻璃拟态UI个人主页源码

    毛玻璃拟态UI个人主页html源码开源版,毛玻璃拟态UI个人主页是小枫原创的一款简约风格开源的新UI主页设计 很漂亮,如果用这种风格写一套资源站的前端我感觉不错。 当然你们可以说这个是拟态UI5.0的版本! ...

    2023-11-08 实用工具 79
  • 超级漂亮的 AI 官网源码 AI 网站首页自适应源码

    如今 AI 正处于火热的时代,有一款超级漂亮的 AI 官网首页自适应源码,非常适合用于设计一个吸引人的首页。这个源码具有自适应的特性,可以适应不同的屏幕大小和设备类型。 这款 AI 官网首页源码设计精美,呈现出现代化和专业化的感觉。它的自适应功能使得网站在各种设备上都能够展示出最佳的效果,无论是在电脑、平板还是手机上浏览网页,都能够获得出色的用户体验。 ...

    2023-11-08 实用工具 70
  • 简单好看个人引导页毛玻璃页面 HTML 源码

    毛玻璃个人引导页源码,界面简洁,已测可完美搭建,UI非常不错的,有兴趣的自行去安装体验吧,其它就没什么好介绍的了。 ...

    2023-11-08 实用工具 68
  • 刚刚扒取的乐摄图网站导航源码,免费分享给大家!

    扒取乐摄图网站的导航源码,免费分享给大家,另外扒站工具一起分享给大家,无毒安全放心使用。 1.乐摄图网站的导航源码 ...

    2023-11-08 实用工具 65
  • Linux常用打包、解包,压缩、解压相关命令

    1. 文件、文件包、压缩包 打包是把多个文件做成一个文件包,文件大小是不变的。 压缩会改变文件的大小 2. tar命令 2.1 命令功能 用于文件的打包和压缩。 2.2 命令格式 tar [OPTION...] [FILE]... 2.3 命令选项 选项 说明 -c 创建新包 -r 往包里新增文件 -u 往包里更新文件 -t 列出包里文件 -f 指定包名 -v 详情列出处理的文件 -x 解包 2.4 常用功能 2.4.1 打包 # 创建新包 tar -cvf myfile.tar test1.txt test2.txt test # 往包里新增文件 tar -rvf myfile.tar test3.txt # 往包里更新文件 tar -uvf myfile.tar test1.txt # 列出包里文件 tar -tf myfile.tar 2.4.2 解包 选项 说明 -C 文件解压到指定目录 # 解包 tar -xvf myfile.tar # 解包到指定目录,该目录得存在 tar -xvf myfile.tar -C temp 2.4.3 压缩 Linux系统常见 选项 作用 包名格式 备注 -z gzip方式压缩 包名.tar.gz   -j bzip2方式压缩 包名.tar.bz2 安装bzip2 -J xz方式压缩 包名.tar.xz   # gzip方式压缩 tar -zcvf test1.tar.zip myfile.tar # bzip2方式压缩 tar -jcvf test2.tar.bz2 myfile.tar # xz方式压缩 tar -Jcvf test3.tar.xz myfile.tar # 不需要tar包,直接从文件进行打包压缩 tar -zcvf myfile.tar.zip test* 2.4.4 解压 tar -xvf test1.tar.zip tar -xvf test2.tar.bz2 tar -xvf test3.tar.xz tar -zcvf myfile.tar.zip 3. zip命令 Linux系统不一定自带,得安装 3.1 命令功能 将一个或多个文件压缩成一个zip文件 3.2 命令格式 zip [-r] 文件... 3.3 命令选项 -r 被压缩的内容中含有目录文件,需要使用-r选项 3.4 示例 zip -r test.zip test* 4. unzip命令 Linux系统不一定自带,得安装 4.1 命令功能 解压zip压缩包 4.2 命令格式 unzip [-d] zip压缩包名 4.3 命令选项 -d 指定解压文件存放目录 4.4 示例 unzip test.zip </div> ...

    2023-11-08 技术教程 51
  • 印第安小斑鸠,人教人教不会事教人一次就好

    印第安小斑鸠,人教人教不会事教人一次就好  6p ...

    2023-11-07 福利分享 56
  • 如何在Vim编辑器中剪切、复制和粘贴

    剪切、复制和粘贴文本是文本编辑中最基本的任务之一,我们都知道 Vim 有不同的处理方式。 这意味着,在你掌握它之前,你会害怕它,一旦你掌握了它,它就只是一个兔子洞。 虽然我将详细介绍剪切、复制和粘贴,但这里是本教程的基本摘要,以帮助你开始使用: 按键 描述 yiw 复制当前单词。 yy 复制整行。 diw 剪切当前单词。 dd 剪掉整行。 p 粘贴文本。 别担心,Vim 为你提供的选项比我上面提到的要多得多。 在本教程中,我将引导你完成以下内容: 如何在 Vim 中复制文本 如何在 Vim 中剪切文本 如何在 Vim 中粘贴文本 如何使用可视模式在 Vim 中剪切和复制文本 那么让我们从第一个开始。 如何在 Vim 编辑器中复制文本 虽然我们使用术语“复制”,但 Vim 有一个不同的术语,称为 “扽出yank”,因此从现在开始,我将使用“扽出”而不是“复制”。 正如我之前提到的,你可以使用多种方法在 Vim 中扽出文本,以下是一些有用的方法: 命令 描述 nyy或nY 扽出(复制)当前行和接下来的 n-1行。例如,3yy复制当前行及其下面的两行。 yaw 扽出(复制)光标所在的当前单词。 yy或Y 扽出(复制)整个当前行。 y$ 扽出(复制)从光标到行尾的文本。 y^或y0 扽出(复制)从光标到行首的文本。 要在 Vim 中扽出,请执行以下 3 个简单步骤: 按 Esc键切换到正常模式 移动到要复制的行或单词 按上表中的相关命令,你的文本将被复制 想学习交互式复制行的方式吗? 跳到本教程的最后一部分。 如何在 Vim 编辑器中剪切文本 在 Vim 中,你没有任何删除文本的选项。取而代之的是剪切文本,因此删除和剪切文本与 Vim 中的操作类似。 要在 Vim 中剪切文本,请按 d命令。但你永远不会在没有任何选项的情况下使用d命令。你总是会添加一些东西来做更多操作。 因此,你可以使用以下一些实用方法使用 d命令剪切文本: 命令 描述 dd 剪切整个当前行。 d$ 将文本从光标剪切到行尾。 d^或d0 将文本从光标剪切到行首。 ndd或dN 剪切当前行和接下来的 n-1行。例如,3dd剪切当前行及其下面的两行。 daw 剪切光标所在的当前单词。 假设我想从文件中剪切前 4 行,然后我需要使用 4dd,我是这样做的: 如何在 Vim 编辑器中粘贴文本 在 Vim 中复制或剪切文本后,只需按 p键即可粘贴它。 你可以多次按 p键多次粘贴文本,也可以使用np,其中n是要粘贴文本的次数。 例如,在这里,我粘贴了之前复制了三遍的行: 就是这么简单! 如何通过选择文本来剪切和复制文本 如果你使用过 GUI 文本编辑器,那么你肯定习惯于通过选择文本来复制和剪切文本。 让我们从如何通过在 Vim 中选择文本来复制开始。 通过选择文本复制 要在可视模式下复制文本,请执行以下 3 个简单步骤: 移动到要开始选择的地方 按 Ctrl + v启用可视模式 使用箭头键进行选择 按 y键复制所选文本 例如,在这里,我使用可视模式复制了 4 行: 如果你注意到,当我按下 y键,它就会显示有多少行被扽出(复制)。就我而言,有 4 行被复制。 在 Vim 中选择文本来剪切文本 要在 Vim 中以可视模式剪切文本,你所要做的就是遵循 4 个简单步骤: 移动到要剪切的位置 按 Ctrl + v切换到可视模式 使用箭头键选择要剪切的行 按 d键剪切选定的行 假设我想剪掉 4 行,那么我会这样做: 挺容易。是吧? ...

    2023-11-07 技术教程 53
  • 什么是端口,作用及范围

    在计算机网络中,数据通过网络传输,每个数据包都需要知道如何正确到达目的地。 为了实现这一目标,网络使用IP地址和端口号来定位目标设备上的特定应用程序或服务。 IP地址用于定位设备,而端口号用于定位设备上的特定应用程序或服务。 每个设备都有许多不同的端口,用于处理不同类型的数据流。 例如,Web服务器通常使用端口80来处理HTTP请求,而安全的Web服务器使用端口443来处理HTTPS请求。 电子邮件服务器使用端口25来接收传入的电子邮件,而端口110用于接收传出的电子邮件。 这些端口号是被广泛接受和约定的,以便不同设备和应用程序之间能够正确地通信。 端口的作用 端口的主要作用是将数据包正确地路由到目标应用程序或服务。当数据包到达设备时,操作系统使用目标端口号来确定将数据包传递给哪个应用程序或服务。这样,多个应用程序可以在同一设备上并行运行,而不会互相干扰。 此外,端口还可以用于实现安全性和访问控制。防火墙和路由器可以配置为允许或阻止特定端口上的数据流量,从而保护网络免受潜在的威胁。这是网络安全的一个重要方面。 端口号的范围 如前所述,端口号是一个16位的整数,范围从0到65535。 这个范围被划分为三个主要部分:   熟知端口(Well-Known Ports):端口号范围从0到1023。这些端口号已被互联网指定为特定的应用程序或服务,因此它们具有广泛的公认含义。例如,端口80用于HTTP服务,端口25用于SMTP服务,等等。 注册端口(Registered Ports):端口号范围从1024到49151。这些端口号通常由软件开发者或组织用于特定应用程序或服务。它们没有被广泛接受,但可以在需要时注册。 动态和私有端口(Dynamic and Private Ports):端口号范围从49152到65535。这些端口号通常用于动态分配,例如客户端应用程序用于与服务器通信时可以随机选择一个空闲的端口。 ...

    2023-11-07 值得一看 51
  • 什么是SYN FLOOD洪水攻击,原理是什么?

    同Tear Drop泪滴攻击一样,SYN Flood也是一种拒绝服务攻击,其目标是通过发送大量伪造的TCP连接请求(SYN包)来消耗目标系统的资源,从而使得被攻击方资源耗尽而无法响应合法的连接请求的攻击方式。 SYN FLOOD攻击原理 SYN FLOOD攻击发生在OSI参考模型的传输层,它的攻击原理是利用TCP协议的三次握手过程协议缺陷来实现的。 正常情况下,客户端和服务器建立TCP连接三次握手过程是这样的:   1)建立连接时,客户端发送一个SYN同步报文给服务器端,该报文中包含了本端的初始化序列号,同时设置本段的连接状态为SYN-SENT。 2)服务器端收到SYN同步报文后,给客户端回应SYN+ACK 报文,该报文中包含本段的初始化序列号。同时设置本端连接状态为SYN-RCVD。 3)客户端收到服务器端的SYN+ACK后,向服务器端发送ACK报文进行确认,此包发送完毕,客户端和服务器进入ESTABLISHED状态。 三次握手的完成标志着一个TCP连接的成功建立。 但是,当客户端向服务器端发送SYN包后,对服务器端回应的SYN+ACK包不进行处理,会出现什么结果呢,如下图? 服务器端发送完SYN+ACK 报文后,会建立一个半连接状态的socket套接口,同时会启动一个定时器,若在超时时间内未收到客户端回应的ACK报文,服务器端将会进行超时重传SYN+ACK报文给客户端,默认重传次数为5次。 第1次重传:1秒 第2次重传:2秒 第3次重传:4秒 第4次重传:8秒 第5次重传:16秒 第5次重传后还要等待32秒,若仍收不到 ACK 报文,才会关闭连接。 这样等等待时间=(1+2+4+8+16)+32=63秒,也就是大于1分钟的时间。 这样,若客户端不停的发送SYN报文并对服务端回应的报文不回答,就会导致服务器端不停的创建半连接状态的**socket **而耗尽资源,从而服务器端无法处理正常的客户端的连接请求,造成拒绝服务攻击,即SYN FLOOD洪水攻击。 SYN FLOOD攻击的特点 攻击手段简单:SYN FLOOD攻击是一种常见的DoS攻击手段。 防不胜防:SYN FLOOD是一种难以防范的攻击方式,因为其攻击行为在某些情况下很难被察觉和区分。例如,一个SYN FLOOD攻击可能会伪造合法的IP地址,使得攻击行为看起来像是来自正常的网络流量。这使得防火墙、IDS等安全设备很难对其进行有效的检测和拦截。 攻击效果显著:SYN FLOOD攻击能够快速地使目标系统资源耗尽,导致其无法响应合法的连接请求。这使得攻击者能够成功地实施DoS攻击,使目标网站或服务完全瘫痪。 危害范围广泛:SYN FLOOD攻击不仅能够对主机进行攻击,还能够危害路由器、防火墙等网络系统。事实上,只要目标系统打开TCP服务,SYN FLOOD攻击就能够对其实施攻击。 ...

    2023-11-07 值得一看 52
  • MySQL常见的三种存储引擎是什么

    MyISAM MyISAM表是独立于操作系统的,这说明可以轻松地将其从Windows服务器移植到Linux服务器; 每当我们建立一个MyISAM引擎的表时,就会在本地磁盘上建立三个文件,文件名就是表明。 例如,我建立了一个MyISAM引擎的tb_Demo表,那么就会生成以下三个文件: tb_demo.frm,存储表定义; tb_demo.MYD,存储数据; tb_demo.MYI,存储索引。 MyISAM表无法处理事务,这就意味着有事务处理需求的表,不能使用MyISAM存储引擎。 MyISAM存储引擎特别适合在以下几种情况下使用: 选择密集型的表。MyISAM存储引擎在筛选大量数据时非常迅速,这是它最突出的优点。 插入密集型的表。MyISAM的并发插入特性允许同时选择和插入数据。例如:MyISAM存储引擎很适合管理邮件或Web服务器日志数据。 InnoDB InnoDB是一个健壮的事务型存储引擎,这种存储引擎已经被很多互联网公司使用,为用户操作非常大的数据存储提供了一个强大的解决方案。 我的电脑上安装的MySQL 5.6.13版,InnoDB就是作为默认的存储引擎。 InnoDB还引入了行级锁定和外键约束,在以下场合下,使用InnoDB是最理想的选择: 更新密集的表。InnoDB存储引擎特别适合处理多重并发的更新请求。 事务。InnoDB存储引擎是支持事务的标准MySQL存储引擎。 自动灾难恢复。与其它存储引擎不同,InnoDB表能够自动从灾难中恢复。 外键约束。MySQL支持外键的存储引擎只有InnoDB。 支持自动增加列AUTO_INCREMENT属性。 一般来说,如果需要事务支持,并且有较高的并发读取频率,InnoDB是不错的选择。 MEMORY 使用MySQL Memory存储引擎的出发点是速度。 为得到最快的响应时间,采用的逻辑存储介质是系统内存。 虽然在内存中存储表数据确实会提供很高的性能,但当mysqld守护进程崩溃时,所有的Memory数据都会丢失。 获得速度的同时也带来了一些缺陷。它要求存储在Memory数据表里的数据使用的是长度不变的格式,这意味着不能使用BLOB和TEXT这样的长度可变的数据类型,VARCHAR是一种长度可变的类型,但因为它在MySQL内部当做长度固定不变的CHAR类型,所以可以使用。 一般在以下几种情况下使用Memory存储引擎: 目标数据较小,而且被非常频繁地访问。在内存中存放数据,所以会造成内存的使用,可以通过参数max_heap_table_size控制Memory表的大小,设置此参数,就可以限制Memory表的最大大小。 如果数据是临时的,而且要求必须立即可用,那么就可以存放在内存表中。 存储在Memory表中的数据如果突然丢失,不会对应用服务产生实质的负面影响。 Memory同时支持散列索引和B树索引。 B树索引的优于散列索引的是,可以使用部分查询和通配查询,也可以使用<、>和>=等操作符方便数据挖掘。 散列索引进行“相等比较”非常快,但是对“范围比较”的速度就慢多了,因此散列索引值适合使用在=和<>的操作符中,不适合在<或>操作符中,也同样不适合用在order by子句中。 ...

    2023-11-07 值得一看 42
  • Redis主从复制原理详解

    众所周知,一个数据库系统想要实现高可用,主要从以下两个方面来考虑: 保证数据安全不丢失 系统可以正常提供服务 而 Redis 作为一个提供高效缓存服务的数据库,也不例外。 上期我们提到的 Redis 持久化策略,其实就是为了减少服务宕机后数据丢失,以及快速恢复数据,也算是支持高可用的一种实现。 除此之外,Redis 还提供了其它几种方式来保证系统高可用,业务中最常用的莫过于主从同步(也称作主从复制)、Sentinel 哨兵机制以及 Cluster 集群。 同时,这也是面试中出现频率最高的几个主题,这期我们先来讲讲 Redis 的主从复制。 2. 主从复制简介 Redis 同时支持主从复制和读写分离:一个 Redis 实例作为主节点 Master,负责写操作。 其它实例(可能有 1 或多个)作为从节点 Slave,负责复制主节点的数据。 2.1 架构组件 主节点Master 数据更新:Master 负责处理所有的写操作,包括写入、更新和删除等。 数据同步:写操作在 Master 上执行,然后 Master 将写操作的结果同步到所有从节点 Slave 上。 从节点Slave 数据读取:Slave 负责处理读操作,例如获取数据、查询等。 数据同步:Slave 从 Master 复制数据,并在本地保存一份与主节点相同的数据副本。 2.2 为什么要读写分离 1)防止并发 从上图我们可以看出,数据是由主节点向从节点单向复制的,如果主、从节点都可以写入数据的话,那么数据的一致性如何保证呢? 有聪明的小伙伴可能已经想到了,那就是加锁! 但是主、从节点分布在不同的服务器上,数据跨节点同步时又会出现分布式一致性的问题。而在高频并发的场景下,解决加锁后往往又会带来其它的分布式问题,例如写入效率低、吞吐量大幅下降等。 而对于 Redis 这样一个高效缓存数据库来说,性能降低是难以忍受的,所以加锁不是一个优秀的方案。 那如果不加锁,使用最终一致性方式呢? 这样 Redis 在主、从库读到的数据又可能会不一致,带来业务上的挑战,用户也是难以接受的。 业务为用户服务,技术为业务服务。 所以,为了权衡数据的并发问题和用户体验,我们只允许在主节点上写入数据,从节点上读取数据。 2)易于扩展 我们都知道,大部分使用 Redis 的业务都是读多写少的。所以,我们可以根据业务量的规模来确定挂载几个从节点 Slave,当缓存数据增大时,我们可以很方便的扩展从节点的数量,实现弹性扩展。 同时,读写分离还可以实现数据备份和负载均衡,从而提高可靠性和性能。 3)高可用保障 不仅如此,Redis 还可以手动切换主从节点,来做故障隔离和恢复。这样,无论主节点或者从节点宕机,其他节点依然可以保证服务的正常运行。 3. 主从复制实现 3.1 开启主从复制 要开启主从复制,我们需要用到 replicaof 命令。 当我们确定好主节点的 IP 地址和端口号,在从库执行 replicaof <masterIP> <masterPort> 这个命令,就可以开启主从复制。 注意,在 Redis5.0 之前,该命令为 slaveof 开启主从复制后,应用层采用读写分离,所有的写操作在主节点进行,所有读操作在从节点进行。 主从节点会保持数据的最终一致性:主库更新数据后,会同步给从库。 3.2 主从复制过程 那主从库同步什么时候开始和结束呢? 是一次性传输还是分批次写入?Redis 主从节点在同步过程中网络中断了,没传输完成的怎么办? 带着这些疑问我们来分析下,首先,Redis 第一次数据同步时分 3 个阶段。 1)建立连接,请求数据同步 主从节点建立连接,从库请求数据同步。 从服务器从 replicaof 配置项中获取主节点的 IP 和 Port,然后进行连接。 连接成功后,从服务器会向主服务器发送 PSYNC 命令,表示要进行同步。同时,命令中包含 runID 和 offset 两个关键字段。 runID:每个 Redis 实例的唯一标识,当主从复制进行时,该值为 Redis 主节点实例的ID。由于首次同步时还不知道主库的实例ID,所以该值第一次为 ? offset:从库数据同步的偏移量,当第一次复制时,该值为 -1,表示全量复制 主服务器收到 PSYNC 命令后,会创建一个专门用于复制的后台线程(replication thread),然后记录从节点的 offset 参数并开始进行 RDB 同步。 2)RDB 同步 主库生成 RDB 文件,同步给从库。 当从服务器连接到主服务器后,主服务器会将自己的数据发送给从服务器,这个过程叫做全量复制。主服务器会执行 bgsave 命令,然后 fork 出一个子进程来遍历自己的数据集并生成一个 RDB 文件,将这个文件发送给从服务器。 在这期间,为了保证 Redis 的高性能,主节点的主进程不会被阻塞,依旧对外提供服务并接收数据写入缓冲区中。 从服务器接收到 RDB 文件后,会清空自身数据,然后加载这个文件,将自己的数据集替换成主服务器的数据集。 3)命令同步 在第一次同步过程中,由于是全量同步,所以用时可能比较长,这期间主库依旧会写入新数据。 但是,在数据同步一开始就生成的 RDB 文件中显然是没有这部分新增数据的,所以第一次数据同步后需要再发送一次这部分新增数据。 这样,主服务器需要在发送完 RDB 文件后,将期间的写操作重新发送给从服务器,以保证从服务器的数据集与主服务器保持一致。 3.3 增量同步 1)命令传播 在完成全量复制后,主从服务器之间会保持一个 TCP 连接,主服务器会将自己的写操作发送给从服务器,从服务器执行这些写操作,从而保持数据一致性,这个过程也称为基于长连接的命令传播(command propagation)。 增量复制的数据是异步复制的,但通过记录写操作,主从服务器之间的数据最终会达到一致状态。 2)网络断开后数据同步 命令传播的过程中,由于网络抖动或故障导致连接断开,此时主节点上新的写命令将无法同步到从库。 即便是抖动瞬间又恢复网络连接,但 TCP 连接已经断开,所以数据需要重新同步。 从 Redis 2.8 开始,从库已支持增量同步,只会把断开的时候没有发生的写命令,同步给从库。 详细过程如下: 网络恢复后,从库携带之前主库返回的 runid,还有复制的偏移量 offset 发送 psync runid offset 命令给主库,请求数据同步; 主库收到命令后,核查 runid 和 offset,确认没问题将响应 continue 命令; 主库发送网络断开期间的写命令,从库接收命令并执行。 这时,有细心的小伙伴可能要问了,网络断开后,主库怎么知道哪些数据是新写入的呢? 这是个好问题,接下来我们详细说明一下。 3)增量复制的关键 Master 在执行写操作时,会将这些命令记录在 repl_backlog_buffer (复制积压缓冲区)里面,并使用 master_repl_offset 记录写入的位置偏移量。 而从库在执行同步的写命令后,也会用 slave_repl_offset 记录写入的位置偏移量。正常情况下,从库会和主库的偏移量保持一致。 但是,当网络断开后,主库继续写入,而从库没有收到新的同步命令,所以偏移量就停止了。所以,master_repl_offset 会大于 slave_repl_offset。 注意:主从库实现增量复制时,都是在 repl_backlog_buffer 缓冲区上进行。 网络断开前后,主从库的同步图如下:   repl_backlog_buffer 复制积压缓冲区是一个环形缓冲区,如果缓冲区慢了(比如超过 1024),则会从头覆盖掉前面的内容。 所以,当网络恢复以后,主节点只需将 master_repl_offset 和 slave_repl_offset 之间的内容同步给从库即可(图中 256~512 这部分数据)。 需要注意的是,主库的积压缓冲区默认为 1M,如果从库网络断开太久,缓冲区之前的内容已经被覆盖,这时主从的数据复制就只能采取全量同步了。 所以我们需要根据业务量和实际情况来设置 repl_backlog_buffer 的值。 4. 小结 面让架构易于扩展,另一方面防止单体故障:当主库挂了,可以立即拉起从库,不至于让业务停滞太久。 而首次主从复制包括建立连接,RDB 同步和命令同步三个阶段。 为了保证同步的效率,除了第一次需要全量同步以外,例如当主从节点断连后,则只需要增量同步,这是由主从库的复制偏移量以及主库的 repl_backlog_buffer 复制积压缓冲区来控制的。 好了,以上就是本文的所有内容了,希望今天的文章能让大家更深入地了解 Redis 主从复制,并在面试或者实际工作中学以致用,探索更多的细节。 ...

    2023-11-07 值得一看 48
  • NTP时间同步过程

    NTP通过时间戳和网络延迟计算来调整本地时钟,以确保系统时钟与NTP服务器的时钟尽可能一致,实现高精度的时间同步。 第一步、NTP客户端发起时间请求 NTP客户端向NTP服务器发起时间请求,请求服务器的准确时间。这个请求通常包括客户端的当前时间戳。 通常,这是通过UDP协议的端口123完成的。NTP客户端可以是计算机、路由器、交换机或其他网络设备。 第二步、NTP服务器响应 NTP服务器收到客户端的请求,并在响应中包括自己的时间戳。服务器的时间通常比客户端的时间更准确。服务器的响应包括四个时间戳:T1、T2、T3、T4。 T1:客户端发送请求的时间。 T2:服务器接收到请求的时间。 T3:服务器发送响应的时间。 T4:客户端接收响应的时间。 NTP服务器可以是Stratum 1服务器(通常是高精度时间源,如原子钟或GPS时钟)或Stratum 2服务器,依次类推。 第三步、计算网络延迟 客户端使用T1、T2、T3、T4时间戳来计算网络延迟和时钟偏移。根据这些时间戳,客户端可以计算出网络延迟,即信号从客户端发送到服务器再返回所需的时间。你在示例中计算了延迟,这在NTP中非常重要,因为网络延迟会对时钟同步产生影响。 第四步、调整本地时钟 客户端使用计算得到的网络延迟和服务器的时间戳来调整自己的本地时钟。这个调整会将客户端的时钟与服务器的时钟对齐,以减小时钟偏移。 ?请记住:时间同步不是一次性事件,而是定期进行的。 客户端设备通常每隔一段时间(通常是每10分钟或每小时)与NTP服务器进行一次时间同步,以确保时钟的准确性。 此后的时间同步交换通常只需要一次消息交换,因为客户端已经与NTP服务器建立了时间校准。 ...

    2023-11-07 值得一看 56

联系我们

在线咨询:点击这里给我发消息

QQ交流群:KirinBlog

工作日:8:00-23:00,节假日休息

扫码关注