前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于SpringBoot的WEB API项目的安全设计

基于SpringBoot的WEB API项目的安全设计

作者头像
MavenTalker
发布2019-07-19 10:16:24
1.1K0
发布2019-07-19 10:16:24
举报
文章被收录于专栏:歪脖贰点零

SpringBoot的开箱即用功能,大大降低了上手一个WEB应用的门槛,友好的REST接口支持,在SpringCloud微服务体系中可编程性大大提高,本篇基于一个面向企业调用方用户的WEB API项目,基于SpringBoot来构建,简单看下接口的安全性模块设计。

主要借助于基于AOP技术来进行接口的安全防护,在SpringBoot下直接引入spring-boot-starter-aop即可使用。

1、在Pom中引入AOP配置

代码语言:javascript
复制
<dependency>  
     <groupId>org.springframework.boot</groupId>  
     <artifactId>spring-boot-starter-aop</artifactId>  
</dependency>

2、编写对应处理类即可,通过@Order(n)设置合法的校验顺序。如LogAspect

代码语言:javascript
复制
@Aspect
@Order(1)
@Component
public class LogAspect {

    private Logger logger=Logger.getLogger(LogAspect.class);

    @Pointcut("execution(public * com.wey.say.api.*.* (..))")
    public void apiLogAspect() {

    }

    @Before("apiLogAspect()")
    public void dobefore(JoinPoint joinPoint) {
        RequestAttributes ra = RequestContextHolder.getRequestAttributes();
        ServletRequestAttributes sra = (ServletRequestAttributes) ra;
        HttpServletRequest request = sra.getRequest();
        // 使用log4j的MDC及NDC特性,识别请求方的IP及调用资料,输出到日志中
        MDC.put("uri", request.getRequestURI());
        NDC.push(request.getRemoteAddr());
        // 记录下请求内容
        logger.info("HTTP_METHOD : " + request.getMethod());
        logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "."
                + joinPoint.getSignature().getName());
        logger.info("ARGS : " + Arrays.toString(joinPoint.getArgs()));
        NDC.pop();
        NDC.remove();
        MDC.get("uri");
        MDC.remove("uri");
    }

    @AfterReturning(returning = "ret", pointcut = "apiLogAspect()")
    public void doAfterReturning(Object ret) throws Throwable {
        // 处理完请求,返回内容
        logger.info("RESPONSE : " + ret);
    }

下面进入此系统关键的安全设计模块,由于是面向企业级接口调用用户,与面向大众的接口稍微有些不同,分为以下几个方面。

  • 1、详细日志记录,凡请求过来均进行记录,便于后期识别非法请求的防范依据

参考上文中实现方式,可以再细化。进行日志的收集分析,后期分析接口的调用频率等进一步需求。

  • 2、白名单限制,仅接受特定系统的请求响应,调用方的IP地址需要在本系统中报备,否则无法调用。

不采用黑名单机制,主要原因在于未知的IP量太大,只能采用允可的方式,成本最小,效果也最好。

  • 3、调用方身份合法性验证,即便是白名单用户,也需要进行验证,确保用户真正合法。主要验证此请求是否确实来自于某一调用法,而非伪造的用户请求。

常见做法:为调用方设置一个唯一标识和一个密钥,接口到请求时校验这两者的合法性。

  • 4、基于HmacSHA1算法进行请求参数完整性验证,主要用于检测传输过程中参数是否被篡改。

也可以采用的简单的MD5验签,效率更高。

  • 5、防重放攻击,即可通过了前4个步骤,不排除利用合法请求,暴力调用的情况。在验证过程中增加时间戳项目,校验调用时间是否在允许范围内,比如1分钟之内。(案例:QQ第三方登陆在校验调用时间与服务时间时,时间差合理范围内,即便不一致,也可以使用)

CSRF的问题必须要重视,可以进行很强大的重放攻击。当然还有其它的如DOS攻击等。

  • 6、流量控制。比较熟知的例子就是微信开放平台暴露的接口,DOC中明显指出某一接口一天内允许调用的次数,超过限制将无法响应。考虑到实际企业调用的情况,我们同样可以针对某一调用方某一请求进行限制

可借助Guava中对应RateLimiter模块功能,也可借助Redis高效响应机制自己设计,以调用方id+接口名称为KEY,设置接口调用上限即可,按天实时更新数据增量。

以上基本上可以算是个完整的安全防范过程,当然还是需要借助运维手段,在外层进行安全防范,比如WAF等,也可以在更高级处进行防范,比如网关接入层。

扩展阅读:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-05-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MavenTalk 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档