当前位置: 首页 > news >正文

建设银行+贷款+查询+网站上海做网站去哪里

建设银行+贷款+查询+网站,上海做网站去哪里,手机上的网站,品牌建设体系在终端用户可以 登录 的应用程序中#xff0c;必须考虑如何防止 跨站请求伪造#xff08;CSRF#xff09;。 Spring Security 默认为 不安全的HTTP方法#xff08;如POST请求#xff09;提供CSRF攻击防护#xff0c;因此无需额外代码。你可以使用下面的方法明确指定默认…在终端用户可以 登录 的应用程序中必须考虑如何防止 跨站请求伪造CSRF。 Spring Security 默认为 不安全的HTTP方法如POST请求提供CSRF攻击防护因此无需额外代码。你可以使用下面的方法明确指定默认配置 Configure CSRF Protection Java Configuration EnableWebSecurity public class SecurityConfig {Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http// ....csrf(Customizer.withDefaults());return http.build();} } 一、了解 CSRF 保护的组件 CSRF 保护由 CsrfFilter 中的几个组件提供 Figure 1. CsrfFilter Components CSRF 保护分为两部分 通过委托 CsrfTokenRequestHandler使应用程序可以使用 CsrfToken。确定请求是否需要 CSRF 保护加载并验证 token处理 handle AccessDeniedException。 Figure 2. CsrfFilter Processing 首先 DeferredCsrfToken 被加载其中保存了对 CsrfTokenRepository 的引用以便在稍后加载持久化的 CsrfToken在第 步。其次SupplierCsrfToken由 DeferredCsrfToken 创建被提供给 CsrfTokenRequestHandlerCsrfTokenRequestHandler 负责填充请求属性使 CsrfToken 对应用程序的其他部分可用。接下来开始主要的 CSRF 保护处理并检查当前请求是否需要CSRF保护。如果不需要则继续 filter chain 并结束处理。如果需要CSRF保护则从 DeferredCsrfToken 中加载持久化的 CsrfToken。继续使用 CsrfTokenRequestHandler 解析客户端提供的实际CSRF token如有。将实际 CSRF token 与持久化的 CsrfToken 进行比较。如果有效则继续 filter chain 并结束处理。如果实际的 CSRF token 无效或缺失AccessDeniedException 将被传递给 AccessDeniedHandler 并结束处理。 二、迁移到 Spring Security 6 当从 Spring Security 5 迁移到 Spring Security 6 时有一些变化可能会影响你的应用程序。以下是Spring Security 6 中 CSRF 保护方面变化的概述 CsrfToken 的加载现在 默认为延迟加载不再要求每次请求都加载 session从而提高了性能。The CsrfToken now includes randomness on every request by default to protect the CSRF token from a BREACH attack. CsrfToken 现在默认在 每个请求中包含随机性以保护 CSRF token 免受 BREACH 攻击。 Spring Security 6 中的变化要求对单页应用程序进行额外的配置因此你可能会发现 单页应用SPA 部分特别有用。 有关迁移 Spring Security 5 应用程序的更多信息请参见 迁移 一章中的 漏洞利用保护 部分。 三、持久化CsrfToken CsrfToken 使用 CsrfTokenRepository 持久化。 默认情况下HttpSessionCsrfTokenRepository 用于在 session 中存储 token。Spring Security 还提供了用于在 cookie 中存储 token 的 CookieCsrfTokenRepository。你也可以 指定自己的实现 来存储 token。 1、使用HttpSessionCsrfTokenRepository 默认情况下Spring Security 通过使用 HttpSessionCsrfTokenRepository 将预期的 CSRF 令牌存储在 HttpSession 中因此无需额外代码。 HttpSessionCsrfTokenRepository 从名为 X-CSRF-TOKEN 的 HTTP 请求 header 或默认的请求参数 _csrf 中读取令牌。 你可以使用以下配置明确指定默认配置 Configure HttpSessionCsrfTokenRepository Java Configuration EnableWebSecurity public class SecurityConfig {Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http// ....csrf((csrf) - csrf.csrfTokenRepository(new HttpSessionCsrfTokenRepository()));return http.build();} } 2、使用CookieCsrfTokenRepository 你可以使用 CookieCsrfTokenRepository 将 CsrfToken 持久化在 cookie 中以支持 基于 JavaScript 的应用程序。 CookieCsrfTokenRepository 写入名为 XSRF-TOKEN 的 cookie并从名为 X-XSRF-TOKEN 的 HTTP 请求头或默认的请求参数 _csrf 中读取。这些默认值来自 Angular 及其前身 AngularJS。 请参阅 跨站请求伪造XSRF保护 指南和 HttpClientXsrfModule了解有关此主题的更多最新信息。 你可以使用以下配置配置 CookieCsrfTokenRepository Configure CookieCsrfTokenRepository Java Configuration EnableWebSecurity public class SecurityConfig {Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http// ....csrf((csrf) - csrf.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()));return http.build();} } 该示例明确地将 HttpOnly 设置为 false。这是允许 JavaScript框架如Angular读取它的必要条件。如果你不需要直接用 JavaScript 读取 cookie我们建议你省略 HttpOnly使用 new CookieCsrfTokenRepository() 代替以提高安全性。 3、自定义CsrfTokenRepository 在某些情况下你需要实现一个自定义的 CsrfTokenRepository。 一旦实现了 CsrfTokenRepository 接口就可以通过以下配置来使用 Spring Security Configure Custom CsrfTokenRepository Java Configuration EnableWebSecurity public class SecurityConfig {Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http// ....csrf((csrf) - csrf.csrfTokenRepository(new CustomCsrfTokenRepository()));return http.build();} } 四、处理 theCsrfToken CsrfToken 通过 CsrfTokenRequestHandler 提供给应用程序。该组件还负责从 HTTP header 或请求参数中解析 CsrfToken。 默认情况下XorCsrfTokenRequestAttributeHandler 用于提供 CsrfToken 的 BREACH 保护。Spring Security 还提供了 CsrfTokenRequestAttributeHandler 用于选择退出 BREACH 保护。你也可以指定 自己的实现 来定制处理和解析 token 的策略。 1、使用XorCsrfTokenRequestAttributeHandlerBREACH XorCsrfTokenRequestAttributeHandler 使 CsrfToken 作为名为 _csrf 的 HttpServletRequest attribute 可用并提供额外的 BREACH 保护。 CsrfToken 也可作为 request attribute 使用名称为 CsrfToken.class.getName()。该名称不可配置但可以使用 XorCsrfTokenRequestAttributeHandler#setCsrfRequestAttributeName 更改名称 _csrf。 该实现还将来自请求的 token 值解析为请求头默认为 X-CSRF-TOKEN 或 X-XSRF-TOKEN 之一或请求参数默认为 _csrf。 通过将随机性编码到 CSRF token 值中以确保每次请求时返回的 CsrfToken 都会发生变化从而提供 BREACH 保护。当 token 随后被解析为 header 值或请求参数时将对其进行解码以获得原始 token然后将其与持久化的 CsrfToken 进行比较。 Spring Security 默认保护 CSRF token 免受 BREACH 攻击因此无需额外代码。你可以使用以下配置明确指定默认配置 Configure BREACH protection Java Configuration EnableWebSecurity public class SecurityConfig {Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http// ....csrf((csrf) - csrf.csrfTokenRequestHandler(new XorCsrfTokenRequestAttributeHandler()));return http.build();} } 2、使用CsrfTokenRequestAttributeHandler CsrfTokenRequestAttributeHandler 使 CsrfToken 作为名为 _csrf 的 HttpServletRequest attribute 可用。 CsrfToken 也可作为 request attribute 使用名称为 CsrfToken.class.getName()。该名称不可配置但可使用 CsrfTokenRequestAttributeHandler#setCsrfRequestAttributeName 更改名称 _csrf。 该实现还将来自请求的 token 值解析为请求头默认为 X-CSRF-TOKEN 或 X-XSRF-TOKEN 之一或请求参数默认为 _csrf。 CsrfTokenRequestAttributeHandler 的主要用途是选择退出 CsrfToken 的 BREACH 保护可通过以下配置进行配置 Opt-out of BREACH protection Java Configuration EnableWebSecurity public class SecurityConfig {Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http// ....csrf((csrf) - csrf.csrfTokenRequestHandler(new CsrfTokenRequestAttributeHandler()));return http.build();} } 3、自定义CsrfTokenRequestHandler 你可以实现 CsrfTokenRequestHandler 接口来定制处理和解析 token 的策略。 CsrfTokenRequestHandler 接口是一个 FunctionalInterface 接口可以使用 lambda 表达式实现以自定义请求处理。你需要实现完整的接口来定制如何从请求中解析 token。请参阅 Configure CSRF for Single-Page Application以了解使用委托实现自定义策略来处理和解析 token 的示例。 一旦你实现了 CsrfTokenRequestHandler 接口你就可以通过以下配置来使用 Spring Security Configure Custom CsrfTokenRequestHandler Java Configuration EnableWebSecurity public class SecurityConfig {Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http// ....csrf((csrf) - csrf.csrfTokenRequestHandler(new CustomCsrfTokenRequestHandler()));return http.build();} } 五、延迟加载CsrfToken 默认情况下Spring Security 会推迟加载 CsrfToken直到需要时才加载。 在使用 不安全 HTTP 方法如 POST进行请求时都需要使用 CsrfToken。此外任何将 token 呈现在响应中的请求都需要该 token例如带有 form 标签的网页该标签包含一个用于 CSRF token 的隐藏 input。 由于 Spring Security 默认将 CsrfToken 存储在 HttpSession 中因此延迟 CSRF token 无需在每个请求中加载 session从而提高了性能。 如果你不希望使用延迟 token而希望在每次请求时加载 CsrfToken可以通过以下配置实现 Opt-out of Deferred CSRF Tokens Java Configuration EnableWebSecurity public class SecurityConfig {Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {XorCsrfTokenRequestAttributeHandler requestHandler new XorCsrfTokenRequestAttributeHandler();// set the name of the attribute the CsrfToken will be populated onrequestHandler.setCsrfRequestAttributeName(null);http// ....csrf((csrf) - csrf.csrfTokenRequestHandler(requestHandler));return http.build();} } 通过将 csrfRequestAttributeName 设置为 null必须首先加载 CsrfToken 以确定使用什么属性名。这将导致每次请求都加载 CsrfToken。 六、与 CSRF 保护整合 为了使 同步 token 模式 能够抵御 CSRF 攻击我们必须在HTTP请求中包含实际的 CSRF 令牌。这必须包含在请求的某个部分表单参数、HTTP头或其他部分中浏览器不会自动将其包含在 HTTP 请求中。 以下章节介绍了前端或客户端应用程序与受 CSRF 保护的后端应用程序集成的各种方式 HTML 表单JavaScript 应用移动端应用 1、HTML 表单 要提交 HTML 表单CSRF 令牌必须作为 hidden input 包含在表单中。例如渲染的 HTML 可能如下所示 CSRF Token in HTML Form input typehiddenname_csrfvalue4bfd1575-3ad1-4d21-96c7-4ef2d9f86721/ 以下视图技术会自动在具有不安全 HTTP 方法如 POST的表单中包含实际的 CSRF token Spring 的表单标签库Thymeleaf与 RequestDataValueProcessor 集成的任何其他视图技术通过 CsrfRequestDataValueProcessor。你也可以通过 csrfInput 标签自行包含 token。 如果没有这些选项你可以利用 CsrfToken 作为 名为 _csrf 的 HttpServletRequest 属性 这一事实。下面的示例通过JSP实现了这一点 CSRF Token in HTML Form with Request Attribute c:url varlogoutUrl value/logout/ form action${logoutUrl}methodpost input typesubmitvalueLog out / input typehiddenname${_csrf.parameterName}value${_csrf.token}/ /form 2、JavaScript 应用 JavaScript 应用程序通常使用 JSON 而不是 HTML。如果使用 JSON则可以在 HTTP 请求头而不是请求参数中提交 CSRF token。 为了获取CSRF token你可以配置 Spring Security 将预期的 CSRF token 存储在cookie中。通过在 cookie 中存储预期 token Angular 等 JavaScript 框架可以自动将实际的 CSRF token 作为 HTTP 请求头。 在将单页面应用程序SPA与 Spring Security 的 CSRF 保护集成时需要特别考虑 BREACH 保护和延迟 token。下一节 将提供完整的配置示例。 你可以在下面的章节中了解不同类型的 JavaScript 应用程序 单页应用SPA多页应用其他 JavaScript 应用 单页应用SPA 将单页应用程序SPA与 Spring Security 的 CSRF 保护集成在一起有一些特殊的注意事项。 回想一下Spring Security 默认为 CsrfToken 提供 BREACH 保护。当 在 cookie 中 存储预期的 CSRF token 时JavaScript 应用程序将只能访问纯 token 值而无法访问编码值。需要提供 自定义的 request handler 来解析实际 token 值。 此外存储 CSRF token 的 cookie 将在验证成功和注销成功时被清除。默认情况下Spring Security会延迟加载新的 CSRF token返回一个新的 cookie 需要额外的工作。 认证成功和注销成功后需要刷新令牌因为 CsrfAuthenticationStrategy 和 CsrfLogoutHandler 会清除之前的令牌。在未获得新令牌的情况下客户端应用程序将无法执行不安全的 HTTP 请求如 POST。 为了轻松地将单页应用程序与 Spring Security 集成可以使用以下配置 Configure CSRF for Single-Page Application Java Configuration EnableWebSecurity public class SecurityConfig {Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http// ....csrf((csrf) - csrf.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) .csrfTokenRequestHandler(new SpaCsrfTokenRequestHandler()) ).addFilterAfter(new CsrfCookieFilter(), BasicAuthenticationFilter.class); return http.build();} }final class SpaCsrfTokenRequestHandler extends CsrfTokenRequestAttributeHandler {private final CsrfTokenRequestHandler delegate new XorCsrfTokenRequestAttributeHandler();Overridepublic void handle(HttpServletRequest request, HttpServletResponse response, SupplierCsrfToken csrfToken) {/** Always use XorCsrfTokenRequestAttributeHandler to provide BREACH protection of* the CsrfToken when it is rendered in the response body.*/this.delegate.handle(request, response, csrfToken);}Overridepublic String resolveCsrfTokenValue(HttpServletRequest request, CsrfToken csrfToken) {/** If the request contains a request header, use CsrfTokenRequestAttributeHandler* to resolve the CsrfToken. This applies when a single-page application includes* the header value automatically, which was obtained via a cookie containing the* raw CsrfToken.*/if (StringUtils.hasText(request.getHeader(csrfToken.getHeaderName()))) {return super.resolveCsrfTokenValue(request, csrfToken);}/** In all other cases (e.g. if the request contains a request parameter), use* XorCsrfTokenRequestAttributeHandler to resolve the CsrfToken. This applies* when a server-side rendered form includes the _csrf request parameter as a* hidden input.*/return this.delegate.resolveCsrfTokenValue(request, csrfToken);} }final class CsrfCookieFilter extends OncePerRequestFilter {Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {CsrfToken csrfToken (CsrfToken) request.getAttribute(_csrf);// Render the token value to a cookie by causing the deferred token to be loadedcsrfToken.getToken();filterChain.doFilter(request, response);} } 配置 CookieCsrfTokenRepository 时将 HttpOnly 设置为 false这样 JavaScript 应用程序就可以读取 Cookie。 配置自定义的 CsrfTokenRequestHandler根据 CSRF token 是 HTTP 请求头X-XSRF-TOKEN还是请求参数_csrf来解析 CSRF token。 配置一个自定义 Filter在每次请求时加载 CsrfToken如果需要将返回一个新的 cookie。 多页应用 对于在每个页面上加载 JavaScript 的多页面应用程序除了 在 cookie 中 公开 CSRF token 外还可以在 meta 标签中包含 CSRF token。HTML可能如下所示 CSRF Token in HTML Meta Tag html headmeta name_csrf content4bfd1575-3ad1-4d21-96c7-4ef2d9f86721/meta name_csrf_header contentX-CSRF-TOKEN/!-- ... -- /head !-- ... -- /html 为了在请求中包含 CSRF token可以利用 CsrfToken 作为 名为 _csrf 的 HttpServletRequest 属性 的事实。下面的示例通过JSP实现了这一点 CSRF Token in HTML Meta Tag with Request Attribute html headmeta name_csrf content${_csrf.token}/!-- default header name is X-CSRF-TOKEN --meta name_csrf_header content${_csrf.headerName}/!-- ... -- /head !-- ... -- /html 一旦 meta 标签包含 CSRF tokenJavaScript 代码就可以读取 meta 标签并将 CSRF token 作为 header 包含在内。如果你使用 jQuery你可以通过以下代码来实现 Include CSRF Token in AJAX Request $(function () {var token $(meta[name_csrf]).attr(content);var header $(meta[name_csrf_header]).attr(content);$(document).ajaxSend(function(e, xhr, options) {xhr.setRequestHeader(header, token);}); }); 其他 JavaScript 应用 JavaScript 应用程序的另一种选择是在 HTTP 响应头中包含 CSRF 令牌。 实现这一点的方法之一是通过使用 CsrfTokenArgumentResolver 的 ControllerAdvice。下面是一个 ControllerAdvice 的示例它适用于应用程序中的所有 controller 端点 CSRF Token in HTTP Response Header Java ControllerAdvice public class CsrfControllerAdvice {ModelAttributepublic void getCsrfToken(HttpServletResponse response, CsrfToken csrfToken) {response.setHeader(csrfToken.getHeaderName(), csrfToken.getToken());}} 由于该 ControllerAdvice 适用于应用程序中的所有端点它将导致 CSRF token 在每个请求中加载这可能会抵消使用 HttpSessionCsrfTokenRepository 时 延迟 token 的好处。然而在使用 CookieCsrfTokenRepository 时这通常不是问题。 重要的是要记住controller 端点和 controller advice 是在 Spring Security filter chain 之后调用的。这意味着只有当请求通过 filter chain 到达你的应用程序时才会应用 ControllerAdvice。请参阅 单页应用程序的配置了解向 filter chain 添加 filter 以更早访问 HttpServletResponse 的示例。 对于 controller advice 适用的任何自定义端点CSRF token 现在可以在响应头默认为X-CSRF-TOKEN 或X-XSRF-TOKEN中获得。对后端的任何请求都可用于从响应中获取 token后续请求可将 token 包含在具有相同名称的请求头中。 3、移动端应用 与 JavaScript 应用程序 一样移动应用程序通常使用 JSON 而不是HTML。不提供浏览器流量的后端应用程序可以选择 禁用 CSRF。在这种情况下无需额外工作。 但是如果后端应用程序也提供浏览器流量因此仍然需要 CSRF 保护则可以继续将 CsrfToken 存储在 session 中而不是 cookie 中。 在这种情况下与后端集成的典型模式是暴露 /csrf 端点允许前端移动或浏览器客户端按需请求 CSRF token。使用这种模式的好处是CSRF token 可以继续延迟只有在请求需要 CSRF 保护时才需要从会话中加载。使用自定义端点还意味着客户端应用程序可以通过发出显式请求要求按需生成新 token如有必要。 这种模式可用于需要 CSRF 保护的任何类型的应用程序而不仅仅是移动应用程序。虽然在这些情况下通常不需要这种方法但它是与受 CSRF 保护的后端集成的另一种选择。 下面是一个使用 CsrfTokenArgumentResolver 的 /csrf 端点示例 The /csrf endpoint Java RestController public class CsrfController {GetMapping(/csrf)public CsrfToken csrf(CsrfToken csrfToken) {return csrfToken;}} 如果上述端点需要与服务器进行身份验证你可以考虑添加 .requestMatchers(/csrf).permitAll()。 在应用程序启动或初始化时如加载时以及在身份验证成功和注销成功后应调用该端点以获取 CSRF token。 认证成功和注销成功后需要刷新 token因为 CsrfAuthenticationStrategy 和 CsrfLogoutHandler 会清除之前的 token。在未获得新 token 的情况下客户端应用程序将无法执行不安全的 HTTP 请求如 POST。 获得CSRF令牌后你需要将其作为 HTTP 请求头默认为 X-CSRF-TOKEN 或 X-XSRF-TOKEN 之一。 七、处理AccessDeniedException 要处理诸如 InvalidCsrfTokenException 之类的 AccessDeniedException可以配置 Spring Security 以任何方式处理这些异常。例如你可以使用以下配置配置自定义拒绝访问页面 Configure AccessDeniedHandler Java Configuration EnableWebSecurity public class SecurityConfig {Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http// ....exceptionHandling((exceptionHandling) - exceptionHandling.accessDeniedPage(/access-denied));return http.build();} } 八、CSRF 测试 你可以使用 Spring Security 的 测试支持 和 CsrfRequestPostProcessor 来测试 CSRF 保护就像这样 Test CSRF Protection Java import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.*; import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;ExtendWith(SpringExtension.class) ContextConfiguration(classes SecurityConfig.class) WebAppConfiguration public class CsrfTests {private MockMvc mockMvc;BeforeEachpublic void setUp(WebApplicationContext applicationContext) {this.mockMvc MockMvcBuilders.webAppContextSetup(applicationContext).apply(springSecurity()).build();}Testpublic void loginWhenValidCsrfTokenThenSuccess() throws Exception {this.mockMvc.perform(post(/login).with(csrf()).accept(MediaType.TEXT_HTML).param(username, user).param(password, password)).andExpect(status().is3xxRedirection()).andExpect(header().string(HttpHeaders.LOCATION, /));}TestWithMockUserpublic void logoutWhenValidCsrfTokenThenSuccess() throws Exception {this.mockMvc.perform(post(/logout).with(csrf()).accept(MediaType.TEXT_HTML)).andExpect(status().is3xxRedirection()).andExpect(header().string(HttpHeaders.LOCATION, /login?logout));} } 九、禁用 CSRF 保护 默认情况下CSRF 保护是启用的这会影响 与后台的集成 和应用程序的 测试。在禁用 CSRF 保护之前请考虑这 对你的应用程序是否有意义。 你还可以考虑是否只有某些端点不需要 CSRF 保护并配置忽略规则如下例所示 Ignoring Requests Java Configuration EnableWebSecurity public class SecurityConfig {Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http// ....csrf((csrf) - csrf.ignoringRequestMatchers(/api/*));return http.build();} } 如果需要禁用 CSRF 保护可以使用以下配置 Disable CSRF Java Configuration EnableWebSecurity public class SecurityConfig {Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http// ....csrf((csrf) - csrf.disable());return http.build();} } 十、CSRF 注意事项 在实施 CSRF 攻击防护时有一些特殊的注意事项。本节将讨论与 servlet 环境相关的注意事项。有关更一般性的讨论请参阅 CSRF 注意事项。 1、登录 对 登录请求要求 CSRF 以防止伪造登录尝试是很重要的。Spring Security 的 Servlet 支持就能做到这一点。 2、注销 对 注销请求要求 CSRF 以防止伪造注销尝试是很重要的。如果启用了CSRF保护默认Spring Security 的 LogoutFilter 将只处理 HTTP POST 请求。这将确保注销需要 CSRF token恶意用户无法强行注销用户。 最简单的方法是使用表单注销用户。如果你真的需要一个链接你可以使用 JavaScript 让链接执行 POST也许在一个 hidden 表单上。对于禁用 JavaScript 的浏览器你可以选择让链接将用户带到一个执行 POST 的注销确认页面。 如果你真的想在注销时使用 HTTP GET你可以这样做。但请记住一般不建议这样做。例如当使用任何 HTTP 方法请求 /logout URL时将执行以下操作进行注销 Log Out with Any HTTP Method Java Configuration EnableWebSecurity public class SecurityConfig {Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http// ....logout((logout) - logout.logoutRequestMatcher(new AntPathRequestMatcher(/logout)));return http.build();} } 更多信息请参阅 注销 章节。 3、CSRF 和 session 超时 默认情况下Spring Security 使用 HttpSessionCsrfTokenRepository 将 CSRF token 存储在 HttpSession 中。这可能会导致 session 过期从而没有 CSRF token 进行验证。 我们已经讨论了 session 超时的 一般解决方案。本节将讨论与 servlet 支持相关的 CSRF 超时的具体问题。 你可以将 CSRF token 存储在 cookie 中。详情请参阅 使用 CookieCsrfTokenRepository 部分。 如果 token 过期你可能希望通过指定 自定义的 AccessDeniedHandler 来自定义处理方式。自定义的 AccessDeniedHandler 可以任意处理 InvalidCsrfTokenException。 4、Multipart文件上传 我们 已经讨论过 保护 multipart 请求文件上传免受CSRF攻击如何导致 鸡和蛋 的问题。当 JavaScript 可用时我们建议 将 CSRF token 包含在 HTTP 请求头中以避免这一问题。 如果 JavaScript 不可用下面将讨论在 servlet 应用程序的 body 和 url 中放置 CSRF token 的选项。 你可以在 Spring 参考文档的 Multipart Resolver 部分和 MultipartFilter javadoc 中找到更多关于在 Spring 中使用 multipart 表单的信息。 把 CSRF Token 放到 body 中 我们 已经讨论了 将 CSRF token 放在 body 中的利弊。在本节中我们将讨论如何配置 Spring Security 以从 body 中读取 CSRF。 为了从 body 中读取 CSRF token在 Spring Security filter 之前指定了 MultipartFilter。在 Spring Security filter 之前指定 MultipartFilter 意味着调用 MultipartFilter 没有授权这意味着任何人都可以在服务器上放置临时文件。然而只有经过授权的用户才能提交由应用程序处理的文件。一般来说这是推荐的方法因为临时文件上传对大多数服务器的影响可以忽略不计。 Configure MultipartFilter Java public class SecurityApplicationInitializer extends AbstractSecurityWebApplicationInitializer {Overrideprotected void beforeSpringSecurityFilterChain(ServletContext servletContext) {insertFilters(servletContext, new MultipartFilter());} } 为了确保 MultipartFilter 在 Spring Security filter 之前通过 XML 配置指定可以确保 MultipartFilter 的 filter-mapping 元素放在 web.xml 文件中的 springSecurityFilterChain 之前。 在 ULR 中包含 CSRF Token 如果不能接受让未经授权的用户上传临时文件另一种方法是将 MultipartFilter 放在 Spring Security filter 之后并将 CSRF 作为查询参数包含在表单的 action 属性中。由于 CsrfToken 是作为 名为 _csrf 的 HttpServletRequest 属性 公开的因此我们可以使用它来创建一个包含 CSRF token 的 action 。下面的示例通过 JSP 实现了这一点 CSRF Token in Action form methodpostaction./upload?${_csrf.parameterName}${_csrf.token}enctypemultipart/form-data 5、HiddenHttpMethodFilter 在 Spring 的 Servlet 支持中覆盖 HTTP 方法是通过使用 HiddenHttpMethodFilter 来实现的。 REST的一个关键原则是使用“统一接口”。这意味着可以使用相同的四个HTTP方法来操作所有资源URLGET、PUT、POST和DELETE。对于每个方法HTTP规范都定义了确切的语义。例如GET应该始终是安全操作这意味着它没有副作用PUT或DELETE应该是幂等的这意味着您可以反复重复这些操作但最终结果应该相同。虽然HTTP定义了这四种方法但HTML仅支持两种GET和POST。幸运的是有两种可能的解决方法您可以使用JavaScript来执行PUT或DELETE或者您可以使用“real”方法作为附加参数建模为HTML表单中的隐藏输入字段来执行POST。Spring的HiddenHttpMethodFilter使用了后一种技巧。该过滤器是一个普通的Servlet过滤器因此它可以与任何web框架不仅仅是SpringMVC结合使用。将此筛选器添加到web.xml中具有隐藏方法参数的POST将转换为相应的HTTP方法请求。 为了支持HTTP方法转换SpringMVC表单标记被更新为支持设置HTTP方法。例如以下片段来自Pet Clinic示例 form:form methoddeletep classsubmitinput typesubmit valueDelete Pet//p /form:form 前面的示例执行HTTP POST将“真实”DELETE方法隐藏在请求参数后面。它由HiddenHttpMethodFilter拾取该过滤器在web.xml中定义如下例所示 filterfilter-namehttpMethodFilter/filter-namefilter-classorg.springframework.web.filter.HiddenHttpMethodFilter/filter-class /filterfilter-mappingfilter-namehttpMethodFilter/filter-nameservlet-namepetclinic/servlet-name /filter-mapping 下面的示例显示了相应的Controller方法 RequestMapping(method RequestMethod.DELETE) public String deletePet(PathVariable int ownerId, PathVariable int petId) {this.clinic.deletePet(petId);return redirect:/owners/ ownerId; }
http://www.huolong8.cn/news/222645/

