springboot-防止sql注入,xss攻击,cros恶意访问

1.sql注入

sql注入:

把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令

解决方法:

1)无论是直接使用数据库还是使用如mybatis组件,使用sql的预编译,不要用拼接字符串。

2)后台过滤检测:使用正则表达式过滤传入的参数**;**.字符串过滤

3)前端检测sql常见关键字,如or and drop之类的

2.xss攻击
xss攻击:

其原理是攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当其它用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的。如,盗取用户Cookie、破坏页面结构、重定向到其它网站等

解决方法:对用户输入的表单信息进行检测过滤

3.csrf/cros
关于csrf/cros攻击的详细介绍:

https://www.cnblogs.com/lailailai/p/4528092.html

关于跨域的详细介绍:

https://www.cnblogs.com/keyi/p/6726089.html

CSRF - Cross-Site Request Forgery - 跨站请求伪造:

攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在未授权的情况下执行在权限保护之下的操作

CORS - Cross Origin Resourse-Sharing - 跨站资源共享:

恶意访问内网敏感资源

解决方法:

有效的解决办法是通过多种条件屏蔽掉非法的请求,例如HTTP头、参数等

1、不信任未经身份验证的跨域请求,应该首先验证Session ID或者Cookie。

2、对于请求方来说验证接收的数据有效性,服务方仅暴露最少最必须的功能。

3、通过多种条件屏蔽掉非法的请求,例如HTTP头、参数等。

服务端代码跨域设置,设置了nginx转发,也可设置在nginx中:

import com.alibaba.fastjson.JSONObject;
import com.itextpdf.text.log.Logger;
import com.itextpdf.text.log.LoggerFactory;
import com.yxkj.common.core.config.xssconfig.XssAndSqlHttpServletRequestWrapper;
import lombok.extern.slf4j.Slf4j;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @Auther: * @Date: 2023/7/17 15:19* @Description:*/@WebFilter
public class CrosXssFilter implements Filter {private static final Logger logger = LoggerFactory.getLogger(CrosXssFilter.class);@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@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;XssHttpServletRequestWrapper xssHttpServletRequestWrapper=new XssHttpServletRequestWrapper(httpServletRequest);chain.doFilter(xssHttpServletRequestWrapper, response);}@Overridepublic void destroy() {}}
import com.itextpdf.text.log.Logger;
import com.itextpdf.text.log.LoggerFactory;
import com.yxkj.common.core.util.other.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.util.HtmlUtils;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.util.*;/*** @Auther: * @Date: 2023/7/17 15:20* @Description:*//*** 防止sql注入,xss攻击* 前端可以对输入信息做预处理,后端也可以做处理。*/
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {private final Logger log = LoggerFactory.getLogger(getClass());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) {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);log.error(this.currentUrl + "已被过滤,因为参数中包含不允许sql的关键词(" + keyword+ ")"+";参数:"+value+";过滤后的参数:"+paramValue);}}return paramValue;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/5250.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity游戏源码分享-Unity手游火柴忍者游戏StickmanDojo

Unity游戏源码分享-Unity手游火柴忍者游戏StickmanDojo 项目地址&#xff1a;https://download.csdn.net/download/Highning0007/88050234

蒲公英打包环境搭建碰到问题

一&#xff1a;证书那边选择手动&#xff0c;不要自动&#xff0c;——》debug配置dev证书&#xff0c;release配置ad-hoc证书 二&#xff1a;证书有时候不生效&#xff0c;删除重新下载。~/Library/MobileDevice/Provisioning Profiles 三&#xff1a;更新测试手机时&#…

Mysql索引与事务

目录 一、索引 1、概念 2、作用 3、副作用 二、事务 1、概念 2、ACID特点 原子性 一致性 隔离性 持久性 一、索引 1、概念 索引是一个排序的列表&#xff0c;在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址&#xff08;类似于C语言的链表通过指针…

OpenCv色彩空间

目录 一、RGB 二、图像处理入门 三、色彩空间的转换 一、RGB 在表示图像时&#xff0c;有多种不同的颜色模型&#xff0c;但最常见的是红、绿、蓝(RGB) 模型RGB 模型是一种加法颜色模型&#xff0c;其中原色 (在RGB模型中&#xff0c;原色是红色 R、绿色 G 和蓝色 B)混合在…

设计模式之享元模式

写在前面 本文看下一种结构型设计模式&#xff0c;享元模式。 1&#xff1a;介绍 1.1&#xff1a;什么时候使用享元模式 当程序需要大量的重复对象&#xff0c;并且这些大量的重复对象只有部分属性不相同&#xff0c;其他都是相同的时候&#xff0c;就可以考虑使用享元设计…

PMP-项目风险管理学习要点

文章目录 前言PMP-项目风险管理学习要点1. 风险的含义2. 风险敞口3. 单个项目风险 VS 整个项目风险4. 变异性风险5. 模糊性风险6. 项目风险的分类6.1. 已知风险与未知风险6.2. 内部风险与外部风险6.3. 商业风险与可保险风险7. 影响相关方的风险态度的因素8. 识别风险的几种方式…

【天工Godwork精品教程】天工3.1.7安装教程(附Godwork完整版下载地址)

本文讲解天工3.1.7安装过程(附Godwork完整版网盘下载地址)。 文章目录 一、天工3.1.7安装教程1. 安装GodWork-AT 3.1.72. 安装GodWork-AT 3.1.7补丁3. 安装GodWork-EOS-Setup-2017B-12314. 安装GodWork-EOS补丁5. 运行godwokr软件6. 生成ZC码7. 输入ZC码8. eos插件调用二、天…

