From 671d70dfd50d45314699c86c99c190ddfaf2ee8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=A0=E4=B8=80=E4=B8=AA=E4=BA=BA=E5=9C=A8=E8=BF=99?= =?UTF-8?q?=E5=84=BF=E5=B9=B2=E5=98=9B=E4=BD=A0=E6=98=AF=E6=9D=A5=E6=8B=89?= =?UTF-8?q?=E5=B1=8E=E7=9A=84=E5=90=A7?= <1421374934@qq.com> Date: Thu, 26 May 2022 11:38:38 +0800 Subject: [PATCH 1/5] :bug: fixed XssUtils --- .../java/com/rymcu/forest/util/XssUtils.java | 47 ++++++-- .../com/rymcu/forest/utils/TestFileMd5.java | 3 + .../com/rymcu/forest/utils/TestXssUtils.java | 52 +++++++++ src/test/resources/article/135.txt | 109 ++++++++++++++++++ 4 files changed, 199 insertions(+), 12 deletions(-) create mode 100644 src/test/java/com/rymcu/forest/utils/TestXssUtils.java create mode 100644 src/test/resources/article/135.txt diff --git a/src/main/java/com/rymcu/forest/util/XssUtils.java b/src/main/java/com/rymcu/forest/util/XssUtils.java index 6760653..a8445a9 100644 --- a/src/main/java/com/rymcu/forest/util/XssUtils.java +++ b/src/main/java/com/rymcu/forest/util/XssUtils.java @@ -17,7 +17,7 @@ import java.util.regex.Pattern; * @packageName com.rymcu.forest.util */ public class XssUtils { - private static final String regex = "(
[\\s|\\S]+?
)|([\\s|\\S]+?)"; + private static final String REGEX_CODE = "(
[\\s|\\S]+?
)|([\\s|\\S]+?)"; /** * 滤除content中的危险 HTML 代码, 主要是脚本代码, 滚动字幕代码以及脚本事件处理代码 @@ -53,29 +53,52 @@ public class XssUtils { return content; } // 拿到匹配的pre标签List - List resultFindAll = ReUtil.findAll(regex, content, 0, new ArrayList<>()); + List 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 单片机开发环境。

+

软硬件需求:

+ +

小编使用的 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 插件:

+

WeChat0eaa91649c71013ab9d43090d65fa328.png

+

按下图所示,搜索嵌入式平台 Intel MCS-51 ,并点击进入 install。

+

WechatIMG39.jpeg

+

到这里,代码编辑环境准备就绪了。

+

5.新建工程

+

step1: 新建项目流程如下所示:

+

新建项目.jpg
+step2: 设置项目名称,选用 Generic STC89C52RC 平台。

+

选板子.jpg
+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 所示为编译下载按钮。

+

1.jpg
+step4 按上图的 6 编译按钮开始编译,结果如下:

+

success.jpg

+

step5 按上图 7 下载按钮,并给开发板上电,下载过程如下图所示。

+

下载成功.jpg

+

到这里便完成了 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 插件:

-

WeChat0eaa91649c71013ab9d43090d65fa328.png

-

按下图所示,搜索嵌入式平台 Intel MCS-51 ,并点击进入 install。

-

WechatIMG39.jpeg

-

到这里,代码编辑环境准备就绪了。

-

5.新建工程

-

step1: 新建项目流程如下所示:

-

新建项目.jpg
-step2: 设置项目名称,选用 Generic STC89C52RC 平台。

-

选板子.jpg
-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 所示为编译下载按钮。

-

1.jpg
-step4 按上图的 6 编译按钮开始编译,结果如下:

-

success.jpg

-

step5 按上图 7 下载按钮,并给开发板上电,下载过程如下图所示。

-

下载成功.jpg

-

到这里便完成了 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 { } } - -