Spring Security Web : FirewalledResponse 经过防火墙加强安全的响应

本文介绍了Spring Security Web中一个带有防火墙增强安全能力的实现。它作为安全增强包装器,在设置响应头部、添加值、重定向时做安全增强,违反规则会抛异常。还提及继承关系、使用介绍,给出源代码版本及参考文章。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

功能介绍

FirewalledResponseSpring Security Web提供的一个HttpServletResponse实现,是一个带有防火墙增强安全能力的HttpServletResponse实现,被HttpFirewall对象用于对一个HttpServletResponse进行安全增强的包装器。

通过FirewalledResponse的包装,它对HttpServletResponse做了如下安全增强:

  1. 设置或者添加响应头部时,确保写入的头部值不包含\r或者\n;

    有关方法 : #setHeader,#addHeader

  2. 添加cookie时,确保写入的值不包含\r或者\n;

    有关方法 : #addCookie

  3. 重定向时,确保重定向location中不包含\r或者\n;

    有关方法 : #sendRedirect

FirewalledResponse对写入响应的值所做的增强逻辑中,如果所写入的值违反了规则,则会抛出异常IllegalArgumentException

继承关系

FirewalledResponse

使用介绍

HttpFirewall的两个实现类StrictHttpFirewall,DefaultHttpFirewall都用到了FirewalledResponse,具体用法如下 :

	@Override
	public HttpServletResponse getFirewalledResponse(HttpServletResponse response) {
		return new FirewalledResponse(response);
	}

源代码

源代码版本 : Spring Security Web 5.1.4.RELEASE

package org.springframework.security.web.firewall;

import java.io.IOException;
import java.util.regex.Pattern;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

class FirewalledResponse extends HttpServletResponseWrapper {
	private static final Pattern CR_OR_LF = Pattern.compile("\\r|\\n");
	private static final String LOCATION_HEADER = "Location";
	private static final String SET_COOKIE_HEADER = "Set-Cookie";

	public FirewalledResponse(HttpServletResponse response) {
		super(response);
	}

	@Override
	public void sendRedirect(String location) throws IOException {
		// TODO: implement pluggable validation, instead of simple blacklisting.
		// SEC-1790. Prevent redirects containing CRLF
		validateCrlf(LOCATION_HEADER, location);
		super.sendRedirect(location);
	}

	@Override
	public void setHeader(String name, String value) {
		validateCrlf(name, value);
		super.setHeader(name, value);
	}

	@Override
	public void addHeader(String name, String value) {
		validateCrlf(name, value);
		super.addHeader(name, value);
	}

	@Override
	public void addCookie(Cookie cookie) {
		if (cookie != null) {
			validateCrlf(SET_COOKIE_HEADER, cookie.getName());
			validateCrlf(SET_COOKIE_HEADER, cookie.getValue());
			validateCrlf(SET_COOKIE_HEADER, cookie.getPath());
			validateCrlf(SET_COOKIE_HEADER, cookie.getDomain());
			validateCrlf(SET_COOKIE_HEADER, cookie.getComment());
		}
		super.addCookie(cookie);
	}

	void validateCrlf(String name, String value) {
		if (hasCrlf(name) || hasCrlf(value)) {
			throw new IllegalArgumentException(
					"Invalid characters (CR/LF) in header " + name);
		}
	}

	private boolean hasCrlf(String value) {
		return value != null && CR_OR_LF.matcher(value).find();
	}
}

参考文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值