遇到问题: 测试人员用burpsuite工具抓取表单数据,当页面点击提交数据后,工具burpsuite将截取到的数据修改后模拟发送,依然可以正常修改,解决办法 项目添加token验证,
第一步:先写token生成和销毁方法
package com.smartt.api.interceptor; import java.lang.annotation.*; @Target(ElementType.METHOD) @Retention (RetentionPolicy.RUNTIME) @Documented public @interface Token { boolean save() default false; boolean remove() default false; }
TokenInterceptor.java
package com.smartt.api.interceptor; import java.lang.reflect.Method; import java.util.UUID; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; public class TokenInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (handler instanceof HandlerMethod) { HandlerMethod handlerMethod = (HandlerMethod) handler; Method method = handlerMethod.getMethod(); Token annotation = method.getAnnotation(Token.class); if (annotation != null) { boolean needSaveSession = annotation.save(); if (needSaveSession) { request.getSession(false).setAttribute("token", UUID.randomUUID().toString()); } boolean needRemoveSession = annotation.remove(); if (needRemoveSession) { if (isRepeatSubmit(request)) { return false; } request.getSession(false).removeAttribute("token"); } } return true; } else { return super.preHandle(request, response, handler); } } private boolean isRepeatSubmit(HttpServletRequest request) { String serverToken = (String) request.getSession(false).getAttribute("token"); if (serverToken == null) { return true; } String clinetToken = request.getParameter("token"); if (clinetToken == null) { return true; } if (!serverToken.equals(clinetToken)) { return true; } return false; } }
第二步:写springboot的拦截器,拦截对应的访问方法地址,进行token验证
package com.smartt.api; import org.springframework.boot.SpringApplication; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import com.smartt.api.interceptor.TokenInterceptor; @Configuration @ComponentScan(useDefaultFilters = true) public class WebAppConfig extends WebMvcConfigurerAdapter { public static void main(String[] args) { SpringApplication.run(WebAppConfig.class, args); } /** * 配置拦截器 * @author lance * @param registry */ public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new TokenInterceptor()).addPathPatterns("/admin/**"); } }
我写的是 /admin/ 对应的controller访问路径的,如果多个不同的访问地址可以这么写 /** 或
如果写了多个又不想全部都拦截可以这么写
多个拦截器组成一个拦截器链 // addPathPatterns 用于添加拦截规则 // excludePathPatterns 用户排除拦截 registry.addInterceptor(new MyInterceptor1()).addPathPatterns("/xxx1/**"); registry.addInterceptor(new MyInterceptor2()).addPathPatterns("/xxx2/**");
- 接下来就是关键,在进入到你需要提交的页面的controller方法上使用你的自定义注解
- 在提交数据的controller方法上删除
- 最后一个步骤,首先需要再页面获取到session中的token并放入隐藏域中,最后如果你是ajax提交的数据,记得一定要把token当做参数提交上去,否则后台无法获取到你页面提交的token值,就无法和session中的作比较
相关推荐
1. **配置Action**: 在Struts配置文件(如struts.xml)中,为需要防止重复提交的Action添加`token`拦截器。 ```xml <interceptor-ref name="token"/> <result name="success">/success.jsp ...
在表单提交时,系统会检查请求中是否包含有效的CSRF令牌。 8. **异常处理**:Spring Security处理未授权和未认证的异常,你可以自定义错误页面或者全局异常处理器来优雅地展示错误信息。 9. **JWT支持**:尽管在...
可以考虑在拦截器中加入对CSRF令牌的验证,确保表单提交的安全。对于XSS攻击,则需要在Web配置中设置合适的HttpMessageConverter来解决乱码问题。 上述知识点提供了一个基本的SpringBoot拦截器实现登录拦截的方法...
SpringBoot_demo是一个包含Spring Boot、Vue.js和Element Plus框架实现的Web登录页面示例项目。这个项目展示了如何将这三个技术栈结合,构建一个完整的前端到后端的应用。下面将详细介绍这些关键技术及其在登录页面...
4. **CSRF防护**:为了防止跨站请求伪造(Cross-Site Request Forgery, CSRF)攻击,SpringSecurity提供了内置的CSRF保护机制,可以通过在表单提交中添加隐藏令牌来确保请求的合法性。 5. **安全过滤器链**:Spring...
- 使用`JwtTokenFilter`拦截器处理JWT的验证和授权。 7. **自定义登录表单** - 可以通过定义`@Controller`和HTML模板来自定义登录界面。 - 提交登录信息到Spring Security的默认登录处理端点。 8. **异常处理**...
1. **项目初始化**:创建一个新的Spring Boot项目,添加`spring-boot-starter-web`、`spring-boot-starter-security`、`spring-security-oauth2`和`spring-security-jwt`依赖。 2. **用户实体类与数据访问层**:...
- 定义登录页面,表单提交的URL映射到Spring Security的默认登录处理端点`/login`。 **4. 权限授权** - 使用`@PreAuthorize`、`@PostAuthorize`、`@Secured`等注解进行方法级别的权限控制。 - 配置权限角色,如`@...
Spring Security 是一个强大的身份验证和访问控制框架,适用于构建安全的 Java 应用程序,尤其在Spring Boot中,集成Spring Security能简化安全配置,提供一套完整的安全解决方案。它包括认证和授权两个主要方面,...
【Spring Security简介】 Spring Security是Spring生态系统的组件之一,它为Java应用提供了全面的...在实际项目中,还可以根据需求进一步扩展,例如集成OAuth2、JWT token、自定义过滤器等,以满足复杂的安全场景。
1. **XML配置**:在传统的Spring项目中,我们通常通过XML配置来设置Spring Security,包括定义安全拦截规则、配置认证和授权策略等。 2. **Java配置**:随着Spring Boot的发展,现在更推荐使用Java配置,它更加直观...
- `springmvc-servlet.xml`:配置Spring MVC的相关组件,如视图解析器、拦截器等。 - `applicationContext.xml`:配置Spring的核心组件,如Bean的定义和数据源。 ### 9. 测试与调试 使用Postman或类似工具模拟POST...
项目可能包括了定制的登录表单和控制器方法,以及配置相应的过滤器来处理登录请求。 6. **CSRF防护**:为了防止跨站请求伪造攻击,Spring Security默认开启了CSRF保护。项目中应有相关配置,并可能包含CSRF token的...
在SpringBoot项目中,我们可以通过添加相应的Maven或Gradle依赖来引入SpringSecurity模块,这样就可以快速地开始进行安全控制。 SpringSecurity提供了认证(Authentication)和授权(Authorization)功能,可以实现...
4. **CSRF防护**:Spring Security 3.2.4包含了对跨站请求伪造(CSRF)的防护,通过添加CSRF token到表单和检查请求中的token来防止这类攻击。 5. **记住我功能**:Spring Security允许实现“记住我”功能,让用户...
- **拦截器**:自定义的拦截器可以用于实现特定的业务逻辑,例如记录登录日志或会话超时处理。 - **用户详情服务**:如`UserDetailsService`,用于获取用户信息,通常与数据存储(如数据库)集成。 - **过滤器**:如...
在登录功能中,jQuery 可用于前端处理用户输入,监听表单提交事件,并使用 Ajax 进行异步数据通信,这样可以实现无刷新的登录体验。 4. **Ajax**: Ajax(Asynchronous JavaScript and XML)是一种在无需重新加载...
- Spring Security拦截请求,验证提交的凭证。 - 如果凭证有效,Spring Security创建一个Authentication对象,包含用户信息,并将其放入SecurityContextHolder。 - 之后,每次用户请求受保护的资源,Spring ...
当前版本支持from表单提交拦截和ajax请求拦截 校验规则为从前端请求头中获取accesstoken,校验其有效性 核心类说明: SecurityInterceptor(拦截器实现) SecurityMemoryConstant(启动加载ip白名单、路由白名单) ...
9. **集成其他Spring组件**:Spring Security可以很好地与Spring MVC、Spring Boot、Spring Data等Spring生态系统中的其他组件集成,提供一站式安全解决方案。 10. **自定义扩展**:Spring Security的灵活性允许...