安全漏洞修复帖

对于项目漏洞都是一堆又不重要又很重要的事情

  • 一、修复HTTP 响应头缺失
    • Nginx
    • Tomcat
  • 响应头:值
  • 二、会话 Cookie 中缺少 secure 属性
  • 三、Html form 表单没有 CSRF 防护
    • Security的示例
    • Shiro的示例
  • 四、Host 头攻击
    • Nginx
    • Tomcat
    • Apache
  • 五、开启 options 方法

一、修复HTTP 响应头缺失

Nginx

nginx.conf配置文件中location / {
	add_header 响应头 值;
}

Tomcat

Security认证:
安全漏洞修复帖_第1张图片
Filter:
安全漏洞修复帖_第2张图片

响应头:值

  1. X-Frame-Options SAMEORIGIN;
    SAMEORIGIN 表示该页面可以在相同域名页面的frame中展示

  2. X-Content-Type-Options: nosniff;
    禁止服务器自动解析资源类型

  3. X-XSS-Protection “1; mode=block”;
    mode=block:启用XSS保护,并在检查到XSS攻击时,停止渲染页面(例如IE8中,检查到攻击时,整个页面会被一个#替换

  4. Content-Security-Policy “default-src *;style-src ‘self’ ‘unsafe-inline’;script-src ‘self’ ‘unsafe-inline’ ‘unsafe-eval’;img-src * data:;worker-src * blob:;font-src ‘self’ data:;”;
    default-src 定义针对所有类型资源的默认加载策略,
    self 允许加载相同源的内容

  5. Strict-Transport-Security “max-age=63072000; includeSubdomains; preload”;
    其可选的值有: max-age=SECONDS,表示本次命令在未来的生效时间 includeSubDomains,可以用来指定是否对子域名生效 漏洞危害

  6. X-Permitted-Cross-Domain-Policies none;
    none:不设置

  7. X-Download-Options: noopen;
    noopen:用于指定IE 8以上版本的用户不打开文件而直接保存文件。在下载对话框中不显示“打开”选项。

  8. Referrer-Policy “no-referrer”;不允许被记录

二、会话 Cookie 中缺少 secure 属性

安全漏洞修复帖_第3张图片

三、Html form 表单没有 CSRF 防护

Security的示例

演示如何添加CSRF防护
1、在Spring Boot中验证CSRF token
在Spring Boot中,可以使用CsrfToken接口来获取和验证CSRF token。下面是一个基于Spring MVC的控制器示例,演示如何获取和验证CSRF token:

@Controller
public class MyController {

    @Autowired
    private CsrfTokenRepository csrfTokenRepository;

    @GetMapping("/")
    public String index(Model model, HttpServletRequest request) {
        CsrfToken csrfToken = csrfTokenRepository.generateToken(request);
        model.addAttribute("_csrf", csrfToken);
        return "index";
    }

    @PostMapping("/submit")
    public String submit(@RequestParam("_csrf") CsrfToken csrfToken, Model model) {
        if (csrfToken == null) {
            throw new IllegalArgumentException("Missing CSRF token");
        }
        // 验证CSRF token是否正确
        boolean valid = csrfTokenRepository.loadToken(request)
            .map(t -> t.equals(csrfToken))
            .orElse(false);
        if (!valid) {
            throw new IllegalArgumentException("Invalid CSRF token");
        }
        // 处理表单提交
        return "result";
    }
}

2、在表单中添加CSRF token
在表单中添加一个隐藏的input标签,包含一个生成的CSRF token:

<form action="/submit" method="post">
  <input type="hidden" name="_csrf" value="${_csrf.token}" />
  <label for="name">Name:</label>
  <input type="text" id="name" name="name" />
  <button type="submit">Submit</button>
</form>

3、在Spring Boot中配置CSRF防护
在Spring Boot中配置CSRF防护需要使用CsrfTokenRepository接口来生成和存储CSRF token。在Spring Boot中,默认情况下,CsrfTokenRepository会将CSRF token存储在session中,可以使用HttpSessionCsrfTokenRepository类来配置。

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
    }
}

Shiro的示例

当使用Shiro作为安全框架时,可以采取以下步骤来添加CSRF防护:
1、在Shiro中启用CSRF防护
在Shiro中启用CSRF防护需要在Shiro的配置文件中添加以下内容:

<bean id="csrfTokenManager" class="org.apache.shiro.web.csrf.CsrfTokenManager"/>

上面的配置会创建一个CsrfTokenManager实例,该实例负责生成和验证CSRF token。

2、在表单中添加CSRF token
在表单中添加一个隐藏的input标签,包含一个生成的CSRF token:

<form action="/submit" method="post">
  <input type="hidden" name="_csrf" value="${csrfTokenManager.token}" />
  <label for="name">Name:</label>
  <input type="text" id="name" name="name" />
  <button type="submit">Submit</button>
</form>

在上面的示例中,使用${csrfTokenManager.token}表达式从CsrfTokenManager获取CSRF token,并将其添加到表单中。

3、在Shiro中验证CSRF token
在Shiro中,可以使用CsrfTokenManager来获取和验证CSRF token。下面是一个基于Shiro的控制器示例,演示如何获取和验证CSRF token:

@Controller
public class MyController {

    @Autowired
    private CsrfTokenManager csrfTokenManager;

    @GetMapping("/")
    public String index(Model model) {
        CsrfToken csrfToken = csrfTokenManager.getToken();
        model.addAttribute("csrfTokenManager", csrfTokenManager);
        return "index";
    }

    @PostMapping("/submit")
    public String submit(@RequestParam("_csrf") String csrfToken, Model model) {
        if (csrfToken == null) {
            throw new IllegalArgumentException("Missing CSRF token");
        }
        // 验证CSRF token是否正确
        boolean valid = csrfTokenManager.isValid(csrfToken);
        if (!valid) {
            throw new IllegalArgumentException("Invalid CSRF token");
        }
        // 处理表单提交
        return "result";
    }
}

四、Host 头攻击

Nginx

修改ngnix.conf文件,在server中指定一个server_name名单,并添加检测。值可为IP或域名

Tomcat

修改server.xml文件,配置Host的name属性,值可为IP或域名

Apache

修改httpd.conf文件,指定ServerName,并开启UseCanonicalName选项。

五、开启 options 方法

安全漏洞修复帖_第4张图片

你可能感兴趣的:(安全漏洞,java,网络安全,系统安全,web安全,安全性测试)