🐛 fixed XssUtils

This commit is contained in:
你一个人在这儿干嘛你是来拉屎的吧 2022-05-26 11:38:38 +08:00
parent 5b53760d4c
commit 671d70dfd5
4 changed files with 199 additions and 12 deletions

View File

@ -17,7 +17,7 @@ import java.util.regex.Pattern;
* @packageName com.rymcu.forest.util * @packageName com.rymcu.forest.util
*/ */
public class XssUtils { public class XssUtils {
private static final String regex = "(<pre>[\\s|\\S]+?</pre>)|(<code>[\\s|\\S]+?</code>)"; private static final String REGEX_CODE = "(<pre>[\\s|\\S]+?</pre>)|(<code>[\\s|\\S]+?</code>)";
/** /**
* 滤除content中的危险 HTML 代码, 主要是脚本代码, 滚动字幕代码以及脚本事件处理代码 * 滤除content中的危险 HTML 代码, 主要是脚本代码, 滚动字幕代码以及脚本事件处理代码
@ -53,29 +53,52 @@ public class XssUtils {
return content; return content;
} }
// 拿到匹配的pre标签List // 拿到匹配的pre标签List
List<String> resultFindAll = ReUtil.findAll(regex, content, 0, new ArrayList<>()); List<String> resultFindAll = ReUtil.findAll(REGEX_CODE, content, 0, new ArrayList<>());
// size大于0就做替换 // size大于0就做替换
if (resultFindAll.size() > 0) { if (resultFindAll.size() > 0) {
// 生成一个待替换唯一字符串 String uniqueUUID = searchUniqueUUID(content);
String preTagReplace = UUID.randomUUID().toString() + System.currentTimeMillis();
// 判断替换字符串是否唯一 // 替换所有$为uniqueUUID
while (ReUtil.findAll(preTagReplace, content, 0, new ArrayList<>()).size() > 0) { content = ReUtil.replaceAll(content, "\\$", uniqueUUID);
preTagReplace = UUID.randomUUID().toString() + System.currentTimeMillis();
} // pre标签替换字符串
Pattern pattern = Pattern.compile(preTagReplace); String replaceStr = uniqueUUID + uniqueUUID;
// 替换pre标签内容 // 替换pre标签内容
String preFilter = ReUtil.replaceAll(content, regex, preTagReplace); String preFilter = ReUtil.replaceAll(content, REGEX_CODE, replaceStr);
// 拦截xss // 拦截xss
final String[] filterResult = {replaceHtmlCode(preFilter)}; final String[] filterResult = {replaceHtmlCode(preFilter)};
// 依次将替换后的pre标签换回来 // 依次将替换后的pre标签换回来
resultFindAll.forEach(obj -> filterResult[0] = ReUtil.replaceFirst(pattern, filterResult[0], obj)); Pattern pattern = Pattern.compile(replaceStr);
return filterResult[0]; resultFindAll.forEach(obj -> {
obj = ReUtil.replaceAll(obj, "\\$", uniqueUUID);
filterResult[0] = ReUtil.replaceFirst(pattern, filterResult[0], obj);
});
// 将$换回来
return ReUtil.replaceAll(filterResult[0], uniqueUUID, "$");
} else { } else {
return replaceHtmlCode(content); 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;
}
} }

View File

@ -13,6 +13,9 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
public class TestFileMd5 { public class TestFileMd5 {
/**
* 要使用spring注解则这个类必须要交给spring管理
*/
@Value("classpath:1.txt") @Value("classpath:1.txt")
private Resource testFile; private Resource testFile;

View File

@ -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);
}
}

View File

