首页 > 其他分享 >API接口防刷的9种方案

API接口防刷的9种方案

时间:2023-12-21 13:56:38浏览次数:29  
标签:防刷 rateLimiter IP 接口 API 日志 public

  1. 防火墙:配置防火墙规则,限制对API接口的访问频率和来源IP,防止大量无效请求。

  2. 验证码:在需要保护的接口中添加验证码验证,要求用户在访问前先进行验证码验证,以确认其为真实用户。

  3. IP限制:限制对API接口的访问仅限于特定IP范围,例如只允许内网或特定合作伙伴的IP访问。

  4. 接口访问频率限制:设置访问频率限制,例如每分钟/每小时/每天只允许一定次数的请求,超出限制则返回错误信息或封禁IP。

  5. 用户身份认证和授权:要求用户在访问API接口前进行身份认证,并根据用户的权限进行授权,只允许有权限的用户访问特定接口。

  6. 日志监控:监控API接口的访问日志,及时发现异常请求,例如某个IP频繁请求同一接口,及时采取相应的安全措施。

  7. 安全加密:对敏感数据进行加密传输,使用HTTPS协议保证数据传输的安全性。

  8. 使用API网关:在API接口和客户端之间引入API网关,对请求进行过滤、鉴权、限流等操作,保护后端API接口的安全。

  9. 人工干预:定期检查API接口的访问情况,及时发现异常行为,进行人工干预处理。

总之,针对恶意刷接口的情况,可以通过限制访问频率、添加验证码、IP限制、用户身份认证和授权等手段来增强接口的安全性。

这9种解决方案足以应付面试官了,但很多人还是想看看到底如何实现。

下面给你三种方案实现防刷的具体实现:

  • IP限制
  • 日志监控
  • 设置访问频率限制。

IP限制防刷

在Spring Boot项目中,可以通过使用拦截器或者过滤器来实现对IP的限制。下面是具体的实现步骤:

  1. 创建一个拦截器类或者过滤器类,实现HandlerInterceptor接口或者Filter接口。
  2. 在拦截器类或者过滤器类的实现中,获取请求的IP地址。
  3. 配置需要限制的IP地址列表,可以将这些IP地址存储在一个配置文件中,或者直接在代码中定义一个列表。
  4. 在拦截器类或者过滤器类的实现中,判断请求的IP地址是否在限制的IP地址列表中,如果在列表中则继续处理请求,否则返回一个错误信息或者拒绝请求。
  5. 在Spring Boot项目的配置类中,将拦截器或者过滤器注册到应用程序中。

下面是一个使用拦截器实现IP限制的示例代码:

public class IPInterceptor implements HandlerInterceptor {
    private static final List<String> ALLOWED_IPS = Arrays.asList("127.0.0.1", "192.168.0.1");
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String ipAddress = request.getRemoteAddr();
        
        if (ALLOWED_IPS.contains(ipAddress)) {
            response.setStatus(HttpServletResponse.SC_FORBIDDEN);
            response.getWriter().write("Access denied");
            return false;
        }
        
        return true;
    }
}

在Spring Boot项目的配置类中注册拦截器:

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new IPInterceptor());
    }
}

上述示例中,ALLOWED_IPS列表中包含了不允许访问的IP地址,如果请求的IP地址在列表中,则返回"Access denied"错误信息,并且设置响应的状态码为403(Forbidden)

同样的,你也可以使用过滤器来实现IP限制,过滤器的实现方式类似,只是需要实现Filter接口并重写doFilter方法。

请注意,上述示例仅提供了一种简单的IP限制方式,如果需要更复杂的限制策略,可以考虑使用第三方库或者框架,如Spring Security等。

注意:这里的IP,我们写死放java代码里了,实际项目中,我们可能会配置在配置文件中、或专门用一张表来存储,然后把表里的数据缓存到Redis中,每次请求就直接从redis获取即可,放在redis中可以减轻数据库压力以及提醒AIP接口性能。

另外,上面的IP是对不能访问的做限制,如果我们的系统是对某些特定的用户使用,那这个IP列表我们可以配置成能访问的IP,非IP列表中的IP仅限访问时,我们可以对其仅限限制。

