Utilizamos os cookies para melhorar a sua experiência. Para cumprir com a nova diretiva de privacidade, nós precisamos pedir seu consentimento para definir os cookies. Saiba mais.
Blindagem de Performance no Magento 2: Como Mitigar Ataques de Fuzzing e Injeção
-
Alberto Braschi
- Blog
- 2 de abr. de 2026 views
-
0
Recentemente, enfrentei um cenário crítico em uma operação Magento 2: o servidor estava em constante colapso, com picos de CPU, exaustão de conexões no Redis e erros críticos no Elasticsearch. O diagnóstico? Um ataque massivo de Fuzzing e Injection através dos parâmetros de busca e paginação.
Neste post, detalho a estratégia de três camadas que utilizei para estabilizar o ambiente sem gastar um centavo a mais em hardware.
1. Primeira Camada: Blindagem na Borda (Nginx)
O erro comum é deixar o Magento (PHP) decidir se uma requisição é válida. Isso é caro. A regra de ouro da engenharia é: rejeite o lixo o mais cedo possível.
Muitos bots utilizam aspas (') e barras invertidas (\) para testar injeções de SQL. Se o seu Nginx usa o parser PCRE2 (comum no CloudPanel e distros recentes), usar esses caracteres diretamente no config pode gerar erros de sintaxe. A solução sênior é usar códigos hexadecimais.
Como melhorar seu Vhost:
No topo do seu bloco server, adicione:
# Bloqueia aspas simples (\x27), aspas duplas (\x22) e backslash (\x5c)
if ($request_uri ~ "[\x22\x27\x5c]") {
return 403;
}
# Bloqueia assinaturas de ataque SQL/Time/Spam conhecidas
if ($args ~* "(pg_sleep|waitfor|delay|concat|socket|akaun|membeli|require|gethostbyname)") {
return 403;
}
# Bloqueia paginação abusiva (p=1000+)
if ($arg_p ~ "^[0-9]{4,}$") {
return 444; # Fecha a conexão sem resposta para economizar banda
}
2. Segunda Camada: Plugin de Sanitização (Magento Core)
Mesmo com o Nginx configurado, ataques podem vir por rotas alternativas. Criamos um Plugin (Interceptor) na Collection de busca para garantir que nenhum parâmetro malformado atinja o Elasticsearch.
Como criar o Plugin:
Crie o arquivo app/code/Vendor/Module/Plugin/LimitPaginationPlugin.php:
<?php
namespace Vendor\Module\Plugin;
use Magento\Framework\App\RequestInterface;
class LimitPaginationPlugin {
private $request;
public function __construct(RequestInterface $request) {
$this->request = $request;
}
public function beforeLoad($subject, $printQuery = false, $logQuery = false) {
$queryString = (string)$this->request->getServer('QUERY_STRING');
// Validação Global de Query String
if (preg_match('/[\x22\x27\x5c]|waitfor|delay|pg_sleep|select|union/i', $queryString)) {
$this->blockRequest();
}
// Validação específica de paginação
$p = $this->request->getParam('p');
if ($p !== null && (!ctype_digit((string)$p) || (int)$p > 200)) {
$this->blockRequest();
}
return [$printQuery, $logQuery];
}
private function blockRequest() {
header("HTTP/1.1 404 Not Found");
header("X-Robots-Tag: noindex, nofollow");
exit; // Encerra o processo PHP imediatamente para poupar CPU
}
}
Não esqueça de registrar o plugin no seu etc/frontend/di.xml apontando para Magento\CatalogSearch\Model\ResourceModel\Fulltext\Collection.
3. Terceira Camada: Higienização da Base de Dados
Os ataques anteriores deixaram rastros. O Magento salvou os scripts dos atacantes na tabela de Search Terms, o que poluía o autocomplete do frontend e causava erros de BadRequest no Elasticsearch.
Como limpar os Search Terms maliciosos:
- MySQL: Delete os termos que contêm assinaturas de ataque:
DELETE FROM search_query WHERE query_text LIKE '%pg_sleep%' OR query_text LIKE '%waitfor%' OR query_text LIKE '%concat%' OR query_text REGEXP '[()<>\'\"#;]'; - Elasticsearch/Índice: O Magento não armazena o índice de busca no MySQL. Você precisa forçar a reconstrução:
# Reset e Reindex bin/magento indexer:reset catalogsearch_fulltext bin/magento indexer:reindex catalogsearch_fulltext # Limpeza de Cache de borda e aplicação bin/magento cache:flush
Conclusão
A estabilidade de um sistema não depende apenas do tamanho do servidor, mas da inteligência aplicada na filtragem de dados. Ao implementar essas três camadas, reduzimos o Load Average de picos de 40.0 para constantes 0.5, devolvendo a paz para a operação e para o cliente.
Related posts