nginx.conf配置文件中location / {
add_header 响应头 值;
}
X-Frame-Options SAMEORIGIN;
SAMEORIGIN 表示该页面可以在相同域名页面的frame中展示
X-Content-Type-Options: nosniff;
禁止服务器自动解析资源类型
X-XSS-Protection “1; mode=block”;
mode=block:启用XSS保护,并在检查到XSS攻击时,停止渲染页面(例如IE8中,检查到攻击时,整个页面会被一个#替换
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 允许加载相同源的内容
Strict-Transport-Security “max-age=63072000; includeSubdomains; preload”;
其可选的值有: max-age=SECONDS,表示本次命令在未来的生效时间 includeSubDomains,可以用来指定是否对子域名生效 漏洞危害
X-Permitted-Cross-Domain-Policies none;
none:不设置
X-Download-Options: noopen;
noopen:用于指定IE 8以上版本的用户不打开文件而直接保存文件。在下载对话框中不显示“打开”选项。
Referrer-Policy “no-referrer”;不允许被记录
演示如何添加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作为安全框架时,可以采取以下步骤来添加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";
}
}
修改ngnix.conf文件,在server中指定一个server_name名单,并添加检测。值可为IP或域名
修改server.xml文件,配置Host的name属性,值可为IP或域名
修改httpd.conf文件,指定ServerName,并开启UseCanonicalName选项。