日志监控

要实现对API接口的日志监控,可以按照以下步骤进行:

  1. 引入日志框架:在Spring Boot项目中,一般使用slf4j作为日志框架,可以在项目的pom.xml文件中添加相关依赖。

  2. 配置日志输出:在项目的配置文件(如application.properties或application.yml)中,配置日志输出的格式、级别等相关信息。

  3. 编写请求拦截器:通过编写请求拦截器,在API接口被调用时记录相关日志信息。可以在拦截器中获取请求的URL、参数、请求方法等信息,并将其记录到日志中。

  4. 使用AOP进行日志记录:可以通过使用Spring AOP,在API接口被调用时记录日志。在AOP切面中,可以定义前置通知、后置通知等,根据需要在相应的通知中进行日志记录。

  5. 配置日志存储:可以将日志存储到数据库、文件或其他日志存储介质中。可以使用相关的日志存储框架(如logback、log4j等)进行配置。

  6. 异常处理:在API接口被恶意刷的情况下,可能会产生大量异常请求。可以通过编写全局异常处理器,对异常请求进行统一处理,并记录相关日志信息。

  7. 监控与分析:可以使用日志分析工具(如ELK、Splunk等)对日志进行实时监控和分析,以便及时发现异常请求。

需要注意的是,在实施日志监控时,应遵循相关法律法规,确保个人隐私和数据安全。

设置访问频率限制

在Spring Boot中,可以使用拦截器(Interceptor)或过滤器(Filter)来实现API接口的访问频率限制。下面分别介绍这两种实现方式。

  1. 使用拦截器(Interceptor)实现访问频率限制

首先,创建一个拦截器类,实现HandlerInterceptor接口,并重写preHandle方法。在preHandle方法中,可以对请求进行限制判断。

public class RateLimitInterceptor implements HandlerInterceptor {

    private final RateLimiter rateLimiter;

    public RateLimitInterceptor(RateLimiter rateLimiter) {
        this.rateLimiter = rateLimiter;
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 获取请求IP地址
        String ipAddress = request.getRemoteAddr();
        
        // 检查IP地址是否超过限制
        if (!rateLimiter.tryAcquire(ipAddress)) {
            response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value());
            response.getWriter().write("Too many requests");
            return false;
        }
        
        return true;
    }
}

然后,在配置类中注册拦截器:

@Configuration
public class WebConfig implements WebMvcConfigurer {

    private final RateLimiter rateLimiter;

    public WebConfig(RateLimiter rateLimiter) {
        this.rateLimiter = rateLimiter;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new RateLimitInterceptor(rateLimiter));
    }
}
  1. 使用过滤器(Filter)实现访问频率限制

首先,创建一个过滤器类,实现javax.servlet.Filter接口,并重写doFilter方法。在doFilter方法中,可以对请求进行限制判断。

public class RateLimitFilter implements Filter {

    private final RateLimiter rateLimiter;

    public RateLimitFilter(RateLimiter rateLimiter) {
        this.rateLimiter = rateLimiter;
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;

        // 获取请求IP地址
        String ipAddress = httpRequest.getRemoteAddr();
        
        // 检查IP地址是否超过限制
        if (!rateLimiter.tryAcquire(ipAddress)) {
            httpResponse.setStatus(HttpStatus.TOO_MANY_REQUESTS.value());
            httpResponse.getWriter().write("Too many requests");
            return;
        }

        chain.doFilter(request, response);
    }
}

然后,在配置类中注册过滤器:

@Configuration
public class WebConfig {

    private final RateLimiter rateLimiter;

    public WebConfig(RateLimiter rateLimiter) {
        this.rateLimiter = rateLimiter;
    }

    @Bean
    public FilterRegistrationBean<RateLimitFilter> rateLimitFilter() {
        FilterRegistrationBean<RateLimitFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new RateLimitFilter(rateLimiter));
        registrationBean.addUrlPatterns("/api/*"); // 设置过滤的URL路径
        return registrationBean;
    }
}

在上述代码中,RateLimiter是一个自定义的限流器,可以根据具体需求选择合适的实现方式,例如使用Guava的RateLimiter或使用计数器等,也可以使用Redis来实现这个技术功能。

