-
Notifications
You must be signed in to change notification settings - Fork 397
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Implementa Rate Limit na API: /api/v1/sessions
#635
Conversation
The latest updates on your projects. Learn more about Vercel for Git ↗︎
|
Será que dá para fazer a api como naquele video que você fez que o site tava mandando coisas aleatorias inves de não retornar mais dados? |
@aprendendofelipe o limite de O
@coffee-is-power sobre a rota de sessão (que é a mais perigosa), ele meio que faz isso retornando dados falsos mas simulando de forma idêntica uma falha de login, inclusive trocando o Do restante das rotas poderíamos implementar, mas não vejo necessidade porque nós não vendemos os dados como aquela plataforma lá que me trolou vendia 😂 então talvez seja melhor avisar que foi esbarrado num limite. Mas isso não impede de implementar a mesma coisa para outras rotas que possam estar sendo abusadas por pessoas do mal 🤝 |
Já apaguei para facilitar 😅 Vai ter que arrumar a publicação original em produção e testar todas as outras se não tem mais nenhuma que passa desse limite |
select title, length(body) from contents where length(body) > 16000;
|
6f82ceb
to
c0a40f3
Compare
Mesmo sabendo do problema da dependência citado ali em cima, como que a Vercel consegue instalar elas, fazer o build e deploy, e o CI não consegue, ainda mais usando o |
Boa pergunta. Algum bug do npm que só aparece em situações bem específicas. Mas como contorno dessa situação, que tal retirar essa Parece que a |
Topo total! Vi o source aqui e parece ser bem simples, e por ser |
Já envio o commit... Só não é tão rápido pq o original está em TypeScript 😅 |
Eita é verdade 😂 |
@aprendendofelipe passou tudo e a maior delícia do |
@filipedeschamps, por que esse limite de 16.000 caracteres pro
|
@aprendendofelipe então, eu não sei porque não vai com um body maior. Peço que me ajude a investigar isolando o teste do body que faz um POST com essa quantidade de caracteres. Tem tanto um teste fazendo POST quanto um PATCH e ambos quebravam com 20k caracteres. Eram os únicos testes que quebravam com o middleware. |
Só consegui confirmar, pelos testes, que o limite está em 16KiB mesmo. Se passar disso estoura o timeout de 60s. Amanhã investigo melhor |
Depois do |
@coffee-is-power is attempting to deploy a commit to the TabNews Team on Vercel. To accomplish this, @coffee-is-power needs to request access to the Team. Afterwards, an owner of the Team is required to accept their membership request. If you're already a member of the respective Vercel Team, make sure that your Personal Vercel Account is connected to your GitHub account. |
Acho importante fazer o rate limit na rota de criar conteudos, porque alguem mal intencionado pode começar a spamar o tabnews com um monte de posts |
tem que ter um limite que só pode criar 1 post a cada 5 minutos ou algo assim, porque ninguem vai conseguir postar um monte de posts seguidos. |
E se for mesmo necessário, pode ter tambem uma permissão para burlar esse limite tambem. |
Lançaram nova versão do Next e no release não encontrei o commit que faz o fix do problema anterior, mas tudo está funcionando como deveria: https://github.com/vercel/next.js/releases/tag/v12.2.5 |
Deve ser isso mesmo
Nos meus testes continua o limite de 16KiB na v12.2.5. A versão mais nova que consegui fazer funcionar sem esse limite foi a v12.2.2. |
Interessante. Você acha que vale a pena criar uma issue lá? Não vejo problema segurar esse PR até talvez eles lançarem um fix numa canary. |
Engraçado que no ambiente de homologação parece que está funcionando sim... Pelo menos está dando o aviso que passou dos 16000 caracteres |
Mas ele vai dar esse aviso, pois eu mudei a validação para 16000. Deixa eu fazer um commit de testes para voltar para 20k |
Isso, ia sugerir esse teste. No ambiente de testes não chega a dar esse aviso, pois a requisição fica sem nenhuma resposta |
Turma, fiz um commit importante: d86deb9
Vejam se faz sentido 👍 |
Outra coisa que esqueci de avisar no commit d86deb9 é que era possível descobrir que a request caiu no rate limit mesmo com um Na implementação anterior do controller fake, ao enviar um Alertas e Variáveis de AmbienteO Axiom (sistema de logs que utilizamos) anunciou hoje que começou a receber os streams de logs vindos do Middleware da Vercel, porém nos meus testes aqui não está funcionando pela integração padrão fornecida no market place da Vercel e já notifiquei eles. Pelo menos, lá na Dashboard da Vercel os logs estão aparecendo como esperado. Assim que eles consertarem isso eu volto a testar os alertas. Independente disso, testei tanto o caso das variáveis de ambiente do Upstash não existirem, quanto existirem mas as credenciais estarem erradas e em ambos os casos os logs foram registrados com sucesso (por enquanto só lá na Vercel). Um detalhe importante é que caso a conexão falhe com a Upstash, o fluxo cai no modo de exceção e a request é processada e devolvida normalmente. Enquanto isso, configurei o cartão de crédito no Upstash e vou começar a subir os bancos e variáveis de ambiente finais 👍 RebaseVou fazer rebase dos commits desse PR e o histórico vai ser reescrito 🤝 |
d86deb9
to
6e5f699
Compare
6e5f699
to
48374f5
Compare
48374f5
to
435d70d
Compare
435d70d
to
4c110f1
Compare
Merged!! Let's goooooo!! Em paralelo, quando habilitarmos para todos os endpoints da API, sugiro lermos isso antes: https://docs.upstash.com/redis/features/globaldatabase Hoje configurei um database global, mas talvez seja mais interessante configurar um em São Paulo também. |
/api/v1/sessions
Mais um detalhe para analisar é que aqueles valores que eu citei anteriormente são para leituras. Gravações são bem mais caras |
Complementando... Aparentemente as gravações são mais caras que a leitura somente utilizando o database global. Valores por 100 mil comandos
|
@aprendendofelipe to pensando aqui se talvez faça mais sentido criar dois bancos: um em Em paralelo, não mudou nada na latência do endpoint de sessions, mas ele já é hiper devagar por natureza, então difícil ver o ponteiro se mexer nesse caso: |
Para o caso específico de rate limite eu concordo! Se eu entendi direito como funciona a cobrança do uptash, e considerando que para o rate-limit não existe necessidade em manter replicação dos dados, me parece que vale sim mais a pena criar diferentes bancos Single Zone, cada um em diferentes regiões. Mas agora que já está criado o banco Global, já vão ser cobrados os primeiros 100k, então eu deixaria um tempo rodando assim para levantar dados e comparar após mudar para Single Zone. |
Pois é, com essa latência alta, se houvesse mudança visível no gráfico, algo de muito errado estaria ocorrendo... haha Se der para filtrar por intervalos de tempo, talvez dê para pegar alguma mudança no tempo médio |
Este PR faz basicamente duas coisas:
4ab4b6a
30%
de respiro (antes estava10%
).1 segundo
para iniciar uma nova tentativa.6f82ceb
rate-limit
em todos os endpoints a partir de/api
utilizando o Upstash que é um Redis na nuvem e que pode ser distribuído globalmente.middleware.public.js
na raiz do projeto.controller
e a implementação do "rate limiter" está eminfra/rate-limit.js
.ServiceError
. Mas novamente, nada disso será exposto ao usuário.ip
que é aplicado para todas as rotas da API.ip
,method
epath
que pode pode ser utilizado em rotas específicas.POST /api/v1/sessions
que possui limites muito mais baixos e janelas muito maiores de cooldown.429 TooManyRequests
.POST /api/v1/sessions
, ele não será avisado e de forma "invisível" será retornado um erro comum e falso de401 Unauthorized
e que nunca estará de fato batendo contra a real implementação de criar sessões. Inclusive, esse erro falso simula uma latência falsa para o atacante não perceber que foi pego caso ele analise e note uma mudança no padrão de velocidade das respostas. Eu fiquei estressando a implementação em produção e depois a implementação falsa até que as variações de latência entre as duas ficasse igual e não desse para perceber quando você parou de bater contra o endpoint de verdade e começou a bater no endpoint de mentira.X
, porém no ambiente de homologação e produção iremos utilizar valoresY
.body
contendo20.000
caracteres como é possível hoje em produção. O middleware possui limites muito mais restritos que as lambdas. Esse erro foi pego pelos testes de integração e eu reduzi esse limite máximo de caracteres para16.000
. Antes de fazer alguma alteração por migration nocheck
do banco de dados para a colunabody
, sugiro maturar a implementação para ver se esse valor se sustenta.fetch
utilizandoPOST
e umbody
. Isso foi reportado em várias issues, como essa aqui essa ação é utilizada pelo módulo do Upstash. Felizmente essa regressão foi consertada na versão canary12.2.4-canary.11
, que é o que estou utilizando nesse PR, e imagino que não irá demorar muito para entrar num release oficial.