Spring Security Web : FirewalledResponse 经过防火墙加强安全的响应
概述
功能介绍
FirewalledResponse
是Spring Security Web
提供的一个HttpServletResponse
实现,是一个带有防火墙增强安全能力的HttpServletResponse
实现,被HttpFirewall
对象用于对一个HttpServletResponse
进行安全增强的包装器。
通过FirewalledResponse
的包装,它对HttpServletResponse
做了如下安全增强:
- 设置或者添加响应头部时,确保写入的头部值不包含
\r
或者\n
;有关方法 :
#setHeader
,#addHeader
- 添加
cookie
时,确保写入的值不包含\r
或者\n
;
有关方法 :
#addCookie
- 重定向时,确保重定向
location
中不包含\r
或者\n
;
有关方法 :
#sendRedirect
FirewalledResponse
对写入响应的值所做的增强逻辑中,如果所写入的值违反了规则,则会抛出异常IllegalArgumentException
。
继承关系
使用介绍
HttpFirewall
的两个实现类StrictHttpFirewall
,DefaultHttpFirewall
都用到了FirewalledResponse
,具体用法如下 :
@Overridepublic 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);}@Overridepublic void sendRedirect(String location) throws IOException {// TODO: implement pluggable validation, instead of simple blacklisting.// SEC-1790. Prevent redirects containing CRLFvalidateCrlf(LOCATION_HEADER, location);super.sendRedirect(location);}@Overridepublic void setHeader(String name, String value) {validateCrlf(name, value);super.setHeader(name, value);}@Overridepublic void addHeader(String name, String value) {validateCrlf(name, value);super.addHeader(name, value);}@Overridepublic 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();}
}
参考文章
- Spring Security Web : Web安全过滤器链代理对象 FilterChainProxy
- Spring Security Web : StrictHttpFirewall HTTP防火墙(严格模式)
- Spring Security Web : DefaultHttpFirewall HTTP防火墙(缺省模式)
- Spring Security Web : 概念模型接口 HttpFirewall
Spring Security Web : FirewalledResponse 经过防火墙加强安全的响应相关推荐
- Spring Security Web : AbstractAuthenticationTargetUrlRequestHandler
概述 AbstractAuthenticationTargetUrlRequestHandler是Spring Security Web提供的一个抽象类,它主要实现了这样一种策略 : 认证动作成功时使 ...
- Spring Security Web : DefaultWebSecurityExpressionHandler 缺省Web安全表达式处理器
概述 DefaultWebSecurityExpressionHandler是Spring Security Web用于Web安全表达式处理器(handler).它会基于一组缺省配置,和当时的环境,对 ...
- 在15分钟内使用Spring Boot和Spring Security构建一个Web应用程序
"我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. 开发人员 ...
- Spring Security OAuth2.0认证授权知识概括
Spring Security OAuth2.0认证授权知识概括 安全框架基本概念 基于Session的认证方式 Spring Security简介 SpringSecurity详解 分布式系统认证方 ...
- Spring Security 参考手册(一)
Spring Security 参考手册 Ben AlexLuke TaylorRob WinchGunnar Hillert Spring security 是一个强大的和高度可定制的身份验证和访问 ...
- 8.Spring security中的HttpFirewall
文章目录 *`HttpFirewall`* *8.1`HttpFirewall`简介* *8.2`HttpFirewall`严格模式* *8.2.1`rejectForbiddenHttpMethod ...
- Spring Security中文文档
Spring Security中文文档 来源:https://www.springcloud.cc/spring-security.html#overall-architecture 作者 Ben A ...
- Spring Security 5.0.x 参考手册 【翻译自官方GIT-2018.06.12】
源码请移步至: https://github.com/aquariuspj/spring-security/tree/translator/docs/manual/src/docs/asciidoc ...
- Spring Security 实战:Spring Boot 下的自动配置
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | 公众号「码农小胖哥」 1. 前言 我们在前几篇 ...
最新文章
- ACNO.15猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。 第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。 到第N天早上想再
- JSP的基本构成详解
- C++中申请内存的正确方法
- nginx+upsync+consul 构建动态nginx配置系统
- linux下面navicat调整字体
- 消息队列面试 - 如何保证消息队列的高可用?
- mysql下载环境_windows下安装mysql需要什么环境
- js 判断是否是 整数
- 广告传媒实际税负怎么计算_传媒宣传业增值税税负多少
- 数据集:工人与机床对日产量的影响
- 2015校招某度WEB前端笔试题
- AsposeWord转pdf的正确姿势
- MySQL5.7源码在MacOS+Clion上的单步调试
- [转]Sublime Text 2 设置文件详解
- SpinalNet: Deep Neural Network with Gradual Input
- layui数据表格中包含图片的处理方式
- SSL证书的加密算法有哪些?
- 脚注交叉引用序号不一样_学会Word交叉引用,再也不用一个一个改编号了
- Dynamics 365 FO学习笔记
- 机动车排放微观控制-汽油机内净化技术
热门文章
- 【Java】StudentsInfoQuery(简单的学生信息查询系统)
- “数据”到底是资产还是负债?
- 火车头采集之采集规则编写
- 基于扩张状态观测器eso扰动补偿和权重因子调节的电流预测控制,相比传统方法,增加了参数鲁棒性
- 怎样快速解决EDIUS中文件无法打开问题
- 蚂蜂窝 VP 都斌:1.2 亿用户背后的数据驱动
- Android 62 自制域名解析 服务 花生壳太贵
- 谈谈前端角度出发做好SEO需要考虑什么?
- Java 求a+b的值
- 巴菲特的获利秘诀——“5+12+8+2”