🐛 fixed XssUtils
This commit is contained in:
parent
5b53760d4c
commit
671d70dfd5
@ -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;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
52
src/test/java/com/rymcu/forest/utils/TestXssUtils.java
Normal file
52
src/test/java/com/rymcu/forest/utils/TestXssUtils.java
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
109
src/test/resources/article/135.txt
Normal file
109
src/test/resources/article/135.txt
Normal 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="/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7"
|
||||||
|
</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 "help", "copyright", "credits" or "license" 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 "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
|
||||||
|
</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 格式文件如下图 2,3 所示,并编辑代码如下:</p>
|
||||||
|
<pre><code class="language-c">#include"8051.h"
|
||||||
|
#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 />
|
||||||
|
具体流程如下图所示,其中,6,7 所示为<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>
|
Loading…
Reference in New Issue
Block a user