Pular para o conteúdo

Instale o Qlyne num app Next.js

Para um app Next.js na Vercel, ou em qualquer hospedagem que rode Next.js, sem Cloudflare. O Qlyne roda como o middleware do app: as mesmas regras do conector do Cloudflare, decididas antes de cada página e rota de API, com sala de espera, desafio, limites de requisições, endereços bloqueados, robôs de IA, proteção de login e portões de acesso.

No painel, abra o seu site, Connector, “Install on Next.js”, e clique em Download qlyne-next.mjs. O arquivo já vem com o identificador do site, o endereço do Qlyne e a chave que confere as regras. Coloque na raiz do projeto, ao lado do package.json.

Crie também o proxy.js na raiz (Next.js 16; no Next.js 13 a 15 o arquivo é middleware.js, com o mesmo conteúdo):

import { qlyne } from './qlyne-next.mjs';
export default qlyne();
export const config = { matcher: ['/((?!_next/static|_next/image|favicon.ico).*)'] };

O matcher deixa de fora os arquivos do próprio Next.js, para eles não contarem como visita. Se o projeto já tem um middleware, chame o Qlyne primeiro e deixe o seu para o que o Qlyne liberar:

import { qlyne } from './qlyne-next.mjs';
const proteger = qlyne();
export default async function proxy(request, event) {
const response = await proteger(request, event);
if (!response.headers.get('x-middleware-next')) return response; // barrado, desafiado ou mandado para a fila
return seuMiddleware(request, event);
}

Crie a variável de ambiente QLYNE_SECRET com o segredo do conector (em Connector, “Generate secret”). Na Vercel: Settings, Environment Variables, para Production e Preview. Depois publique.

Deixe o modo em “Observe only” no começo e confira as últimas 24 horas na Overview do site. Com os números fazendo sentido, mude para “Enforce” em Connector. As mudanças chegam ao middleware em até um minuto, sem publicar de novo.

O middleware decide antes de o app responder, mas nunca vê a resposta. Por isso:

RegraNo Next.js
Sala de espera, desafio, modo sob ataqueSim
Endereços bloqueados e de confiança, Tor, suas regrasSim; o país vem da Vercel (x-vercel-ip-country), a rede (ASN) fica desconhecida, então condição sobre ela nunca casa
Robôs de IABarrados pelo user agent; o grupo de IA não entra no robots.txt
Limites de requisiçõesContados pelo servidor do Qlyne, somando todas as instâncias do app (uma chamada ao Qlyne nas rotas com limite, na casa de dezenas de milissegundos); se ele não responder a tempo, cada instância conta sozinha até ele voltar. qlyne({ rateLimit: 'memory' }) deixa a conta só em cada instância
Proteção de login, portões, armadilha para scanner, regras gerenciadas (WAF)Sim; o WAF lê corpos de formulário e JSON de até 16 KB de uma cópia, então o app recebe a requisição inteira
Formulários protegidosNão: o middleware não consegue pôr os campos escondidos na página. Use o captcha de formulário
Cabeçalhos de segurança e CSPVão em todas as respostas; a nota no painel precisa do Cloudflare ou do proxy
Sinais para o appSim, como headers da requisição (Qlyne-Country, Qlyne-Leaked-Password…)
Nota de robôSim, com o script no layout (abaixo); a página-isca vai por rewrite
Reputação entre sitesSim, pelo IP que a Vercel informa

Leia os sinais numa rota ou componente de servidor com headers() de next/headers.

O middleware não consegue pôr o script da nota de robô nas páginas, então ponha no layout raiz (app/layout.js), dentro do <head>:

<script src="/__qlyne/s.js" async></script>

O middleware serve o script e recebe o resumo em /__qlyne/s; o matcher de cima já cobre os dois caminhos. Com a nota desligada no painel, eles vão para o app, que responde 404, e nada mais muda. O que a nota faz está no guia do Cloudflare.

Na Vercel o middleware lê o IP do x-real-ip e do x-forwarded-for, que a Vercel preenche e o visitante não consegue forjar. Em servidor próprio, garanta que o proxy reverso na frente do Next.js (nginx, Caddy) sobrescreva esses headers com o endereço real; senão um visitante mandaria um falso e escaparia das regras por IP.

A versão está na primeira linha do arquivo. Para atualizar, baixe de novo, troque e publique. As regras ficam no painel; o arquivo só leva o código.