新建XssHttpServletRequestWrapper

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;import org.springframework.util.StreamUtils;
import org.springframework.util.StringUtils;/*** 防止sql注入,xss攻击* 前端可以对输入信息做预处理,后端也可以做处理。*/
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {private static String key = "and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+";private static Set<String> notAllowedKeyWords = new HashSet<String>(0);private static String replacedString="INVALID";static {String keyStr[] = key.split("\\|");for (String str : keyStr) {notAllowedKeyWords.add(str);}}private String currentUrl;public XssHttpServletRequestWrapper(HttpServletRequest servletRequest) {super(servletRequest);currentUrl = servletRequest.getRequestURI();}/**覆盖getParameter方法,将参数名和参数值都做xss过滤。* 如果需要获得原始的值,则通过super.getParameterValues(name)来获取* getParameterNames,getParameterValues和getParameterMap也可能需要覆盖*/@Overridepublic String getParameter(String parameter) {System.out.println("防sql注入"+parameter);String value = super.getParameter(parameter);if (value == null) {return null;}return cleanXSS(value);}@Overridepublic String[] getParameterValues(String parameter) {String[] values = super.getParameterValues(parameter);if (values == null) {return null;}int count = values.length;String[] encodedValues = new String[count];for (int i = 0; i < count; i++) {encodedValues[i] = cleanXSS(values[i]);}return encodedValues;}@Overridepublic Map<String, String[]> getParameterMap(){Map<String, String[]> values=super.getParameterMap();if (values == null) {return null;}Map<String, String[]> result=new HashMap<>();for(String key:values.keySet()){String encodedKey=cleanXSS(key);int count=values.get(key).length;String[] encodedValues = new String[count];for (int i = 0; i < count; i++){encodedValues[i]=cleanXSS(values.get(key)[i]);}result.put(encodedKey,encodedValues);}return result;}/*** 覆盖getHeader方法,将参数名和参数值都做xss过滤。* 如果需要获得原始的值,则通过super.getHeaders(name)来获取* getHeaderNames 也可能需要覆盖*/@Overridepublic String getHeader(String name) {String value = super.getHeader(name);if (value == null) {return null;}return cleanXSS(value);}private String cleanXSS(String valueP) {// You'll need to remove the spaces from the html entities belowString value = valueP.replaceAll("<", "&lt;").replaceAll(">", "&gt;");value = value.replaceAll("<", "& lt;").replaceAll(">", "& gt;");value = value.replaceAll("\\(", "& #40;").replaceAll("\\)", "& #41;");value = value.replaceAll("'", "& #39;");value = value.replaceAll("eval\\((.*)\\)", "");value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");value = value.replaceAll("script", "");value = cleanSqlKeyWords(value);return value;}private String cleanSqlKeyWords(String value) {String paramValue = value;for (String keyword : notAllowedKeyWords) {if (paramValue.length() > keyword.length() + 4&& (paramValue.contains(" "+keyword)||paramValue.contains(keyword+" ")||paramValue.contains(" "+keyword+" "))) {paramValue = StringUtils.replace(paramValue, keyword, replacedString);System.out.println(this.currentUrl + "已被过滤,因为参数中包含不允许sql的关键词(" + keyword+ ")"+";参数:"+value+";过滤后的参数:"+paramValue);}}return paramValue;}}

再建CrosXssFilter 过滤器,其中的过滤规则可以自定

package com.aoyunsoft.SuZhouArchives.interceptor;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebFilter
public class CrosXssFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("sql过滤器");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");//跨域设置if(response instanceof HttpServletResponse){HttpServletResponse httpServletResponse=(HttpServletResponse)response;//通过在响应 header 中设置 ‘*’ 来允许来自所有域的跨域请求访问。httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");//通过对 Credentials 参数的设置,就可以保持跨域 Ajax 时的 Cookie//设置了Allow-Credentials,Allow-Origin就不能为*,需要指明具体的url域//httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true");//请求方式httpServletResponse.setHeader("Access-Control-Allow-Methods", "*");//(预检请求)的返回结果(即 Access-Control-Allow-Methods 和Access-Control-Allow-Headers 提供的信息) 可以被缓存多久httpServletResponse.setHeader("Access-Control-Max-Age", "86400");//首部字段用于预检请求的响应。其指明了实际请求中允许携带的首部字段httpServletResponse.setHeader("Access-Control-Allow-Headers", "*");}//sql,xss过滤HttpServletRequest httpServletRequest=(HttpServletRequest)request;//  System.out.println();XssHttpServletRequestWrapper xssHttpServletRequestWrapper=new XssHttpServletRequestWrapper(httpServletRequest);chain.doFilter(xssHttpServletRequestWrapper, response);//   logger.info("CrosXssFilter..........doFilter url:{},ParameterMap:{}",xssHttpServletRequestWrapper.getRequestURI(), JSONObject.toJSONString(xssHttpServletRequestWrapper.getParameterMap()));}@Overridepublic void destroy() {}}

注意要在启动项上加下注解:@ServletComponentScan

测试的时候输入:select * from 类似即可

SpringBoot防SQL注入相关推荐

  1. Springboot集成防sql注入设置

    防sql注入为系统开发最基础的安全开发要求,在此分享基于过滤器和功能可开关的防sql注入写法,仅供学习交流使用. SqlFilterConfigUtils 为sql注入防护开关工具类,可以灵活开启和关 ...

  2. php mysql 防 sql注入_php 防sql注入方法

    php防sql注入的方法:1.使用mysql_real_escape_string方法转义SQL语句中使用的字符串中的特殊字符:2.打开magic_quotes_gpc来防止SQL注入:3.通过自定义 ...

  3. .NET防SQL注入方法

      SQL语句 利用SqlCommand传参数的方法: string strSQL="SELECT * FROM [user] WHERE user_id=@id"; SqlCom ...

  4. 防sql注入Replace区分大小写

    以下针对c#.net 首先添加引用Microsoft.VisualBasic.Dll 引入命名空间using Microsoft.VisualBasic; 使用Replace方法,以下为参数: Str ...

  5. mysql存储过程不常用_Python--day46--mysql存储过程(不常用)(包含防sql注入)

    一.存储过程: 优点:只要传很少的数据到数据库就可以了  缺点:dba管理数据库的时候可能会对数据库进行了更改了那一坨sql语句. 二.创建存储过程: 1.简单 创建存储过程: Python中使用结果 ...

  6. PHP防SQL注入不要再用addslashes和mysql_real_escape_string

    PHP防SQL注入不要再用addslashes和mysql_real_escape_string了,有需要的朋友可以参考下. 博主热衷各种互联网技术,常啰嗦,时常伴有强迫症,常更新,觉得文章对你有帮助 ...

  7. 防sql注入 php代码,完美的php防sql注入代码

    一款比较完美的php防sql注入代码,很多初学者都有被sql注入的经验吧,今天我们来分享你一款比较完整的sql防注入代码,有需要的同学可以参考一下: /************************ ...

  8. tp5防止sql注入mysql_TP5框架 《防sql注入、防xss攻击》

    版权声明:本文为博主原创文章,转载请注明原文出处! https://blog.csdn.net/qq_23375733/article/details/86606630 如题:tp5怎么防sql注入 ...

  9. php用于防SQL注入的几个函数

    用于防SQL注入的几个函数 不要相信用户的在登陆中输入的内容,需要对用户的输入进行处理 SQL注入: ' or 1=1 # 防止SQL注入的几个函数: addslashes($string):用反斜线 ...

最新文章

  1. boot分布式计算 spring_springboot05-分布式系统理念
  2. 如何push一个docker镜像到DockerHub上
  3. c语言报错spawning 插1,C语言错误····error spawning c1.exe
  4. CSS轮廓样式属性为,简述CSS轮廓样式
  5. 合肥python招聘_2020年合肥京东方招聘官网招聘-合肥京东方招聘官网招聘求职信息-拉勾招聘...
  6. 《计算机系统:系统架构与操作系统的高度集成》——1.6 操作系统的演化
  7. WebView断网提示
  8. php常用标签,PHP 过滤常用标签的正则表达式
  9. 2020年CSDN技术人内推活动 千里马专区职位列表
  10. es6学习推荐网址(阮一峰)
  11. 3.33 利用快速蒙版制作选区 [原创Ps教程]
  12. the permanent HWaddr of eth0 .. is still in use by bond0
  13. html编辑器有哪些
  14. 物联网毕业设计 - 智能运动计步系统(物联网 嵌入式 单片机 stm32)
  15. 设计模式(四)注册模式 解决:解决全局共享和交换对象
  16. TypeScript报错解决-//@ts-ignore
  17. 55岁李连杰近照疯传:人生下半场,拼的是健康
  18. HTML5学习:第一阶段03
  19. 女性计算机科学家比例,为何女性IT工作者占比低
  20. 丰田工机安全plc编程软件pcwin safe 14而且还是中文版的

热门文章

  1. 2023前端面试题总结(html,css,js)
  2. 《火焰纹章·烈火之剑》游戏评测
  3. 20230322英语学习
  4. 普通索引和唯一索引的区别以及何时需要建立索引
  5. 7 For All Mankind推出N°21 x 7 For All Mankind 胶囊系列 庆祝品牌创立21周年
  6. 记一次inner join sql优化
  7. 查看服务器cpu核数信息
  8. 手淘卡首屏工具|2023淘宝卡首屏API接口
  9. 美报告称苹果的App Store应用商店构成垄断
  10. 【多式联运】基于matlab遗传算法求解多式联运冷链运输成本优化问题【含Matlab源码 2207期】