需要注意的是,以上代码只是实现了基本的访问频率限制,对于恶意刷接口的情况,还可以进一步加强安全性,例如使用令牌桶算法持久化存储IP地址等。

标签:防刷,rateLimiter,IP,接口,API,日志,public
From: https://www.cnblogs.com/privateLogs/p/17918816.html

相关文章

  • WepApi TaskCanceledException A任务已取消--async+await的方案替代task.Wait()可有效
     在.netCore中httpClient添加配置超时时长也没用services.AddHttpClient("PPHttpClient",config=>{config.DefaultRequestHeaders.Add("Accept","*/*");config.DefaultRequestHeaders.Add("A......
  • 使用Postman测试需要授权的接口问题
    Postman是一款免费的http模拟请求工具,常用来测试开发接口。实际场景中,很多接口是需要授权才能使用。这就需要Postman获取授权,把返回的token保存,在调用其他接口时连同token一起传递。我所在的项目基于spring全家桶,正常流程是:调用获取验证码接口->登录接口->调用业务接口。新建......
  • Jmeter HTTPS接口测试证书导入过程图解
    python中没有swich..case,若要实现一样的功能,又不想用if..elif来实现,可以充分利用字典进行实现主要是想要通过不同的key调用不同的方法,在学习过程中,发现不管输入的key是什么,只要字典中存在输出内容,每次都会输出,这跟自己需要的功能有出入。通过调试后,发现问题主要出现在key值对应的va......
  • PHP本地进行API接口测试的实例
    最近写API接口,每写一个接口,我自己需要先测试一下,看有没有语法错误,请求的数据对不对,但是很多都是POST请求,没法直接在浏览器中打开链接进行测试,所以必须要有个可以在本地发HTTP请求的模拟工具,模拟一下数据请求。一开始我是这么干的,在本机wampserver运行目录下创建一个文件,在里边写Cu......
  • Python编写接口测试文档(以豆瓣搜索为例)
    前言很多人会使用postman工具,或者熟悉python,但不一定会使用python来编写测试用例脚本,postman里面可以完整的将python代码复制出来。(以下所有内容以豆瓣网站搜索功能为例子)一、postman接口用例转换为python测试用例打开postman,点击右侧的</>图标,页面右边会显示脚本,顶部修改导出的语......
  • Python接口测试get请求过程详解
    python做接口测试用到的是requests模块,首先要导入requests库,pipinstallrequests1、get直接请求方式以豆瓣网为例:url='https://read.douban.com/'respose=requests.get(url=url)#status_code为返回的状态码print(respose.status_code)#text为返回的数据print(res......
  • 用Python进行websocket接口测试
    我们在做接口测试时,除了常见的http接口,还有一种比较多见,就是socket接口,今天讲解下怎么用Python进行websocket接口测试。现在大多数用的都是websocket,那我们就先来安装一下websocket的安装包。pipinstallwebsocket-client 安装完之后,我们就开始我们的websocket之旅了。我们先来看......
  • Postman测试接口各种类型传值的实现
    一.GET传参二.POST传参1.application/x-www-form-urlencoded格式 2.application/json格式2.1Map或实体类型2.2.List传值  3.multipart/form-data上传文件三.Header 四.下载文件......
  • Python接口自动化浅析logging封装及实战操作
    一、yaml配置文件将日志中的常用配置,比如日志器名称、日志器等级及格式化放在配置文件中,在配置文件config.yaml中添加:logger:name:ITesterlevel:DEBUGformat:'%(filename)s-%(lineno)d-%(asctime)s-%(levelname)s-%(message)s'封装logging类,读取yaml中的日志配置。二、读取y......
  • Python接口自动化之文件上传/下载接口详解
    〇、前言文件上传/下载接口与普通接口类似,但是有细微的区别。如果需要发送文件到服务器,例如:上传文档、图片、视频等,就需要发送二进制数据,上传文件一般使用的都是Content-Type:multipart/form-data数据类型,可以发送文件,也可以发送相关的消息体数据。反之,文件下载就是将二进制格式......