最新要闻
- 【世界速看料】大学生23万网购凯迪拉克二手车:开了俩月就冒烟 三大件全动过
- 499元 小米真无线降噪耳机3星战定制款发布:风暴兵标志太酷炫
- 每日快讯!ChatGPT推荐中国最宜居城市 成都第三长沙第一 认可吗
- 焦点!斗鱼回应36岁女子请假保胎被辞:并非针对孕妇 不服可仲裁
- 2.8K 120Hz华硕好屏、升级13代酷睿!灵耀14 2023旗舰版图赏
- 【世界快播报】孙子膑脚全文_孙子膑脚
- 全球今热点:GPT-4刚发布就有手机APP接入 上传照片视频一键解读
- 迪士尼被曝大幅裁员!公司称至少有4000名员工将在4月份失业
- 当前滚动:239元 荣耀手环7 NFC版开售:新增公交/门禁功能
- 世界要闻:2022年超越德国成全球第二 中国新能源汽车出口继续高增长
- 熊孩子4S店不小心启动车辆 展车冲出撞击多辆新车
- 电动车价格还得降 “白色石油”碳酸锂价格三个月大跌40% 专家称重大利好
- 全球热推荐:中长视频版抖音!抖音官方全新APP青桃上线:对标B站
- 机构:中国人幸福感全球最高 韩国人排名全球垫底 日美紧随其后
- 当前看点!TVB演员30秒被扇21个耳光让人惊叹 网友点赞:吐槽内娱明星不敬业
- 我眼中的秋天600字的作文_我眼中的秋天600字
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
天天实时:Spring Boot 如果防护 XSS + SQL 注入攻击 ?一文带你搞定!
1. XSS跨站脚本攻击
①:XSS漏洞介绍
跨站脚本攻击XSS是指攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被解析执行,从而达到恶意攻击用户的目的。XSS攻击针对的是用户层面的攻击!
②:XSS漏洞分类
存储型XSS:存储型XSS,持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,插入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。这种XSS比较危险,容易造成蠕虫,盗窃cookie
(资料图片仅供参考)
反射型XSS:非持久化,需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面
DOM型XSS:不经过后端,DOM-XSS漏洞是基于文档对象模型(Document Objeet Model
,DOM)的一种漏洞,DOM-XSS是通过url传入参数去控制触发的,其实也属于反射型XSS。
③:防护建议
- 限制用户输入,表单数据规定值得类型,例如年龄只能是int,name为字母数字组合。
- 对数据进行html encode处理。
- 过滤或移除特殊的html标签。
- 过滤javascript事件的标签。
2. SQL注入攻击
①:SQL注入漏洞介绍
SQL注入(SQLi)是一种注入攻击,可以执行恶意SQL语句。它通过将任意SQL代码插入数据库查询,使攻击者能够完全控制Web应用程序后面的数据库服务器。攻击者可以使用SQL注入漏洞绕过应用程序安全措施;可以绕过网页或Web应用程序的身份验证和授权,并检索整个SQL数据库的内容;还可以使用SQL注入来添加,修改和删除数据库中的记录
SQL注入漏洞可能会影响使用SQL数据库(如MySQL,Oracle,SQL Server或其他)的任何网站或Web应用程序。犯罪分子可能会利用它来未经授权访问用户的敏感数据:客户信息,个人数据,商业机密,知识产权等。SQL注入攻击是最古老,最流行,最危险的Web应用程序漏洞之一。
②:防护建议
使用mybatis中#{}
可以有效防止sql注入
- 使用
#{}
时:
打印出执行的sql语句,会看到sql是这样的:
select id,title,author,content from blog where id = ?
不管输入什么参数,打印出的sql都是这样的。这是因为mybatis启用了预编译功能,在sql执行前,会先将上面的sql发送给数据库进行编译,执行时,直接使用编译好的sql,替换占位符“?”就可以了。因为sql注入只能对编译过程起作用,所以像#{}这样预编译成?的方式就很好地避免了sql注入的问题。
mybatis是如何做到sql预编译的呢?
其实在框架底层,是jdbc中的PreparedStatement
类在起作用,PreparedStatement
是我们很熟悉的Statement的子类,它的对象包含了编译好的sql语句。这种“准备好”的方式不仅能提高安全性,而且在多次执行一个sql时,能够提高效率,原因是sql已编译好,再次执行时无需再编译。
- 使用
${}
时
仔细观察,内联参数的格式由“#{xxx}
”变为了${xxx}
。如果我们给参数“orderParam
”赋值为”id”,将sql打印出来,是这样的:
select id,title,author,contet from blog order by id
显然,这样是无法阻止sql注入的,参数会直接参与sql编译,从而不能避免注入攻击。但涉及到动态表名和列名时,只能使用“${}
”这样的参数格式,所以,这样的参数需要我们在代码中手工进行处理来防止注入。
3. SpringBoot中如何防止XSS攻击和sql注入
话不多说,上代码
Spring Boot 基础就不介绍了,推荐看这个免费教程:
https://github.com/javastacks/spring-boot-best-practice
对于Xss攻击和Sql注入,我们可以通过过滤器来搞定,可根据业务需要排除部分请求
①:创建Xss请求过滤类XssHttpServletRequestWraper
代码如下:
public class XssHttpServletRequestWraper extends HttpServletRequestWrapper { Logger log = LoggerFactory.getLogger(this.getClass()); public XssHttpServletRequestWraper() { super(null); } public XssHttpServletRequestWraper(HttpServletRequest httpservletrequest) { super(httpservletrequest); } //过滤springmvc中的 @RequestParam 注解中的参数 public String[] getParameterValues(String s) { String str[] = super.getParameterValues(s); if (str == null) { return null; } int i = str.length; String as1[] = new String[i]; for (int j = 0; j < i; j++) { //System.out.println("getParameterValues:"+str[j]); as1[j] = cleanXSS(cleanSQLInject(str[j])); } log.info("XssHttpServletRequestWraper净化后的请求为:==========" + as1); return as1; } //过滤request.getParameter的参数 public String getParameter(String s) { String s1 = super.getParameter(s); if (s1 == null) { return null; } else { String s2 = cleanXSS(cleanSQLInject(s1)); log.info("XssHttpServletRequestWraper净化后的请求为:==========" + s2); return s2; } } //过滤请求体 json 格式的 @Override public ServletInputStream getInputStream() throws IOException { final ByteArrayInputStream bais = new ByteArrayInputStream(inputHandlers(super.getInputStream ()).getBytes ()); return new ServletInputStream() { @Override public int read() throws IOException { return bais.read(); } @Override public boolean isFinished() { return false; } @Override public boolean isReady() { return false; } @Override public void setReadListener(ReadListener readListener) { } }; } public String inputHandlers(ServletInputStream servletInputStream){ StringBuilder sb = new StringBuilder(); BufferedReader reader = null; try { reader = new BufferedReader(new InputStreamReader(servletInputStream, Charset.forName("UTF-8"))); String line = ""; while ((line = reader.readLine()) != null) { sb.append(line); } } catch (IOException e) { e.printStackTrace(); } finally { if (servletInputStream != null) { try { servletInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } return cleanXSS(sb.toString ()); } public String cleanXSS(String src) { String temp = src; src = src.replaceAll("<", "<").replaceAll(">", ">"); src = src.replaceAll("\\(", "(").replaceAll("\\)", ")"); src = src.replaceAll(""", "'"); src = src.replaceAll(";", ";"); //bgh 2018/05/30 新增 /**-----------------------start--------------------------*/ src = src.replaceAll("<", "& lt;").replaceAll(">", "& gt;"); src = src.replaceAll("\\(", "& #40;").replaceAll("\\)", "& #41"); src = src.replaceAll("eval\\((.*)\\)", ""); src = src.replaceAll("[\\\"\\\"][\\s]*javascript:(.*)[\\\"\\\"]", "\"\""); src = src.replaceAll("script", ""); src = src.replaceAll("link", ""); src = src.replaceAll("frame", ""); /**-----------------------end--------------------------*/ Pattern pattern = Pattern.compile("(eval\\((.*)\\)|script)", Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(src); src = matcher.replaceAll(""); pattern = Pattern.compile("[\\\"\\"][\\s]*javascript:(.*)[\\\"\\"]", Pattern.CASE_INSENSITIVE); matcher = pattern.matcher(src); src = matcher.replaceAll("\"\""); // 增加脚本 src = src.replaceAll("script", "").replaceAll(";", "") /*.replaceAll("\"", "").replaceAll("@", "")*/ .replaceAll("0x0d", "").replaceAll("0x0a", ""); if (!temp.equals(src)) { // System.out.println("输入信息存在xss攻击!"); // System.out.println("原始输入信息-->" + temp); // System.out.println("处理后信息-->" + src); log.error("xss攻击检查:参数含有非法攻击字符,已禁止继续访问!!"); log.error("原始输入信息-->" + temp); throw new CustomerException("xss攻击检查:参数含有非法攻击字符,已禁止继续访问!!"); } return src; } //输出 public void outputMsgByOutputStream(HttpServletResponse response, String msg) throws IOException { ServletOutputStream outputStream = response.getOutputStream(); //获取输出流 response.setHeader("content-type", "text/html;charset=UTF-8"); //通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码 byte[] dataByteArr = msg.getBytes("UTF-8");// 将字符转换成字节数组,指定以UTF-8编码进行转换 outputStream.write(dataByteArr);// 使用OutputStream流向客户端输出字节数组 } // 需要增加通配,过滤大小写组合 public String cleanSQLInject(String src) { String lowSrc = src.toLowerCase(); String temp = src; String lowSrcAfter = lowSrc.replaceAll("insert", "forbidI") .replaceAll("select", "forbidS") .replaceAll("update", "forbidU") .replaceAll("delete", "forbidD").replaceAll("and", "forbidA") .replaceAll("or", "forbidO"); if (!lowSrcAfter.equals(lowSrc)) { log.error("sql注入检查:输入信息存在SQL攻击!"); log.error("原始输入信息-->" + temp); log.error("处理后信息-->" + lowSrc); throw new CustomerException("sql注入检查:参数含有非法攻击字符,已禁止继续访问!!"); } return src; }}
②:把请求过滤类XssHttpServletRequestWraper
添加到Filter中,注入容器
@Componentpublic class XssFilter implements Filter { Logger log = LoggerFactory.getLogger(this.getClass()); // 忽略权限检查的url地址 private final String[] excludeUrls = new String[]{ "null" }; public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) arg0; HttpServletResponse response = (HttpServletResponse) arg1; String pathInfo = req.getPathInfo() == null ? "" : req.getPathInfo(); //获取请求url的后两层 String url = req.getServletPath() + pathInfo; //获取请求你ip后的全部路径 String uri = req.getRequestURI(); //注入xss过滤器实例 XssHttpServletRequestWraper reqW = new XssHttpServletRequestWraper(req); //过滤掉不需要的Xss校验的地址 for (String str : excludeUrls) { if (uri.indexOf(str) >= 0) { arg2.doFilter(arg0, response); return; } } //过滤 arg2.doFilter(reqW, response); } public void destroy() { } public void init(FilterConfig filterconfig1) throws ServletException { }}
上述代码已经可以完成 请求参数、JSON请求体 的过滤,但对于json请求体还有其他的方式实现,有兴趣的请看下面的扩展!
扩展:还可以重写spring中的MappingJackson2HttpMessageConverter
来过滤Json请求体
因为请求体在进出Contoroller时,会经过MappingJackson2HttpMessageConverter
的一个转换,把请求体转换成我们需要的json格式,所以可以在这里边做一些修改!
@Configurationpublic class MyConfiguration { @Bean public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(){ //自定义转换器 MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); //转换器日期格式设置 ObjectMapper objectMapper = new ObjectMapper(); SimpleDateFormat smt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); objectMapper.setDateFormat(smt); converter.setObjectMapper(objectMapper); //转换器添加自定义Module扩展,主要是在这里做XSS过滤的!!,其他的是其他业务,不用看 SimpleModule simpleModule = new SimpleModule(); //添加过滤逻辑类! simpleModule.addDeserializer(String.class,new StringDeserializer()); converter.getObjectMapper().registerModule(simpleModule); //设置中文编码格式 List list = new ArrayList<>(); list.add(MediaType.APPLICATION_JSON_UTF8); converter.setSupportedMediaTypes(list); return converter; }}
真正的过滤逻辑类StringDeserializer
:
//检验请求体的参数@Componentpublic class StringDeserializer extends JsonDeserializer { @Override public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { String str = jsonParser.getText().trim(); //sql注入拦截 if (sqlInject(str)) { throw new CustomerException("参数含有非法攻击字符,已禁止继续访问!"); } return xssClean(str); } public boolean sqlInject(String str) { if (StringUtils.isEmpty(str)) { return false; } //去掉"|"|;|\字符 str = org.apache.commons.lang3.StringUtils.replace(str, """, ""); str = org.apache.commons.lang3.StringUtils.replace(str, "\"", ""); str = org.apache.commons.lang3.StringUtils.replace(str, ";", ""); str = org.apache.commons.lang3.StringUtils.replace(str, "\\", ""); //转换成小写 str = str.toLowerCase(); //非法字符 String[] keywords = {"master", "truncate", "insert", "select", "delete", "update", "declare", "alert","alter", "drop"}; //判断是否包含非法字符 for (String keyword : keywords) { if (str.indexOf(keyword) != -1) { return true; } } return false; } //xss攻击拦截 public String xssClean(String value) { if (value == null || "".equals(value)) { return value; } //非法字符 String[] keywords = {"<", ">", "<>", "()", ")", "(", "javascript:", "script","alter", """","""}; //判断是否包含非法字符 for (String keyword : keywords) { if (value.indexOf(keyword) != -1) { throw new CustomerException("参数含有非法攻击字符,已禁止继续访问!"); } } return value; }}
使用这种形式也可以完成json请求体的过滤,但个人更推荐使用XssHttpServletRequestWraper
的形式来完成xss过滤!!
来源:blog.csdn.net/qq_45076180/article/details/115000495
近期热文推荐:
1.1,000+ 道 Java面试题及答案整理(2022最新版)
2.劲爆!Java 协程要来了。。。
3.Spring Boot 2.x 教程,太全了!
4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!
5.《Java开发手册(嵩山版)》最新发布,速速下载!
觉得不错,别忘了随手点赞+转发哦!
关键词:
-
天天实时:Spring Boot 如果防护 XSS + SQL 注入攻击 ?一文带你搞定!
1 XSS跨站脚本攻击①:XSS漏洞介绍跨站脚本攻击XSS是指攻击者往Web页面里插入恶意Script代码,当用户浏...
来源: 天天实时:Spring Boot 如果防护 XSS + SQL 注入攻击 ?一文带你搞定!
【世界热闻】Python工具箱系列(二十七)
python高级用法之命名元组namedtuple
【世界速看料】大学生23万网购凯迪拉克二手车:开了俩月就冒烟 三大件全动过
499元 小米真无线降噪耳机3星战定制款发布:风暴兵标志太酷炫
每日快讯!ChatGPT推荐中国最宜居城市 成都第三长沙第一 认可吗
焦点!斗鱼回应36岁女子请假保胎被辞:并非针对孕妇 不服可仲裁
2.8K 120Hz华硕好屏、升级13代酷睿!灵耀14 2023旗舰版图赏
支持向量机SVM
天天微资讯!【C 数据结构】循环队列
【世界快播报】孙子膑脚全文_孙子膑脚
全球今热点:GPT-4刚发布就有手机APP接入 上传照片视频一键解读
迪士尼被曝大幅裁员!公司称至少有4000名员工将在4月份失业
当前滚动:239元 荣耀手环7 NFC版开售:新增公交/门禁功能
世界要闻:2022年超越德国成全球第二 中国新能源汽车出口继续高增长
熊孩子4S店不小心启动车辆 展车冲出撞击多辆新车
天天日报丨读C#代码整洁之道笔记01_C#的编码标准和原则
热资讯!【新华解读】降准落地对债市是否意味着利好出尽?
电动车价格还得降 “白色石油”碳酸锂价格三个月大跌40% 专家称重大利好
全球热推荐:中长视频版抖音!抖音官方全新APP青桃上线:对标B站
机构:中国人幸福感全球最高 韩国人排名全球垫底 日美紧随其后
当前看点!TVB演员30秒被扇21个耳光让人惊叹 网友点赞:吐槽内娱明星不敬业
【环球新视野】债市观察:海外风险事件扰动有限 期现券难脱震荡格局
美联储联手全球主要央行加强美元流动性供给
天天热资讯!业内人士:超预期“降准”呵护流动性 提振金属市场需求复苏
世界热点!市场避险情绪高涨 金油比价上破26桶/盎司
我眼中的秋天600字的作文_我眼中的秋天600字
美国银行接连倒闭:国际黄金价格逼近2000美元大关 全球疯抢
当前热议!又一个国产ChatGPT 李开复再创业:打造世界级AI公司
资讯推荐:读Java性能权威指南(第2版)笔记22_ 操作系统工具和Java监控工具
天天快资讯:护眼电视都是骗人的?真相揭秘
考研周记-week4
环球关注:[MRCTF2020]Ezpop
【OpenGL ES】绘制魔方
hystrix的熔断降级
过去几亿年 月亮变“瘦了”约50米:地球呢?
男子网恋1年多 女友竟是好友老婆:转账8万多要不回来
为什么迅雷下载不了文件_为什么迅雷下载不了
环球热讯:Masa Framework源码解读-03 MasaMinimalApi设计
世界微资讯!Vue——initEvents【六】
世界看热讯:人类身体为什么不长毛?竟然是因为这
手机的天线去哪了?原来就在眼皮底下
Web API接口返回实现类集合的姿势了解
【单元测试】Junit 4(七)--junit4 TestRunnner
微头条丨皮鞋果冻制作方法_皮鞋果冻
日月潭蓄水率创新低:九蛙叠像全露出 还有“神秘黑洞”
【模型部署】在C++和Python中配置OpenVINO2022环境
谈谈 Vue shallowRef 和 shallowReactive
快报:刷题疑惑2
前端加载超大图片(100M以上)实现秒开解决方案
快讯:数据结构-图
连上半个月夜班 27岁小伙一觉醒来懵了:脸肿得像包子
环球今亮点!微信新增“视频号”入口?腾讯张军否认网传截图:假的
数据挖掘第四周作业
conda环境下使用nvcc -V报错nvcc: command not found的一种解决方法
环球快资讯:【论文笔记】SegNet
OpenAI CEO承认害怕ChatGPT:AI会取代许多工作
前端设计模式——原型模式
全球短讯!69.处理类型
环球快看:车主花32万买到全损事故车:获退1赔3、到手97.2万
群晖DS423入门级四盘位NAS发布:居然支持Docker了
今头条!小米真无线降噪耳机3《星球大战》联名版来了!明早10点正式公布
每日观察!家长发又有作业了被老师踢出群聊 还被电话教育:网友纷纷感同身受
当前报道:男子吐槽22元吃面 面量仅盖住碗底 店方:这是网红大碗
当前动态:一定的提问方法与一定的什么是控制访谈的两个重要因素_一定的与一定的是控制访谈的两个重要因素
环球看热讯:MySQL如何正确查询字符串长度
每日速看!C. Sequence Master
2023年安卓之光!小米13 Ultra最新进展:还在打磨MIUI 14系统
焦点滚动:AMD Zen4低功耗锐龙7 7840U首次现身:28W就灭掉45W Zen3+
世界视点!南航重推“随心飞”产品:不限年龄无限飞行 服务器被挤爆
全球微资讯!看看这份2023年MySQL终级面试题,提升你的内力,给你面试助力
环球热点!推荐机制不再保密:马斯克宣布月底开放Twitter推荐算法
P图侮辱女性 苏州大学凌晨通报:开除赵某某学籍
.NET中的winform、wpf、winui和maui你都知道吗?
1254MB海量缓存+96核心!AMD霄龙9004X让对手彻底绝望
【全球聚看点】“密集恐惧症”真的是种病?看完也许会治好
每日快报!群晖DSM 7.2 Beta发布:Docker更名 相册大升级
焦点快播:诸葛亮的改动再度提上日程,诸葛亮真的需要这样调整吗?
今日热闻!独特的散热设计与人机交互触控屏!微星海皇戟X2主机评测:顶级游戏性能
【全球快播报】《你的名字。》导演新海诚新作!《铃芽之旅》预售票房突破3000万
天天微动态丨C++ | 运算符重载
每日快播:BUUCTF-MISC-面具下的flag(vmdk的解压和Brainfuck与Ook解密)
天天微动态丨比亚迪智能手表亮相:一键控车 可完美替代车钥匙
买了电动牙刷 没想到越用牙越废
观天下!宝马X3变X6!男子买二手宝马X3买到全损事故车 退1赔3得97万
印度机长飞行中吃早餐 咖啡直接放在油门把手上!双双被罚
看New Bing回答世纪难题:女友和妈妈掉水里先救谁
24层楼高!首艘国产大型邮轮预计年底交付:零件数是复兴号高铁13倍
环球热点评!xj威客网可信不_xj威客网
全球热点评!暴雪火速排查《暗黑4》排队问题
天天讯息:别等降价了!长城坦克推全年保价政策 年底前官降返差价
全球快资讯丨《名侦探柯南》里出现九转大肠厨师和评委:网友直呼瞬间出戏
环球简讯:知名车评人吐槽宝马漏机油养活他家修理厂 原因直指塑料气门室盖
【世界热闻】探究C# dynamic动态类型本质
天天新资讯:郭帆谈《流浪地球2》“50岁以上出列”拍摄:喊停了外国群演还在哭
全球短讯!给蚊子送上夏天第一拍!雅格电蚊拍大促:10.9元到手
今日要闻!迪士尼正版授权 泰国乳胶凉席三件套大促!原价190 券后90
检查 Linux 系统是运行在虚拟机上还是物理机上
远大前程多少集_远大前程介绍
全球热资讯!《寂静岭2:重制版》美术谈护士穿丝袜:曾被指责皮肤暴露