9月12号下午3点,我看到微信群里面说我的小程序音乐不能播放了,我打开我的也是一样报错,我就立即打开了宝塔面板,看到我的服务器遭到个人ip疯狂请求,由于我在宝塔里面配置了这些,能拿到用户的ip地址

location /apt/ {
    
    add_header 'Access-Control-Allow-Origin' '*';
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header 'Access-Control-Allow-Headers' 'x-requested-with,content-type';
    proxy_pass http://127.0.0.1:7001/;
    proxy_set_header   Host    $host;
    proxy_set_header   Remote_Addr    $remote_addr;
    proxy_set_header   X-Real-IP    $remote_addr;
    proxy_set_header   X-Forwarded-For    $proxy_add_x_forwarded_for;
    index http://127.0.0.1:7001/;
        # proxy_pass http://127.0.0.1:7001/;
    }

通过pm2 monit命令在后台看到有一个ip在不停的请求我的音频接口,我赶紧停掉了我的这个服务,可是这个人不知道是从什么时候就开始攻击我的网站,不知道为什么,我的宝塔免费的防火墙并没有拦截到这个人的请求,我设置的是10秒内超过5次就封所这个人的ip理论上是不会造成请求过多的。

没办法,我又研究了下怎么避免在服务器受到攻击时的一些应对办法,作为一个白嫖党要钱的是肯定不行的,于是我把重要的接口上加了一个中间件,中间件再去过滤掉一些频繁请求的ip,大概就是这样

// 存储用户请求信息的数据结构
const userRequests = {};

// 中间件函数,用于检查用户请求频率
export async function requestLimitMiddleware(ip: string) {
  const now = Date.now();

  // 检查用户是否存在于userRequests中
  if (!userRequests[ip]) {
    userRequests[ip] = [];
  }

  // 移除超过10秒的请求记录
  userRequests[ip] = userRequests[ip].filter((timestamp) => now - timestamp <= 10000);

  // 如果用户的请求数超过5次,返回错误响应
  if (userRequests[ip].length >= 7) {
    return { data: '请求频率超限' };
  }

  // 记录当前请求时间
  userRequests[ip].push(now);
  return { data: '请求成功' };
};

 这样我们可以限制这个人在10秒内的请求次数,来达到降低服务器的性能损耗,避免了dos攻击,这也只针对少数攻击有一定的作用,如果大家有什么好的方法欢迎分享出来。

我的微信小程序:轻音乐Pro

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