安全漏洞修复帖

一、修复HTTP 响应头缺失

Nginx

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

Tomcat

Security认证:
在这里插入图片描述
Filter:
在这里插入图片描述

响应头:值

  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 属性

在这里插入图片描述

三、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 方法

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值