Linux·从 URL 输入到页面展现到底发生什么?

打开浏览器从输入网址到网页呈现在大家面前&#xff0c;背后到底发生了什么&#xff1f;经历怎么样的一个过程&#xff1f;先给大家来张总体流程图&#xff0c;具体步骤请看下文分解&#xff01; 总体来说分为以下几个过程: DNS 解析:将域名解析成 IP 地址TCP 连接&#xff1a…

LINUX 查看机器配置

查看磁盘类型&#xff1a;lsblk -d -o name,rota 查看磁盘大小&#xff1a;lsblk -r| grep dis 查看磁盘详情&#xff1a;df -h 查看每个物理CPU内核个数&#xff1a;cat /proc/cpuinfo | grep process | sort | uniq | wc -l 查看cpu个数&#xff1a;cat /proc/cpuinfo | grep…

Vue中的侦听器:数据变化的秘密揭示

一、侦听器&#xff1a;vue中想监听数据的变化 &#x1f680;&#xff08;一&#xff09;侦听器watch 如何侦听到某个变量值改变呢&#xff1f;使用watch配置项&#x1f6a7;&#x1f6a7;&#x1f6a7;watch&#xff1a;可以侦听到data/computed属性值的改变。语法&#xff…

高级 Matplotlib:3D 图形和交互性

Matplotlib 是 Python 中最重要的数据可视化库之一。在之前的文章中&#xff0c;我们讨论了如何使用基础和中级功能来创建各种图形。在本文中&#xff0c;我们将深入研究 Matplotlib 的高级特性&#xff0c;特别是如何创建 3D 图形和交互式图形。 一、创建 3D 图形 Matplotli…

使用 Pytest 运行 yaml 文件来驱动 Appium 自动化测试

目录 前言&#xff1a; 获取 yaml 文件 YamlTest 测试类 Appium 初始化 Pytest 测试类 自定义 runtest demo&#xff1a; 自定义错误输出 Yaml 使用方式规则 前言&#xff1a; 使用Pytest来运行yaml文件来驱动Appium自动化测试是一种方便且灵活的方法。通过将测试数据…

为你精选5款体验极佳的原型设计工具!

在绘制原型图的过程中&#xff0c;使用一款的简单易操作的原型设计工具是非常重要的&#xff0c;本文精选了5款好用的原型工具与大家分享&#xff0c;一起来看看吧&#xff01; 1、即时设计 即时设计是国内很多设计师都在用的原型设计工具&#xff0c;同时它也是国产的原型设…

想知道搭建知识库有什么重点?看这篇就够了

在目前这个提倡无纸化的时代&#xff0c;搭建一个知识库已经是一种潮流。无论是个人还是企业来说&#xff0c;都是特别重要的一个工具。今天looklook就从搭建知识库的重点这方面来展开&#xff0c;详细地告诉大家该如何成功搭建一个完善的知识库。 搭建知识库的重点 1.建立素材…

React踩坑

1、图片引入路径 在react中img的src不能采用<img src"../../images/xxxxx.png" />这类方式直接使用相对路径&#xff0c;因为最后渲染时&#xff0c;这个路径实际上是用变量的样子代替&#xff0c;所以在标签里面用{}包裹。 正确写法&#xff1a; import lu…

数据可视化:揭开数据的视觉奇迹

随着大数据时代的到来&#xff0c;我们面临着海量的数据&#xff0c;如何从中获取有价值的信息成为一项重要的挑战。数据可视化作为一种强大的工具&#xff0c;通过图表、图形和交互界面&#xff0c;将数据转化为可视化的形式&#xff0c;帮助我们更好地理解和分析数据。 数据可…

学习Dubbo前你要了解这些

文章目录 Dubbo的发展背景单一应用架构垂直应用架构分布式服务架构流动计算架构 RPCRPC的简单原理 DubboDubbo是什么Dubbo作者Dubbo的发展历程Dubbo架构 Dubbo发音&#xff1a; |ˈdʌbəʊ| Dubbo官方网站&#xff1a;http://dubbo.apache.org/ Dubbo是阿里巴巴开发的&#…

关系型数据库设计规则

目录 1.1 表、记录、字段 1.2 表的关联关系 1.2.1 一对一关联&#xff08;one-to-one&#xff09; 1.2.2 一对多关系&#xff08;one-to-many&#xff09; 1.2.3 多对多&#xff08;many-to-many&#xff09; 1.2.4 自我引用&#xff08;Self reference&#xff09; 关系…

知识图谱推理的学习逻辑规则(上)7.19+(下)7.20

知识图谱推理的学习逻辑规则 摘要介绍相关工作模型 &#xff08;7.20&#xff09;知识图谱推理逻辑规则概率形式化参数化规则生成器具有逻辑规则的推理预测器 优化E步骤M步骤 实验实验设置实验结果 总结 原文&#xff1a; 摘要 本文研究了在知识图谱上进行推理的学习逻辑规则…

Idea中使用Git详细教学

目录 一、配置 Git 二、创建项目远程仓库 三、初始化本地仓库 方法一&#xff1a; 方法二&#xff1a; 四、连接远程仓库 五、提交与拉取到本地仓库 六、推送到远程仓库 七、克隆远程仓库到本地 方法一&#xff1a; 方法二&#xff1a; 八、Git分支操作 一、配置 G…