相关文章:

  • 怎么删除网站的死链软件开发流程八个步骤模板
  • app开发 网站建设企业网站建设的实验报告
  • 张家界网站制作与代运营宁夏建设局官方网站
  • 网站建设的费用是多少钱安卓开发基础教程
  • 网站推广的主题网站制作的市场前景
  • 网站开发的合同履行地哪里做网站做得好
  • 出国越南做网站8000保底专业制作彩铃网站
  • 网站开发验收做co网站
  • 建网站的公司网页开发公司网站
  • 网站内容更新用什么河南 网站开发
  • 做视频找空镜头那个网站比较全东莞百度seo找谁
  • 政务公开系统网站建设网站二级页怎么做
  • 婚纱销售网站wordpress5.0漏洞利用
  • 大气网站建设成都活动策划公司
  • 网站开发必学的技巧有哪些营销型网站建设iop
  • 专业的网站制作中心做英语quiz的网站
  • 各大网站免费观看html入门视频教程
  • 北京网站设计制作费用西安设计网站公司
  • 北京公司注册网站甘州区建设局网站
  • 更改网站模板康巴什住房和城乡建设局网站
  • 网站迁移后 后台进不去长沙17个片区城市更新
  • 做网站必须要购买空间吗佛山小程序开发公司
  • 上海备案证查询网站查询系统在东营怎么建网站
  • 做网站公司深圳营销网站建设报价
  • 动易 网站统计 首次打开网络规划设计师考试时间2022
  • 网站建立连接不安全博客建站系统
  • 职教集团网站建设方案太原网站开发团队
  • 电子商城网站开发价格室内设计师必备的设计软件
  • 内蒙古网站开发企业怎么做app网址
  • 建网站都需要什么wordpress 推送到群