API NodeJ에서 DDoS 및 DDoS에 대한 설명
                                            
                                                
                                                
                                                
                                                
                                                
                                                 31578 단어  expressnodeddostypescript
                    
As intenções desses ataques são sobrecarregar nosso servidor com múltiplas requisições e tornar nosso serviço indisponível na rede.
Para evitar tais ataques podemos limitar o número de requisições por IPs, isso vai deixar nosso serviço mais profissional e caso aconteça um ataque não fique indisponível.
1 – Criar Projeto e Instalar Bibliotecas
Crie um simples projeto que será nossa API publica, para isso siga os passos:
mkdir brute_force 
cd brute_force 
yarn init 
yarn add express
yarn add @types/express -D
yarn add express-async-errors
yarn add typescript -D
yarn add dotenv
yarn add ts-node-dev -D
yarn add tsconfig-paths -D
yarn add cors
yarn add @types/cors -D
2 – API
Nossa API será bem simples, pois o objetivo é tratar os problemas de multipllas requisições.
Crie uma estrutura de projeto com segue na imagem abaixo:

Antes de começar a codificação, execute o comando abaixo na raiz o projeto para criar as configurações para usar Typescript:
yarn tsc --init
a - 모델
Nosso modelo é simples, cry o arquivo user.ts na 파스타 모델:
export default class User{
  constructor(
    id: number, 
    name:String
    ){}
}
b - 컨트롤러
요구 사항과 유사하게 메모리를 사용하여 목록을 제어하려면 usersController.ts를 파스타 컨트롤러에 저장해야 합니다.
import { Request, Response } from 'express';
import User from '../models/user';
class UsersController {
  public async show(request: Request, response: Response): Promise<Response> {
    const users:User[] = [
      {id:1,name:'user 01'},
      {id:2,name:'user 02'},
      {id:3,name:'user 03'},
      {id:4,name:'user 04'},
      {id:5,name:'user 05'},
      {id:6,name:'user 06'},
      {id:7,name:'user 07'},
      {id:8,name:'user 08'},
      {id:9,name:'user 09'},
      {id:10,name:'user 10'},
    ];
    return response.status(200).json(users);
  }
}
export default UsersController;
c - 경로
Nossa rotas para o acesso a API, crie o arquivo index.ts dentro da 파스타 경로:
import { Router } from 'express';
import UsersController from '../controllers/usersController';
const usersController = new UsersController();
const routes = Router();
routes.get('/users', usersController.show);
export default routes;
d - Erros Customizados
Vamos criar uma classe para customizar os erros, cry o arquivo appError.ts dentro da 파스타 오류:
class AppError {
  public readonly message: string;
  public readonly statusCode: number;
  constructor(message: string, statusCode = 400) {
    this.message = message;
    this.statusCode = statusCode;
  }
}
export default AppError;
e - 서비더
Crie o arquivo server.ts dentro da pasta src para podemos executar no servidor:
import express, { Request, Response, NextFunction } from 'express';
import 'express-async-errors';
import cors from 'cors';
import AppError from './errors/appError';
import routes from './routes';
const app = express();
app.use(cors());
app.use(express.json());
app.use(routes);
app.use((err: Error, request: Request, response: Response, _: NextFunction) => {
  if (err instanceof AppError) {
    return response.status(err.statusCode).json({
      status: 'error',
      message: err.message,
    });
  }
  return response.status(500).json({
    status: 'error',
    message: 'Internal server error',
  });
});
app.listen(3333, () => {
  console.log('Server started on port 3333');
});
f - API 실행
API를 로드하고 터미널 없이 다음 명령을 실행합니다.
yarn dev:server
사이다:
$ yarn dev:server
yarn run v1.21.1
$ ts-node-dev -r tsconfig-paths/register  --inspect --transpile-only --ignore-watch node_modules src/server.ts
ts-node-dev ver. 1.0.0-pre.63 (using ts-node ver. 8.10.2, typescript ver. 4.0.3)
Debugger listening on ws://127.0.0.1:9229/31789a56-8b3f-4628-944d-56aeb1a6f061
For help, see: https://nodejs.org/en/docs/inspector
Missing baseUrl in compilerOptions. tsconfig-paths will be skipped
Server started on port 33
localhost:3333/users
2 – 고속 속도 제한기
Com nossa API criada e rodando, agora vamos a parte de limitação de multiplas requisições por IPs.
Para isso temos que instalar as seguintes bibliotecas:
a-rate-limiter-flexible .
yarn add rate-limiter-flexible
b-레디스
vamos precisar de um lugar para guardar as requisições poderíamos usar a memória porém se nosso servidor reiniciar vamos perder as informações dos IPs e quantidades de requisições.
Redis를 사용하여 문제를 해결할 수 있습니다.
yarn add redis
yarn add @types/redis -D
3 – 미들웨어
Vamos criar um middleware para receber as requisições e verificar se o IP que realizou tem múltiplas requisições de forma simultânea.
파스타 미들웨어에 대해 rateLimiter.ts를 요청하십시오.
import {Request, Response, NextFunction} from 'express';
import redis from 'redis';
import {RateLimiterRedis} from 'rate-limiter-flexible';
const redisClient = redis.createClient({
  host: 'localhost',
  port:6379,
  password: undefined,
});
const limiter = new RateLimiterRedis({
  storeClient: redisClient,
  keyPrefix: 'rateLimiter',
  points: 5,//quantas requisições por IP
  duration: 5,//segundos
});
export default async function rateTimiter(request:Request, response:Response, next:NextFunction):Promise<any>{
  try{
    await limiter.consume(request.ip);
    return next();
  }catch(err){
    return response.status(429).json({message: 'Too many requests', code:429})
  }
}
No código, fiz a configuração que ser nossa API receber 5 requisições em um intervalo de 5 segundos do mesmo IP retornará uma resposta 429 ..
Então caso o limite seja rompido será retornar a resposta.
{
    "message": "Too many requests",
    "code": 429
}
server.ts 및 미들웨어 rateLimiter에 대한 액세스 권한이 있습니다.
import express, { Request, Response, NextFunction } from 'express';
import 'express-async-errors';
import cors from 'cors';
import AppError from './errors/appError';
import routes from './routes';
import rateLimiter from './middlewares/rateLimiter';
const app = express();
app.use(rateLimiter);
app.use(cors());
app.use(express.json());
app.use(routes);
app.use((err: Error, request: Request, response: Response, _: NextFunction) => {
  if (err instanceof AppError) {
    return response.status(err.statusCode).json({
      status: 'error',
      message: err.message,
    });
  }
  return response.status(500).json({
    status: 'error',
    message: 'Internal server error',
  });
});
app.listen(3333, () => {
  console.log('Server started on port 3333');
});
Github do projeto .
Reference
이 문제에 관하여(API NodeJ에서 DDoS 및 DDoS에 대한 설명), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/wandealves/tratamento-de-ataques-forca-bruta-e-ddos-em-api-nodejs-2gp텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)