首页 > 其他分享 >安全漏洞修复-常见问题及解决方案汇总

安全漏洞修复-常见问题及解决方案汇总

时间:2022-12-07 17:14:49浏览次数:96  
标签:常见问题 servletResponse serverName 汇总 nginx 404 referer 安全漏洞 import

1.跨站点请求伪造

在项目进行安全测试时,通过AppScan进行漏洞扫描,出现一下问题:

 

 也就是说请求头中缺失"Referer"或未验证Referer的值。由于是前后端分离的项目,前端使用nginx代理,后端部署在tomcat上。因此在后端需要验证Referer的值,添加如下的过滤器:

package com.ljxx.common.filter;

import com.alibaba.fastjson2.JSON;
import com.zxh.model.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Slf4j
@Configuration
@WebFilter(filterName = "CsrfFilter", urlPatterns = "/*")
public class CsrfFilter implements Filter {
    /**
     * 过滤器配置对象
     */
    FilterConfig filterConfig = null;


    /**
     * 忽略的URL
     */
    @Value("${security.csrf.excludes}")
    private String excludes;


    @Override
    public void init(FilterConfig filterConfig) {
        this.filterConfig = filterConfig;
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;

        // 已忽略的URL不拦截
        if (isExcludeUrl(request.getServletPath())) {
            filterChain.doFilter(servletRequest, servletResponse);
            return;
        }

        String referer = request.getHeader("Referer");
        String serverName = request.getServerName();
        //本地开发的地址直接放行
        if (serverName.contains("localhost") || serverName.contains("127.0.0.1")) {
            filterChain.doFilter(servletRequest, servletResponse);
        } else {
            // 判断是否存在外链请求本站
            if (null != referer && referer.indexOf(serverName) < 0) {
                log.error("系统不支持当前域名的访问=> serverName:{} => referer:{}", serverName, referer);
                Result error = Result.error("系统不支持当前域名的访问,referer错误!", 502);
                servletResponse.setContentType("application/json; charset=utf-8");
                servletResponse.getWriter().write(JSON.toJSONString(error));
                servletResponse.getWriter().flush();
            } else {
                filterChain.doFilter(servletRequest, servletResponse);
            }
        }
    }

    @Override
    public void destroy() {
        this.filterConfig = null;
    }

    /**
     * 判断是否为忽略的URL
     *
     * @param url
     *            URL路径
     * @return true-忽略,false-过滤
     */
    private boolean isExcludeUrl(String url) {
        if (excludes == null || excludes.isEmpty()) {
            return false;
        }
        List<String> urls = Arrays.asList(excludes.split(","));
        return urls.stream().map(pattern -> Pattern.compile("^" + pattern)).map(p -> p.matcher(url))
                .anyMatch(Matcher::find);
    }
}

这里主要验证Referer的值,如果不是合法的值就直接返回错误信息。

除此之外,在nginx进行转发时,还需要将请求头信息带着,否则这里的服务名一直是127.0.0.1,具体配置详见nginx携带请求头

2."Content-Security-Policy"头缺失

需要配置请求头。具体配置哪种策略需见测试报告的解决建议或参考下面的配置。

3."Content-Security-Policy"头中缺少 "Frame-Anchors"策略或策略不安全

在nginx转发时添加请求头即可

location /api{
     ...
     add_header X-Frame-Options SAMEORIGIN;
     proxy_pass http://127.0.0.1:8001;
}

4."Content-Security-Policy" 头中缺少 "Script-Src" 策略或策略不安全

 在nginx转发时添加请求头即可

location /api{
     ...
     add_header Content-Security-Policy "script-src 'self' 'unsafe-inline' ";
     proxy_pass http://127.0.0.1:8001;
}

5."X-Content-Type-Options"头缺失或不安全

在nginx转发时添加请求头即可(在固定值中已进行了配置说明)

location /api{
     ...
     add_header X-Content-Type-Options nosniff;
     proxy_pass http://127.0.0.1:8001;
}

6."X-XSS-Protection"头缺失或不安全

 在nginx转发时添加请求头即可(在固定值中已进行了配置说明)

location /api{
     ...
     add_header X-XSS-Protection 1;
     proxy_pass http://127.0.0.1:8001;
}

7.检测到隐藏目录

 

 前端使用nginx代理,访问了不存在的路径出现403,解决办法就是将403转为404即可。首先在nginx的html目录新建404.html,内容自定义:

<html>
<head><title>404</title></head>
<meta charset="utf-8">
<body bgcolor="white">
<center><h1>404 - Not Found</h1></center>
</body>
</html>

然后在nginx的server模块中配置将403转到404页面:

server {
     ...
 
    error_page 403 =404 /404.html;
}

那么当访问出现403时就显示的404,在一定程度上保护了服务器的安全。

 

标签:常见问题,servletResponse,serverName,汇总,nginx,404,referer,安全漏洞,import
From: https://www.cnblogs.com/zys2019/p/16963401.html

相关文章

  • springboot不能识别controller中的接口地址原因汇总
    之前写一个模块的接口,定义好测通没问题发给同事,中间隔了两天加了些内容又测突然就报404找不到。在别的模块controller测试都能测通唯独这个测不通,见了鬼了。百度了好多原......
  • httpRunner使用汇总
    以前不了解httpRunner实现机制很不喜欢它,认为就是简单的接口录制与回放,只适合处理简单的接口逻辑。随着最近对httpRunner再次解读,发现它也能实现复杂接口的自动化用例,而且......
  • python字符串常用方法汇总
    常用方法如下:str="mynameis{name}andmyageis{age}"#统计字符串的长度print(len(str))#格式化输出也可当切片用的方式print(str.format(name="ming",ag......
  • mybatis-plus增删改查方法汇总
    //查询所有List<T>list();//查询列表List<T>list(Wrapper<T>queryWrapper);//查询(根据ID批量查询)Collection<T>listByIds(Collection<?extendsSerializable......
  • 社招前端经典vue面试题汇总
    用过pinia吗?有什么优点?1.pinia是什么?在Vue3中,可以使用传统的Vuex来实现状态管理,也可以使用最新的pinia来实现状态管理,我们来看看官网如何解释pinia的:Pinia是Vue的......
  • 项目中遇到的问题汇总,心得和体会
    最开始麻烦最大的还是环境的配置问题,需要注意以下几个方面数据库驱动的版本一定要和pom'文件中引用的版本一致在解决tomcat配置时耗费了很多时间,原因是本地jar包的路径......
  • 《MySQL必知必会》知识汇总四
    十七、插入数据本章将介绍如何利用sql的INSERT语句将数据插入表中数据插入插入分为以下几种方式:插入完整的行、插入行的一部分、插入多行、插入某些查询结果插入完......
  • 假期福利 | 林轩田《机器学习基石》资源汇总
    AI有道不可错过的AI技术公众号关注课程介绍台湾大学林轩田老师的《机器学习基石》课程由浅入深、内容全面,基本涵盖了机器学习领域的很多方面。其作为机器学习......
  • flink sql 程序消费kafka数据到mysql设置参数connector.url问题汇总
    1.问题现象:使用flinksql程序消费kafka数据写入mysql时,使用TVF表值函数,START_ENENT_TIME和END_ENENT_TIME始终比消费时间小大约13小时。解决办法在写入mysql的sink......
  • [软件测试] sonar 常见问题及修复思路
    1sonar常见问题及修复思路1.1空指针问题描述A"NullPointerException"couldbethrown;"localAddress"isnullablehere.问题代码[样例]//本地(服务器本......