@ -0,0 +1,109 @@
<h2 id="1-概述">1.概述</h2>
<p>鉴于好多朋友平常工作电脑为苹果,再配一台 Windows 机器来开发 51 单片机,略显多余。为此,本文详细讲解在 macOS 搭建 51 单片机开发环境。</p>
<h4 id="软硬件需求-">软硬件需求:</h4>
<ul>
<li>macOS 笔记本或台式机</li>
<li>串口转 USB 驱动 CH341</li>
<li>51 内核编译器 sdcc</li>
<li>程序下载工具 stcgal</li>
<li>代码编辑器 visual studio code</li>
<li>51 单片机开发板(选配)</li>
</ul>
<p>小编使用的 51 单片机开发板为 nebula-Pi主单片机型号为 STC89C52RC并且搭载了 CH340C 串口转 USB 芯片,通过该串口实现程序的下载。</p>
<h2 id="2-串口转-USB-驱动-CH341-安装">2.串口转 USB 驱动 CH341 安装</h2>
<p>单片机开发板与 PC 之间通过 USB 线连接,需安装 CH340C 的 USB 转串口 macOS 驱动程序。<a href="http://www.wch.cn/download/CH341SER_MAC_ZIP.html">下载地址</a>,直接点下载就好。解压下载好的文件,双击运行目录里面的 ch34xInstall.pkg根据提示一直点击下一步最后重启电脑。</p>
<p>重启电脑后,将 51 单片机开发板连接至 PC在命令行终端输入下列代码</p>
<pre><code>ls /dev/tty.wchusbser*
</code></pre>
<p>如果出现:</p>
<pre><code>/dev/tty.wchusbserial14a0
</code></pre>
<p>表示驱动安装成功!其中 14a0 代表你的串口号,每台 PC 或插在不同的 USB 口,这个号略有差异,后续下载程序将会使用到。</p>
<h2 id="3-程序下载工具-stcgal-安装">3.程序下载工具 stcgal 安装</h2>
<p>stcgal 是 STC 单片机的下载工具,安装前需确保已提前安装好 python3。</p>
<h3 id="3-1-安装-python3">3.1 安装 python3</h3>
<p>macOS 自带 python2.7,到官网下载 python3 的 macOS 版本,并安装。 安装完毕 python3 以后,敲入命令获得安装路径:</p>
<pre><code class="language-c">which python3
</code></pre>
<p>我的安装路径为:</p>
<pre><code class="language-c">/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7
</code></pre>
<p>将这个路径配入环境变量:</p>
<pre><code class="language-c">vim ~/.bash_profile
</code></pre>
<p>在文件的最后一行输入下面代码,保存并重启电脑:</p>
<pre><code class="language-c">alias python=&quot;/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7&quot;
</code></pre>
<p>命令行敲入:</p>
<pre><code class="language-c">python
</code></pre>
<p>输出如下信息表明 python3 环境配置成功:</p>
<pre><code class="language-c">Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 26 2018, 23:26:24)
[Clang 6.0 (clang-600.0.57)] on darwin
Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.
</code></pre>
<h3 id="3-2-下载安装-stcgal">3.2 下载安装 stcgal</h3>
<p><a href="https://github.com/grigorig/stcgal">下载地址</a>,下载后并解压。在终端命令行中 cd 切换路径到解压文件。终端输入下面两条命令开始安装:</p>
<pre><code>./setup.py build
sudo ./setup.py install
</code></pre>
<p>可输入如下命令查看 stcgal 版本信息:</p>
<pre><code class="language-c">stcgal --version
</code></pre>
<p>到这里STC 单片机在 macOS 下的程序下载工具 stcgal 就安装完成了。</p>
<h2 id="4-内核编译器-sdcc-安装">4.内核编译器 sdcc 安装</h2>
<p>sdcc 可通过命令行直接安装:</p>
<pre><code class="language-c">brew install sdcc
</code></pre>
<p>该命令使用了 brew因此需提前安装 homebrew官方网站安装需要科学上网我们使用国内镜像可实现光速安装命令如下</p>
<pre><code class="language-c">/bin/zsh -c &quot;$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)&quot;
</code></pre>
<p>安装完成后,查看 sdcc 版本信息:</p>
<pre><code class="language-c">sdcc --version
</code></pre>
<p>运行结果如下:</p>
<pre><code class="language-c">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)
</code></pre>
<p>到这里 sdcc 安装也告一段落了。</p>
<h2 id="4-代码编辑器-visual-studio-code-安装">4.代码编辑器 visual studio code 安装</h2>
<p>命令行代码安装如下:</p>
<pre><code class="language-c">brew cask install visual-studio-code
</code></pre>
<p>安装完成启动软件,按下图所示搜索,并安装 platformIO IDE 插件:</p>
<p><img src="https://static.rymcu.com/article/1607957511543" alt="WeChat0eaa91649c71013ab9d43090d65fa328.png" /></p>
<p>按下图所示,搜索嵌入式平台 Intel MCS-51 ,并点击进入 install。</p>
<p><img src="https://static.rymcu.com/article/1607957511566" alt="WechatIMG39.jpeg" /></p>
<p>到这里,代码编辑环境准备就绪了。</p>
<h2 id="5-新建工程">5.新建工程</h2>
<p><strong>step1:</strong> 新建项目流程如下所示:</p>
<p><img src="https://static.rymcu.com/article/1607957511533" alt="新建项目.jpg" /><br />
<strong>step2:</strong> 设置项目名称,选用 <strong>Generic STC89C52RC</strong> 平台。</p>
<p><img src="https://static.rymcu.com/article/1607957511458" alt="选板子.jpg" /><br />
<strong>step3:</strong> 编辑代码<br />
<strong>step3.1</strong> 添加符合 sdcc 编译器要求的头文件,需要打开工程目录将头文件添加至 include 文件夹下,头文件下载链接如下:</p>
<p><strong>https://pan.baidu.com/s/1wSZKHhlElO6w2nwQIMfXuQ 密码: in94</strong></p>
<p><strong>step3.2</strong> src 文件夹下添加.c 格式文件如下图 23 所示,并编辑代码如下:</p>
<pre><code class="language-c">#include&quot;8051.h&quot;
#define LED0 P1_0
void main()
{
LED0 = 0;//点亮 LED0
}
</code></pre>
<p><strong>step3.3</strong> 指定下载串口,打开 platformio.ini 文件,添加如下代码,如下图 5 所示:</p>
<pre><code>upload_port = /dev/cu.wchusbserial14a0
</code></pre>
<p><strong>注意:</strong> 代码中的串口号就是安装 USB 串口驱动时的串口号,正常情况下,在下载时软件会自动寻找并打开串口,但有时打开不正确,造成下载不成功,因此,我们在这里指定好固定的串口。<br />
具体流程如下图所示其中67 所示为<strong>编译</strong>和<strong>下载</strong>按钮。</p>
<p><img src="https://static.rymcu.com/article/1607957519406" alt="1.jpg" /><br />
<strong>step4</strong> 按上图的 6 <strong>编译</strong>按钮开始编译,结果如下:</p>
<p><img src="https://static.rymcu.com/article/1607957515924" alt="success.jpg" /></p>
<p><strong>step5</strong> 按上图 7 <strong>下载</strong>按钮,并给开发板上电,下载过程如下图所示。</p>
<p><img src="https://static.rymcu.com/article/1607957519231" alt="下载成功.jpg" /></p>
<p>到这里便完成了 51 单片机的开发环境的搭建,并完成了一个小的试验项目。</p>
<h2 id="6-其他重要事项">6 其他重要事项</h2>
<p>大家是否注意到我们在新建工程的 <strong>step2:</strong> 选用 <strong>Generic STC89C52RC</strong> 平台,如果我们板子的平台不在可选之列怎么办?例如单片机 STC12C5A60S2。此时我们需要自行建立板子平台模版具体操作方法请参考<a href="https://rymcu.com/article/136"> RY-Teach STC12C5A60S2 Mac 环境搭建 </a>。</p>
<h2 id="7--总结">7 总结</h2>
<p>本文详细介绍了 基于 visual studio + platformIO + stcgal + sdcc 的 51 单片机开发环境搭建。</p>