范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

SpringBoot防止SQL注入XSS攻击CSRFCROS恶意访问

  一、SQL 注入问题
  (1)什么是 SQL 注入
  SQL 注入即是指 web 应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在 web 应用程序中事先定义好的查询语句的结尾上添加额外的 SQL 语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
  简单来说,就是将大部分 SQL 语句当参数传入系统中,从而获取系统中的数据。下面简单举例说明
  系统中有这样一条信息 SQL 语句执行,分页查询所有用户,每页查询 20 条,并且根据指定字段进行排序,也就是说排序字段也是参数传递过来的 select * from user_info order by ${fieldName} desc limit ${page}, ${limit};  # 正常执行的SQL select * from user_info order by id desc limit 0, 20;  假如说,懂行的人恶意将排序参数修改为以下格式 select * from user_info order by id; select 1 -- desc limit 0, 20;
  SQL 注入问题分析: 攻击者注入了类似这样的参数: -1; 缩表语句-- 其中 ; 前面的语句先执行了由于 -- 后面的语句会被注释掉,接下来只会执行锁表语句,把表锁住正常业务请求从数据库获得连接之后,尝试获取锁表,但是一直获取不到,直到超时 数据库连接池不够用,没有空闲连接 新的业务请求获取不到数据库连接,报错数据库连接过多异常
  这样很简单的一句话 SQL,就可以把系统搞炸掉,这种方式可以实现删库跑路 -1; delete  from  user; --
  以上语句会把整个 test 数据库所有内容都删掉 (2)防止 SQL 注入使用预编译机制
  尽量用预编译机制,少用字符串拼接的方式传参,它是 sql 注入问题的根源。 要对特殊字符进行转义
  有些特殊字符,比如:%作为 like 语句中的参数时,要对其进行转义处理。 要捕获异常
  需要对所有的异常情况进行捕获,切记接口直接返回异常信息,因为有些异常信息中包含了 sql 信息,包括:库名,表名,字段名等。攻击者拿着这些信息,就能通过 sql 注入随心所欲地攻击你的数据库了。目前比较主流的做法是,有个专门的网关服务,它统一暴露对外接口。用户请求接口时先经过它,再由它将请求转发给业务服务。这样做的好处是:能统一封装返回数据的返回体,并且如果出现异常,能返回统一的异常信息,隐藏敏感信息。此外还能做限流和权限控制。 使用代码检测工具
  使用 sqlMap 等待代码检测工具,它能检测 sql 注入漏洞。 要有监控
  需要对数据库 sql 的执行情况进行监控,有异常情况,及时邮件或短信提醒。 数据库账号需控制权限
  对生产环境的数据库建立单独的账号,只分配 DML 相关权限,且不能访问系统表。切勿在程序中直接使用管理员账号。 代码 review
  建立代码 review 机制,能找出部分隐藏的问题,提升代码质量。 使用其他手段处理
  对于不能使用预编译传参时,要么开启 druid 的 filter 防火墙,要么自己写代码逻辑过滤掉所有可能的注入关键字。 二、XSS 攻击问题(1)什么是 XSS 攻击
  XSS 攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是 JavaScript,但实际上也可以包括 Java、 VBScript、ActiveX、 Flash 或者甚至是普通的 HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和 cookie 等各种内容。
  通常情况下,被用来盗用 Cookie、破坏页面结构、重定向到其他网站等 (2)防止 XSS 攻击
  对用户输入的表单信息进行检测过滤 三、CSRF/CROS 恶意访问(1)什么是 CSRF/CROS 恶意访问
  CSRF - Cross-Site Request Forgery - 跨站请求伪造:
  攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在未授权的情况下执行在权限保护之下的操作,CORS - Cross Origin Resourse-Sharing - 跨站资源共享,恶意访问内网敏感资源。 (2)解决办法
  有效的解决办法是通过多种条件屏蔽掉非法的请求,例如 HTTP 头、参数等: 不信任未经身份验证的跨域请求,应该首先验证 Session ID 或者 Cookie 对于请求方来说验证接收的数据有效性,服务方仅暴露最少最必须的功能 通过多种条件屏蔽掉非法的请求,例如 HTTP 头、参数等 服务端代码跨域设置,设置了 nginx 转发,也可设置在 nginx 中
  防止大规模的恶意请求,niginx 反向代理可以配置请求频率,对 ip 做限制。nginx 可以很方便地做访问控制,特别是一些偶发性的大量恶意请求,需要屏蔽处理。
  屏蔽 ip 地址 location /someapi/ { allow ip;  #特定接口只开放给某个ip调用 deny all; }  location /somepage/ { deny ip;   #屏蔽某个ip访问(iptables可以拒绝某个ip连接) allow all; }
  屏蔽 user-agent if ($http_user_agent = Mozilla/5.0 ) { return 403; }   #有些请求头很明显不是用户浏览器  分析nginx日志,找出恶意ip或user-agent  cat /var/log/nginx/access.log | awk -F" "{A[$(NF-1)]++}END{for(k in A)print A[k],k}" | sort -n |tail 122 58.144.7.66 337 106.91.201.75 2270 122.200.77.170  #显然这个ip不正常,而且这不是nginx所知道的真实ip,而是 $http_x_forwarded_for变量
  屏蔽代理 ip
  有两种情形会需要屏蔽代理 ip:一是代理 ip 访问,二是负载均衡(real-ip 请求负载均衡服务器,再代理给后端 server) vi /etc/nginx/badproxy.rules map $http_x_forwarded_for $badproxy {         default 0;         ~*122.200.77.170  1;  #建立映射 } vi /etc/nginx/nginx.conf http { include /etc/nginx/badproxy.rules  #这个要在server配置之前 server {     location /somepage/ {         if ( $badproxy ) { return 403; }     } } }四、解决方案
  创建 XssAndSqlHttpServletRequestWrapper 包装器,这是实现 XSS 过滤的关键,在其内重写了 getParameter,getParameterValues,getHeader 等方法,对 http 请求内的参数进行了过滤 import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.Vector; import java.util.regex.Pattern;  import javax.servlet.ReadListener; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper;  import org.springframework.util.StreamUtils;  import com.sgcc.uap.utils.stream.StreamUtil;  public class XssAndSqlHttpServletRequestWrapper extends HttpServletRequestWrapper {      HttpServletRequest orgRequest = null;     private Map parameterMap;     private final byte[] body; //用于保存读取body中数据      public XssAndSqlHttpServletRequestWrapper(HttpServletRequest request) throws IOException{         super(request);         orgRequest = request;         parameterMap = request.getParameterMap();         body = StreamUtils.copyToByteArray(request.getInputStream());     }      // 重写几个HttpServletRequestWrapper中的方法     /**      * 获取所有参数名      *      * @return 返回所有参数名      */     @Override     public Enumeration getParameterNames() {         Vector vector = new Vector(parameterMap.keySet());         return vector.elements();     }      /**      * 覆盖getParameter方法,将参数名和参数值都做xss & sql过滤。
  * 如果需要获得原始的值,则通过super.getParameterValues(name)来获取
  * getParameterNames,getParameterValues和getParameterMap也可能需要覆盖      */     @Override     public String getParameter(String name) {         String[] results = parameterMap.get(name);         if (results == null || results.length <= 0)             return null;         else {             String value = results[0];             if (value != null) {                 value = xssEncode(value);             }             return value;         }     }      /**      * 获取指定参数名的所有值的数组,如:checkbox的所有数据 接收数组变量 ,如checkobx类型      */     @Override     public String[] getParameterValues(String name) {         String[] results = parameterMap.get(name);         if (results == null || results.length <= 0)             return null;         else {             int length = results.length;             for (int i = 0; i < length; i++) {                 results[i] = xssEncode(results[i]);             }             return results;         }     }      /**      * 覆盖getHeader方法,将参数名和参数值都做xss & sql过滤。
  * 如果需要获得原始的值,则通过super.getHeaders(name)来获取
  * getHeaderNames 也可能需要覆盖      */     @Override     public String getHeader(String name) {          String value = super.getHeader(xssEncode(name));         if (value != null) {             value = xssEncode(value);         }         return value;     }      /**      * 将容易引起xss & sql漏洞的半角字符直接替换成全角字符      *      * @param s      * @return      */     private static String xssEncode(String s) {         if (s == null || s.isEmpty()) {             return s;         } else {             s = stripXSSAndSql(s);         }         StringBuilder sb = new StringBuilder(s.length() + 16);         for (int i = 0; i < s.length(); i++) {             char c = s.charAt(i);             switch (c) {             case ">":                 sb.append(" ");// 转义大于号                 break;             case "<":                 sb.append(" ");// 转义小于号                 break;             // case """:             // sb.append("'");// 转义单引号             // break;             // case """:             // sb.append(""");// 转义双引号             // break;             case "&":                 sb.append("&");// 转义&                 break;             case "#":                 sb.append("#");// 转义#                 break;             default:                 sb.append(c);                 break;             }         }         return sb.toString();     }      /**      * 获取最原始的request      *      * @return      */     public HttpServletRequest getOrgRequest() {         return orgRequest;     }      /**      * 获取最原始的request的静态方法      *      * @return      */     public static HttpServletRequest getOrgRequest(HttpServletRequest req) {         if (req instanceof XssAndSqlHttpServletRequestWrapper) {             return ((XssAndSqlHttpServletRequestWrapper) req).getOrgRequest();         }         return req;     }      /**      *      * 防止xss跨脚本攻击(替换,根据实际情况调整)      */      public static String stripXSSAndSql(String value) {         if (value != null) {             // NOTE: It"s highly recommended to use the ESAPI library and             // uncomment the following line to             // avoid encoded attacks.             // value = ESAPI.encoder().canonicalize(value);             // Avoid null characters             /** value = value.replaceAll("", ""); ***/             // Avoid anything between script tags             Pattern scriptPattern = Pattern.compile(                     "<[r | | ]*script[r | | ]*>(.*?)", Pattern.CASE_INSENSITIVE);             value = scriptPattern.matcher(value).replaceAll("");             // Avoid anything in a             // src="/a2020/img/data-img.jpg" data-src="http://www.yihaomen.com/article/java/..." type of             // e-xpression             scriptPattern = Pattern.compile("src[r | | ]*=[r | | ]*["|\"](.*?)["|\"]",                     Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);             value = scriptPattern.matcher(value).replaceAll("");             // Remove any lonesome  tag             scriptPattern = Pattern.compile("", Pattern.CASE_INSENSITIVE);             value = scriptPattern.matcher(value).replaceAll("");             // Remove any lonesome  tag             scriptPattern = Pattern.compile("", Pattern.CASE_INSENSITIVE);             flag = scriptPattern.matcher(value).find();             if (flag) {                 return flag;             }             // Remove any lonesome

土豆里加一块豆腐,随手一做,太好吃了,用来招待客人超有面子生活没有彩排,美食没有美颜。大家好,今天用土豆搭配豆腐给大家分享一道美食。土豆和豆腐都是日常生活中常见的两种食材,可以分开做出各种各样好吃的美食,吃起来味道特别棒。今天我们要用土豆绿豆汤不要直接下锅煮,大厨教你一招,又绿又绵,10分钟煮开花大家好,我是慧慧,很多人都不知道绿豆汤最忌直接下锅煮,今天给大家分享一招,煮熟后的绿豆汤颜色翠绿还出痧,主要还特别节省时间下下面来看一下是怎么做的吧。首先在大碗里倒入适量的绿豆,倒辣椒酱不用去超市买,4种辣椒酱做法,香辣开胃,放一年都不坏本期导读辣椒酱不用去超市买,4种辣椒酱做法,香辣开胃,放一年都不坏秋季,是丰收的季节,红辣椒大量上市,辣椒在夏季时是绿色的,到了秋季大多数都变成了红色,价格也便宜,秋季,天气凉爽,陕西人喝酒怪象高档喝茅台,低档绿脖西凤,但更偏爱这4款陕西人好热闹重感情,平日里就喜欢抿两口小酒。虽然酒量不如东北人和山东人,但这丝毫不影响陕西人对美酒的喜爱。陕西人喝酒也十分随意,只要你说喝不了了,东道主便不会再劝酒。另外,在他们的不骗你!吃肉能帮助减肥,健康长寿!3个吃肉真相,不知道就亏了在中国人的餐桌上,肉可算是当仁不让的主角,宴会酒席朋友聚餐家庭餐桌居家饮食,有肉才叫滋润才叫丰盛!可不知道什么时候起,身边经常会发现一些素食主义者,就是不吃肉的人。有的是怕长胖,认入睡难,是胃不通,一个千年古方,和胃理气,胃气一通,入睡轻松大家好,我是沈医生,入睡难,是因为胃气不通了,今天沈医生给你分享一个千年古方,和胃理气,催眠安神,胃气一通,入睡轻松!失眠的朋友有没有注意过,自己总是睡前翻来覆去睡不着,晚上9点躺好家伙,又来一个私生子?该说不说,港媒小报是真的啥瓜都敢放啊01hr这是可以信的吗?这两天,大家恐怕都被这样一则港媒消息刷屏了吧成龙邓丽君私生子今日相认,抱头房祖轩痛哭我对不起你和你妈。我是没想到,这么一你的善良,需要一点锋芒人生是边走边悟的过程,有些道理要经历生活的千锤万练,而后懂得。有些话,或许不那么悦耳,却能帮助我们正视自己,让我们在看待世界时,多一个视角,多一重思考。5个生活感悟,请收!01hr一念秋风起,一念相思落走廊里的微风吹过,一缕清凉的风拂过鼻尖,感受到了秋天的温柔。踏着满阶落叶的小径,秋天的诗意就在这一张张的落叶之中,它们舒展地平躺着仰望天空或卷缩着紧紧守住自己的秘密,秋的诗意在窸窸谷神星的迷人之处谷神星(Ceres,sreriz小行星序号1Ceres符号)是火星和木星轨道之间的主小行星带中最亮的天体。它的直是火星和木星轨道之间的主小行星带中最亮的天体。它的直径大约是945公女排最佳16人已出炉,蔡斌夺冠的信心大增,郎平陈忠和也要开心了女排的16人正式的公布,然而蔡斌主教练却忽略了顶级的三名选手,在接下来的国际大赛,依旧有很大的机会去争夺冠军。但是郎平以及陈忠和给出来的劝告,一定要听进去,对于我们女排队伍,要拿到
季后赛需要证明自己的球星哈登饱受争议,急需证明,戈贝尔次之NBA本赛季的季后赛已经开始,各支球队都在为了总冠军而战斗。众所周知,NBA季后赛是最能检验一名球员实力与名气的舞台,每年,NBA季后赛都给已经在联盟中打出名堂的球星们一个证明自己本赛季异军突起的十大球员,马克西普尔大放异彩,莫兰特居首本赛季的NBA常规赛已经落下帷幕,关于本赛季的MVP等奖项也在紧锣密鼓的评选之中,不出意外,全能王约基奇大概率会连任常规赛MVP,除了媒体评选出来的MVP最佳阵容等奖项外,最受球迷科比的81分和麦迪的35秒13分,在当时哪一个比较震惊全球?81分无论是难度还是震撼很简单的道理,任何一个NBA名人堂甚至全明星级别的球星都可以在手感火热的时候连进数球,但是你没法把火热的手感保持一整场,只有科比做到了,也只有科比,用46次篮网队就是NBA的终极版罗夏测验,一个硬币的两面,你的篮网如何凯文杜兰特和凯里欧文在对阵骑士时看上去就像有击败一切的实力然而布鲁克林篮网仅仅是在第四节勉强取胜。这会让你对这支篮网印象深刻?还是感觉他们困难重重?答案在于你如何看待这支布鲁克林篮乔治该离开快船了?美媒建议3重磅方案,换掘金2新星2首轮想太多保罗乔治在为快船效力至今确实没能率领球队在季后赛中取得成功,但这主要还是因为球队确实面临较为严重的伤病问题,尤其是科怀伦纳德的伤病。所以在球队本赛季仍无法取得成功的情况下,快船也完科学想象力失败的前10个理论有人会说,科学是一项事业,应该只关注冷酷无情的事实。想象力的飞行应该是哲学家和诗人的领域。另一方面,正如阿尔伯特爱因斯坦敏锐地观察到的那样,想象力比知识更重要。他说,知识仅限于我们谁能想到,京医通竟是靠一人之力苦苦撑了7年在北京生活过的人,多多少少都使用过京医通,这个就诊卡覆盖了北京大部分的医院,让预约挂号变得简单方便。但谁能想到,方便了5500万人就医的京医通,基本没有政府资金的支持,竟是靠一人之谷歌与NBA联手推广元宇宙赛事应用,微美全息AR直播打好生态基底据外媒报道,为庆祝NBA季后赛回归,谷歌(GOOG。US)和NBA联手推出元宇宙项目GooglePixelArena,为球迷带来了一种全新体验比赛的新方式。GooglePixelA正式签约!中国篮坛名帅加盟豪门球队,带领球队冲击总冠军作为中国篮坛的豪门球队,四川女篮连续两个赛季冲击总冠军失败,休赛期球队也是迎来新的调整。从四川女篮官方社媒官宣的消息来看,俱乐部已聘请原国少队国青队和国奥队主教练王桂芝担任主教练,重磅,广东王牌外援威姆斯真的走了,朱芳雨摊牌了,降薪也不行回顾CBA半决赛,广东男篮除了易建联发挥不佳,外援威姆斯也始终处于低迷,加上周鹏等5位球员也都高挂免战牌,最终不可避免地被辽宁横扫。除了本土球员发挥不佳,外援低迷更是输球的最大因素忠于所爱,CBA总决赛开赛前,辽宁男篮海报受到央媒点赞北京时间4月20日,CBA总决赛即将拉开帷幕,开赛之前辽宁男篮的海报忠于所爱受到了央媒的点赞,海报中并没有宣战,而且一支手臂缠满了绷带,绷带上面写有受伤运动员的名字。这一轮总决赛注