当前位置:   article > 正文

Spring Security Web : DefaultHttpFirewall HTTP防火墙(缺省模式)_springboot default firewall 与

springboot default firewall 与

概述

功能介绍

DefaultHttpFirewallSpring Security Web提供的一个HTTP防火墙(对应概念模型接口HttpFirewall)实现。该实现是所谓的缺省实现,但实际上Spring Security Web缺省使用的并不是DefaultHttpFirewall,而是严格模式的StrictHttpFirewall。其原因主要是StrictHttpFirewall对安全限制更严格,但是开发人员也可以设置Spring Security Web使用DefaultHttpFirewall

DefaultHttpFirewall所应用的安全规则比较少,主要有:

  1. 如果请求URL不是标准化(normalize)的URL则该请求会被拒绝,以避免安全限制被绕过。

    • 该规则不能被禁用。
    • 仅仅检查servletPathpathInfo部分,不检查contextPath

    这里标准化的URL必须符合以下条件 :
    指定路径中,必须不能包含以下字符串序列之一 :
    ["//","./","/…/","/."]

  2. 如果请求URLURL编码后)包含了斜杠(%2f或者%2F)则该请求会被拒绝。

    通过开关函数setAllowUrlEncodedSlash(boolean) 可以设置是否关闭该规则。缺省使用该规则。

如果请求违反了以上安全规则中的任何一条,DefaultHttpFirewall会通过抛出异常RequestRejectedException拒绝该请求。

继承关系

DefaultHttpFirewall

使用介绍

缺省情况下DefaultHttpFirewall并没有被Spring Security Web使用。如果想使用DefaultHttpFirewall,可以调用FilterChainProxy#setFirewall

源代码

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

package org.springframework.security.web.firewall;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class DefaultHttpFirewall implements HttpFirewall {
	private boolean allowUrlEncodedSlash;

	@Override
	public FirewalledRequest getFirewalledRequest(HttpServletRequest request) throws RequestRejectedException {
		FirewalledRequest fwr = new RequestWrapper(request);

		if (!isNormalized(fwr.getServletPath()) || !isNormalized(fwr.getPathInfo())) {
			throw new RequestRejectedException("Un-normalized paths are not supported: " + fwr.getServletPath()
					+ (fwr.getPathInfo() != null ? fwr.getPathInfo() : ""));
		}

		String requestURI = fwr.getRequestURI();
		if (containsInvalidUrlEncodedSlash(requestURI)) {
			throw new RequestRejectedException("The requestURI cannot contain encoded slash. Got " + requestURI);
		}

		return fwr;
	}

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

	
	public void setAllowUrlEncodedSlash(boolean allowUrlEncodedSlash) {
		this.allowUrlEncodedSlash = allowUrlEncodedSlash;
	}

	private boolean containsInvalidUrlEncodedSlash(String uri) {
		if (this.allowUrlEncodedSlash || uri == null) {
			return false;
		}

		if (uri.contains("%2f") || uri.contains("%2F")) {
			return true;
		}

		return false;
	}


	private boolean isNormalized(String path) {
		if (path == null) {
			return true;
		}

		for (int j = path.length(); j > 0;) {
			int i = path.lastIndexOf('/', j - 1);
			int gap = j - i;

			if (gap == 2 && path.charAt(i + 1) == '.') {
				// ".", "/./" or "/."
				return false;
			} else if (gap == 3 && path.charAt(i + 1) == '.' && path.charAt(i + 2) == '.') {
				return false;
			}

			j = i;
		}

		return true;
	}

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73

参考文章

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/812567
推荐阅读
相关标签
  

闽ICP备14008679号