JeecgBoot XSS防护:输入过滤与输出转义策略
概述
XSS(Cross-Site Scripting,跨站脚本攻击)是Web应用中最常见的安全威胁之一。JeecgBoot作为企业级低代码开发平台,提供了全面的XSS防护机制,通过输入过滤和输出转义的双重策略,确保应用数据的安全性。
XSS攻击类型与风险
反射型XSS
存储型XSS
DOM型XSS
JeecgBoot后端XSS防护机制
1. XssUtils工具类
JeecgBoot提供了专门的XSS处理工具类 XssUtils,位于:
org.jeecg.modules.system.util.XssUtils
核心实现代码
public class XssUtils {
private static Pattern[] patterns = new Pattern[]{
// Script fragments
Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE),
// src='...'
Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
// script tags
Pattern.compile("</script>", Pattern.CASE_INSENSITIVE),
Pattern.compile("<script(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
// eval(...)
Pattern.compile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
// expression(...)
Pattern.compile("expression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
// javascript:...
Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE),
// vbscript:...
Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE),
// onload(...)=...
Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
};
public static String scriptXss(String value) {
if (value != null) {
value = value.replaceAll(" ", "");
for(Pattern scriptPattern: patterns){
value = scriptPattern.matcher(value).replaceAll("");
}
}
return HtmlUtils.htmlEscape(value);
}
}
2. SQL注入双重防护
JeecgBoot通过 SqlInjectionUtil 类提供SQL注入防护,同时也包含XSS关键词检测:
public class SqlInjectionUtil {
// XSS注入关键词黑名单
private final static String XSS_STR = "and |exec |peformance_schema|information_schema|extractvalue|updatexml|geohash|gtid_subset|gtid_subtract|insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |;|or |+|--";
// 正则表达式模式检测
private final static String[] XSS_REGULAR_STR_ARRAY = new String[]{
"chr\\s*\\(",
"mid\\s*\\(",
" char\\s*\\(",
"sleep\\s*\\(",
"user\\s*\\(",
"show\\s+tables",
"user[\\s]*\\([\\s]*\\)",
"show\\s+databases",
"sleep\\(\\d*\\)",
"sleep\\(.*\\)",
};
}
3. 输入验证策略
表名验证
public static String getSqlInjectTableName(String table) {
// 表名正则验证:字母、数字、下划线,以字母开头
private static Pattern tableNamePattern = Pattern.compile("^[a-zA-Z][a-zA-Z0-9_\\$]{0,63}$");
if (!isValidTableName) {
throw new JeecgSqlInjectionException("表名不合法,存在SQL注入风险!--->" + table);
}
}
字段名验证
static final Pattern fieldPattern = Pattern.compile("^[a-zA-Z0-9_]+$");
public static String getSqlInjectField(String field) {
if (!isValidField) {
throw new JeecgSqlInjectionException("字段不合法,存在SQL注入风险!--->" + field);
}
}
JeecgBoot前端XSS防护机制
1. 安全的HTML渲染
前端Vue3项目中使用 v-html 时,通过白名单机制确保安全:
// XSS攻击白名单配置
export const options = {
whiteList: {
h1: ['style'], h2: ['style'], h3: ['style'], h4: ['style'], h5: ['style'], h6: ['style'],
hr: ['style'], span: ['style'], strong: ['style'], b: ['style'], i: ['style'], br: [],
p: ['style'], pre: ['style'], code: ['style'],
a: ['style', 'target', 'href', 'title', 'rel'],
img: ['style', 'src', 'title','width','height'],
div: ['style'], table: ['style', 'width', 'border', 'height'],
tr: ['style'], td: ['style', 'width', 'colspan'], th: ['style', 'width', 'colspan'],
tbody: ['style'], ul: ['style'], li: ['style'], ol: ['style'],
dl: ['style'], dt: ['style'], em: ['style'], cite: ['style'],
section: ['style'], header: ['style'], footer: ['style'], blockquote: ['style'],
audio: ['autoplay', 'controls', 'loop', 'preload', 'src'],
video: ['autoplay', 'controls', 'loop', 'preload', 'src', 'height', 'width'],
},
};
2. 内容安全处理
在前端组件中,通过专门的HTML处理方法进行内容渲染:
<template>
<div v-html="getHtml(item.msgContent)" class="article-content"></div>
</template>
<script>
import { useEmojiHtml } from '/@/components/jeecg/comment/useComment';
export default {
setup() {
const { getHtml } = useEmojiHtml(emojiIndex);
return { getHtml };
}
}
</script>
防护策略对比表
| 防护层面 | 技术手段 | 防护效果 | 适用场景 |
|---|---|---|---|
| 输入过滤 | 正则表达式匹配 | 阻止恶意内容进入系统 | 所有用户输入 |
| 输出转义 | HtmlUtils.htmlEscape | 防止脚本在浏览器执行 | 动态内容渲染 |
| 白名单机制 | 标签属性限制 | 控制允许的HTML元素 | 富文本内容 |
| SQL注入防护 | 关键词检测+正则验证 | 防止数据库攻击 | 数据库操作 |
实战应用示例
1. 后端控制器防护
@PostMapping("/saveContent")
public Result<?> saveContent(@RequestBody ContentDTO content) {
// 输入过滤
String safeTitle = XssUtils.scriptXss(content.getTitle());
String safeContent = XssUtils.scriptXss(content.getContent());
// SQL注入检测
SqlInjectionUtil.filterContent(safeTitle);
SqlInjectionUtil.filterContent(safeContent);
// 保存处理后的安全内容
contentService.save(safeTitle, safeContent);
return Result.ok("保存成功");
}
2. 前端安全渲染
<template>
<div class="content-container">
<h2>{{ safeTitle }}</h2>
<div v-html="getSafeContent(content)" class="content-body"></div>
</div>
</template>
<script>
import { options } from './XssWhiteList';
import xss from 'xss';
export default {
methods: {
getSafeContent(content) {
const myxss = new xss.FilterXSS(options);
return myxss.process(content);
}
}
}
</script>
最佳实践建议
1. 输入验证原则
- 最小权限原则:只允许必要的字符和格式
- 白名单优于黑名单:明确允许的内容而非阻止已知恶意内容
- 多层防御:前后端同时进行验证
2. 输出转义策略
3. 定期安全审计
- 检查XSS规则库是否更新
- 验证白名单配置的合理性
- 测试边界情况和特殊字符处理
常见问题排查
1. 内容显示异常
如果发现内容显示不正常,检查:
- XSS过滤规则是否过于严格
- 白名单配置是否包含所需标签
- 转义函数是否正确使用
2. 性能优化
对于大量内容处理:
- 考虑异步处理机制
- 使用缓存减少重复处理
- 优化正则表达式性能
总结
JeecgBoot通过多层次、全方位的XSS防护策略,为企业应用提供了可靠的安全保障。从后端的输入过滤和SQL注入防护,到前端的输出转义和白名单机制,形成了完整的防护体系。开发者应充分理解这些机制的原理和使用方法,在实际开发中遵循安全最佳实践,确保应用的安全性。
记住:安全不是功能,而是责任。在享受JeecgBoot低代码开发便利的同时,务必重视安全防护,构建更加健壮的企业应用。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



