resultFindAll = ReUtil.findAll(REGEX_CODE, content, 0, new ArrayList<>());
// size大于0,就做替换
if (resultFindAll.size() > 0) {
- // 生成一个待替换唯一字符串
- String preTagReplace = UUID.randomUUID().toString() + System.currentTimeMillis();
- // 判断替换字符串是否唯一
- while (ReUtil.findAll(preTagReplace, content, 0, new ArrayList<>()).size() > 0) {
- preTagReplace = UUID.randomUUID().toString() + System.currentTimeMillis();
- }
- Pattern pattern = Pattern.compile(preTagReplace);
+ String uniqueUUID = searchUniqueUUID(content);
+
+ // 替换所有$为uniqueUUID
+ content = ReUtil.replaceAll(content, "\\$", uniqueUUID);
+
+ // pre标签替换字符串
+ String replaceStr = uniqueUUID + uniqueUUID;
+
// 替换pre标签内容
- String preFilter = ReUtil.replaceAll(content, regex, preTagReplace);
+ String preFilter = ReUtil.replaceAll(content, REGEX_CODE, replaceStr);
+
// 拦截xss
final String[] filterResult = {replaceHtmlCode(preFilter)};
// 依次将替换后的pre标签换回来
- resultFindAll.forEach(obj -> filterResult[0] = ReUtil.replaceFirst(pattern, filterResult[0], obj));
- return filterResult[0];
+ Pattern pattern = Pattern.compile(replaceStr);
+ resultFindAll.forEach(obj -> {
+ obj = ReUtil.replaceAll(obj, "\\$", uniqueUUID);
+ filterResult[0] = ReUtil.replaceFirst(pattern, filterResult[0], obj);
+ });
+
+ // 将$换回来
+ return ReUtil.replaceAll(filterResult[0], uniqueUUID, "$");
} else {
return replaceHtmlCode(content);
}
}
+ /**
+ * @param content 待查找内容
+ * @return
+ */
+ public static String searchUniqueUUID(String content) {
+ // 生成一个待替换唯一字符串
+ String uniqueUUID = UUID.randomUUID().toString();
+ // 判断替换字符串是否唯一
+ while (ReUtil.findAll(uniqueUUID, content, 0, new ArrayList<>()).size() > 0) {
+ uniqueUUID = UUID.randomUUID().toString();
+ }
+ return uniqueUUID;
+
+ }
+
}
diff --git a/src/test/java/com/rymcu/forest/utils/TestFileMd5.java b/src/test/java/com/rymcu/forest/utils/TestFileMd5.java
index 17fe9f0..5ebd417 100644
--- a/src/test/java/com/rymcu/forest/utils/TestFileMd5.java
+++ b/src/test/java/com/rymcu/forest/utils/TestFileMd5.java
@@ -13,6 +13,9 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
public class TestFileMd5 {
+ /**
+ * 要使用spring注解,则这个类必须要交给spring管理
+ */
@Value("classpath:1.txt")
private Resource testFile;
diff --git a/src/test/java/com/rymcu/forest/utils/TestXssUtils.java b/src/test/java/com/rymcu/forest/utils/TestXssUtils.java
new file mode 100644
index 0000000..cf7a718
--- /dev/null
+++ b/src/test/java/com/rymcu/forest/utils/TestXssUtils.java
@@ -0,0 +1,52 @@
+package com.rymcu.forest.utils;
+
+import com.rymcu.forest.util.XssUtils;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.core.io.Resource;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+
+
+@SpringBootTest(classes = TestXssUtils.class)
+public class TestXssUtils {
+
+ private String content = null;
+ /**
+ * bug文章
+ */
+ @Value("classpath:article/135.txt")
+ private Resource testFile;
+
+ /**
+ * 初始化文章内容
+ */
+ @BeforeEach
+ public void init() {
+ StringBuilder sb = new StringBuilder();
+ try (FileReader fileReader = new FileReader(testFile.getFile());
+ BufferedReader bufferedReader = new BufferedReader(fileReader)) {
+ String s;
+ while ((s = bufferedReader.readLine()) != null) {
+ sb.append(s);
+ }
+ content = sb.toString();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Illegal group reference:参数replacement中出现符号“$”
+ */
+ @Test
+ public void filterHtmlCode() {
+ String aritcle = content;
+ String s = XssUtils.filterHtmlCode(aritcle);
+ System.err.println(s);
+ }
+}
diff --git a/src/test/resources/article/135.txt b/src/test/resources/article/135.txt
new file mode 100644
index 0000000..4f64ee0
--- /dev/null
+++ b/src/test/resources/article/135.txt
@@ -0,0 +1,109 @@
+1.概述
+鉴于好多朋友平常工作电脑为苹果,再配一台 Windows 机器来开发 51 单片机,略显多余。为此,本文详细讲解在 macOS 搭建 51 单片机开发环境。
+软硬件需求:
+
+- macOS 笔记本或台式机
+- 串口转 USB 驱动 CH341
+- 51 内核编译器 sdcc
+- 程序下载工具 stcgal
+- 代码编辑器 visual studio code
+- 51 单片机开发板(选配)
+
+小编使用的 51 单片机开发板为 nebula-Pi,主单片机型号为 STC89C52RC,并且搭载了 CH340C 串口转 USB 芯片,通过该串口实现程序的下载。
+2.串口转 USB 驱动 CH341 安装
+单片机开发板与 PC 之间通过 USB 线连接,需安装 CH340C 的 USB 转串口 macOS 驱动程序。下载地址,直接点下载就好。解压下载好的文件,双击运行目录里面的 ch34xInstall.pkg,根据提示一直点击下一步,最后重启电脑。
+重启电脑后,将 51 单片机开发板连接至 PC,在命令行终端输入下列代码:
+ls /dev/tty.wchusbser*
+
+如果出现:
+/dev/tty.wchusbserial14a0
+
+表示驱动安装成功!其中 14a0 代表你的串口号,每台 PC 或插在不同的 USB 口,这个号略有差异,后续下载程序将会使用到。
+3.程序下载工具 stcgal 安装
+stcgal 是 STC 单片机的下载工具,安装前需确保已提前安装好 python3。
+3.1 安装 python3
+macOS 自带 python2.7,到官网下载 python3 的 macOS 版本,并安装。 安装完毕 python3 以后,敲入命令获得安装路径:
+which python3
+
+我的安装路径为:
+/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7
+
+将这个路径配入环境变量:
+vim ~/.bash_profile
+
+在文件的最后一行输入下面代码,保存并重启电脑:
+alias python="/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7"
+
+命令行敲入:
+python
+
+输出如下信息表明 python3 环境配置成功:
+Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 26 2018, 23:26:24)
+[Clang 6.0 (clang-600.0.57)] on darwin
+Type "help", "copyright", "credits" or "license" for more information.
+
+3.2 下载安装 stcgal
+下载地址,下载后并解压。在终端命令行中 cd 切换路径到解压文件。终端输入下面两条命令开始安装:
+./setup.py build
+sudo ./setup.py install
+
+可输入如下命令查看 stcgal 版本信息:
+stcgal --version
+
+到这里,STC 单片机在 macOS 下的程序下载工具 stcgal 就安装完成了。
+4.内核编译器 sdcc 安装
+sdcc 可通过命令行直接安装:
+brew install sdcc
+
+该命令使用了 brew,因此需提前安装 homebrew,官方网站安装需要科学上网,我们使用国内镜像可实现光速安装,命令如下:
+/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
+
+安装完成后,查看 sdcc 版本信息:
+sdcc --version
+
+运行结果如下:
+SDCC : mcs51/z80/z180/r2k/r3ka/gbz80/tlcs90/ez80_z80/ds390/pic16/pic14/TININative/ds400/hc08/s08/stm8/pdk13/pdk14/pdk15 4.0.0 #11528 (Mac OS X x86_64)
+published under GNU General Public License (GPL)
+
+到这里 sdcc 安装也告一段落了。
+4.代码编辑器 visual studio code 安装
+命令行代码安装如下:
+brew cask install visual-studio-code
+
+安装完成启动软件,按下图所示搜索,并安装 platformIO IDE 插件:
+
+按下图所示,搜索嵌入式平台 Intel MCS-51 ,并点击进入 install。
+
+到这里,代码编辑环境准备就绪了。
+5.新建工程
+step1: 新建项目流程如下所示:
+
+step2: 设置项目名称,选用 Generic STC89C52RC 平台。
+
+step3: 编辑代码
+step3.1 添加符合 sdcc 编译器要求的头文件,需要打开工程目录将头文件添加至 include 文件夹下,头文件下载链接如下:
+https://pan.baidu.com/s/1wSZKHhlElO6w2nwQIMfXuQ 密码: in94
+step3.2 src 文件夹下添加.c 格式文件如下图 2,3 所示,并编辑代码如下:
+#include"8051.h"
+#define LED0 P1_0
+
+void main()
+{
+ LED0 = 0;//点亮 LED0
+}
+
+step3.3 指定下载串口,打开 platformio.ini 文件,添加如下代码,如下图 5 所示:
+upload_port = /dev/cu.wchusbserial14a0
+
+注意: 代码中的串口号就是安装 USB 串口驱动时的串口号,正常情况下,在下载时软件会自动寻找并打开串口,但有时打开不正确,造成下载不成功,因此,我们在这里指定好固定的串口。
+具体流程如下图所示,其中,6,7 所示为编译和下载按钮。
+
+step4 按上图的 6 编译按钮开始编译,结果如下:
+
+step5 按上图 7 下载按钮,并给开发板上电,下载过程如下图所示。
+
+到这里便完成了 51 单片机的开发环境的搭建,并完成了一个小的试验项目。
+6 其他重要事项
+大家是否注意到我们在新建工程的 step2: 选用 Generic STC89C52RC 平台,如果我们板子的平台不在可选之列怎么办?例如单片机 STC12C5A60S2。此时,我们需要自行建立板子平台模版,具体操作方法请参考: RY-Teach STC12C5A60S2 Mac 环境搭建 。
+7 总结
+本文详细介绍了 基于 visual studio + platformIO + stcgal + sdcc 的 51 单片机开发环境搭建。
From 036dff6affc779da9ce95c171702faf7a5b5b7d8 Mon Sep 17 00:00:00 2001
From: ronger
Date: Thu, 26 May 2022 13:45:39 +0800
Subject: [PATCH 2/5] Delete TestFileMd5.java
---
.../com/rymcu/forest/utils/TestFileMd5.java | 33 -------------------
1 file changed, 33 deletions(-)
delete mode 100644 src/test/java/com/rymcu/forest/utils/TestFileMd5.java
diff --git a/src/test/java/com/rymcu/forest/utils/TestFileMd5.java b/src/test/java/com/rymcu/forest/utils/TestFileMd5.java
deleted file mode 100644
index 5ebd417..0000000
--- a/src/test/java/com/rymcu/forest/utils/TestFileMd5.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.rymcu.forest.utils;
-
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.core.io.Resource;
-import org.springframework.util.DigestUtils;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-// 仅运行指定类
-@SpringBootTest(classes = TestFileMd5.class)
-public class TestFileMd5 {
-
-
- /**
- * 要使用spring注解,则这个类必须要交给spring管理
- */
- @Value("classpath:1.txt")
- private Resource testFile;
-
- /**
- * c6c26c7e8a5eb493b14e84bd91df60e3
- * d41d8cd98f00b204e9800998ecf8427e
- *
- * @throws Exception
- */
- @Test
- public void test() throws Exception {
- String md5 = DigestUtils.md5DigestAsHex(testFile.getInputStream());
- assertEquals("202cb962ac59075b964b07152d234b70", md5);
- }
-}
From 1f8b389ebc50fd8a32425652c88b326e193d4b0c Mon Sep 17 00:00:00 2001
From: ronger
Date: Thu, 26 May 2022 13:45:57 +0800
Subject: [PATCH 3/5] Delete TestXssUtils.java
---
.../com/rymcu/forest/utils/TestXssUtils.java | 52 -------------------
1 file changed, 52 deletions(-)
delete mode 100644 src/test/java/com/rymcu/forest/utils/TestXssUtils.java
diff --git a/src/test/java/com/rymcu/forest/utils/TestXssUtils.java b/src/test/java/com/rymcu/forest/utils/TestXssUtils.java
deleted file mode 100644
index cf7a718..0000000
--- a/src/test/java/com/rymcu/forest/utils/TestXssUtils.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package com.rymcu.forest.utils;
-
-import com.rymcu.forest.util.XssUtils;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.core.io.Resource;
-
-import java.io.BufferedReader;
-import java.io.FileReader;
-import java.io.IOException;
-
-
-@SpringBootTest(classes = TestXssUtils.class)
-public class TestXssUtils {
-
- private String content = null;
- /**
- * bug文章
- */
- @Value("classpath:article/135.txt")
- private Resource testFile;
-
- /**
- * 初始化文章内容
- */
- @BeforeEach
- public void init() {
- StringBuilder sb = new StringBuilder();
- try (FileReader fileReader = new FileReader(testFile.getFile());
- BufferedReader bufferedReader = new BufferedReader(fileReader)) {
- String s;
- while ((s = bufferedReader.readLine()) != null) {
- sb.append(s);
- }
- content = sb.toString();
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- /**
- * Illegal group reference:参数replacement中出现符号“$”
- */
- @Test
- public void filterHtmlCode() {
- String aritcle = content;
- String s = XssUtils.filterHtmlCode(aritcle);
- System.err.println(s);
- }
-}
From 60b2d14bfa03fdb7206944de78ebc40141df834e Mon Sep 17 00:00:00 2001
From: ronger
Date: Thu, 26 May 2022 13:46:10 +0800
Subject: [PATCH 4/5] Delete 135.txt
---
src/test/resources/article/135.txt | 109 -----------------------------
1 file changed, 109 deletions(-)
delete mode 100644 src/test/resources/article/135.txt
diff --git a/src/test/resources/article/135.txt b/src/test/resources/article/135.txt
deleted file mode 100644
index 4f64ee0..0000000
--- a/src/test/resources/article/135.txt
+++ /dev/null
@@ -1,109 +0,0 @@
-1.概述
-鉴于好多朋友平常工作电脑为苹果,再配一台 Windows 机器来开发 51 单片机,略显多余。为此,本文详细讲解在 macOS 搭建 51 单片机开发环境。
-软硬件需求:
-
-- macOS 笔记本或台式机
-- 串口转 USB 驱动 CH341
-- 51 内核编译器 sdcc
-- 程序下载工具 stcgal
-- 代码编辑器 visual studio code
-- 51 单片机开发板(选配)
-
-小编使用的 51 单片机开发板为 nebula-Pi,主单片机型号为 STC89C52RC,并且搭载了 CH340C 串口转 USB 芯片,通过该串口实现程序的下载。
-2.串口转 USB 驱动 CH341 安装
-单片机开发板与 PC 之间通过 USB 线连接,需安装 CH340C 的 USB 转串口 macOS 驱动程序。下载地址,直接点下载就好。解压下载好的文件,双击运行目录里面的 ch34xInstall.pkg,根据提示一直点击下一步,最后重启电脑。
-重启电脑后,将 51 单片机开发板连接至 PC,在命令行终端输入下列代码:
-ls /dev/tty.wchusbser*
-
-如果出现:
-/dev/tty.wchusbserial14a0
-
-表示驱动安装成功!其中 14a0 代表你的串口号,每台 PC 或插在不同的 USB 口,这个号略有差异,后续下载程序将会使用到。
-3.程序下载工具 stcgal 安装
-stcgal 是 STC 单片机的下载工具,安装前需确保已提前安装好 python3。
-3.1 安装 python3
-macOS 自带 python2.7,到官网下载 python3 的 macOS 版本,并安装。 安装完毕 python3 以后,敲入命令获得安装路径:
-which python3
-
-我的安装路径为:
-/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7
-
-将这个路径配入环境变量:
-vim ~/.bash_profile
-
-在文件的最后一行输入下面代码,保存并重启电脑:
-alias python="/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7"
-
-命令行敲入:
-python
-
-输出如下信息表明 python3 环境配置成功:
-Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 26 2018, 23:26:24)
-[Clang 6.0 (clang-600.0.57)] on darwin
-Type "help", "copyright", "credits" or "license" for more information.
-
-3.2 下载安装 stcgal
-下载地址,下载后并解压。在终端命令行中 cd 切换路径到解压文件。终端输入下面两条命令开始安装:
-./setup.py build
-sudo ./setup.py install
-
-可输入如下命令查看 stcgal 版本信息:
-stcgal --version
-
-到这里,STC 单片机在 macOS 下的程序下载工具 stcgal 就安装完成了。
-4.内核编译器 sdcc 安装
-sdcc 可通过命令行直接安装:
-brew install sdcc
-
-该命令使用了 brew,因此需提前安装 homebrew,官方网站安装需要科学上网,我们使用国内镜像可实现光速安装,命令如下:
-/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
-
-安装完成后,查看 sdcc 版本信息:
-sdcc --version
-
-运行结果如下:
-SDCC : mcs51/z80/z180/r2k/r3ka/gbz80/tlcs90/ez80_z80/ds390/pic16/pic14/TININative/ds400/hc08/s08/stm8/pdk13/pdk14/pdk15 4.0.0 #11528 (Mac OS X x86_64)
-published under GNU General Public License (GPL)
-
-到这里 sdcc 安装也告一段落了。
-4.代码编辑器 visual studio code 安装
-命令行代码安装如下:
-brew cask install visual-studio-code
-
-安装完成启动软件,按下图所示搜索,并安装 platformIO IDE 插件:
-
-按下图所示,搜索嵌入式平台 Intel MCS-51 ,并点击进入 install。
-
-到这里,代码编辑环境准备就绪了。
-5.新建工程
-step1: 新建项目流程如下所示:
-
-step2: 设置项目名称,选用 Generic STC89C52RC 平台。
-
-step3: 编辑代码
-step3.1 添加符合 sdcc 编译器要求的头文件,需要打开工程目录将头文件添加至 include 文件夹下,头文件下载链接如下:
-https://pan.baidu.com/s/1wSZKHhlElO6w2nwQIMfXuQ 密码: in94
-step3.2 src 文件夹下添加.c 格式文件如下图 2,3 所示,并编辑代码如下:
-#include"8051.h"
-#define LED0 P1_0
-
-void main()
-{
- LED0 = 0;//点亮 LED0
-}
-
-step3.3 指定下载串口,打开 platformio.ini 文件,添加如下代码,如下图 5 所示:
-upload_port = /dev/cu.wchusbserial14a0
-
-注意: 代码中的串口号就是安装 USB 串口驱动时的串口号,正常情况下,在下载时软件会自动寻找并打开串口,但有时打开不正确,造成下载不成功,因此,我们在这里指定好固定的串口。
-具体流程如下图所示,其中,6,7 所示为编译和下载按钮。
-
-step4 按上图的 6 编译按钮开始编译,结果如下:
-
-step5 按上图 7 下载按钮,并给开发板上电,下载过程如下图所示。
-
-到这里便完成了 51 单片机的开发环境的搭建,并完成了一个小的试验项目。
-6 其他重要事项
-大家是否注意到我们在新建工程的 step2: 选用 Generic STC89C52RC 平台,如果我们板子的平台不在可选之列怎么办?例如单片机 STC12C5A60S2。此时,我们需要自行建立板子平台模版,具体操作方法请参考: RY-Teach STC12C5A60S2 Mac 环境搭建 。
-7 总结
-本文详细介绍了 基于 visual studio + platformIO + stcgal + sdcc 的 51 单片机开发环境搭建。
From 7119ab629dc75851b09d2b7fd1d1f141cc24f151 Mon Sep 17 00:00:00 2001
From: ronger
Date: Thu, 26 May 2022 13:50:56 +0800
Subject: [PATCH 5/5] Update XssUtils.java
---
src/main/java/com/rymcu/forest/util/XssUtils.java | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/src/main/java/com/rymcu/forest/util/XssUtils.java b/src/main/java/com/rymcu/forest/util/XssUtils.java
index a8445a9..e102398 100644
--- a/src/main/java/com/rymcu/forest/util/XssUtils.java
+++ b/src/main/java/com/rymcu/forest/util/XssUtils.java
@@ -21,6 +21,7 @@ public class XssUtils {
/**
* 滤除content中的危险 HTML 代码, 主要是脚本代码, 滚动字幕代码以及脚本事件处理代码
+ *
* @param content 需要滤除的字符串
* @return 过滤的结果
*/
@@ -49,8 +50,8 @@ public class XssUtils {
}
public static String filterHtmlCode(String content) {
- if(StringUtils.isBlank(content)) {
- return content;
+ if (StringUtils.isBlank(content)) {
+ return content;
}
// 拿到匹配的pre标签List
List resultFindAll = ReUtil.findAll(REGEX_CODE, content, 0, new ArrayList<>());
@@ -100,5 +101,3 @@ public class XssUtils {
}
}
-
-