Como bloquear 100% dos bots russos e chineses no registo do SMF

Iniciado por candidosa2, Ontem às 05:20

Tópico anterior - Tópico seguinte

0 Membros e 3 Visitantes estão a ver este tópico.

candidosa2

Introdução – O desafio dos bots avançados

Nos últimos anos, os foruns SMF têm sido alvo de redes de bots provenientes da Rússia e da China que utilizam técnicas de *machine learning* para contornar CAPTCHAs tradicionais. Estes bots criam milhares de contas falsas, enviam spam, e comprometem a reputação da comunidade.  
Neste artigo vamos explorar, passo a passo, como configurar o registo do SMF para bloquear **100 %** desses robôs, usando perguntas e respostas personalizadas, filtros de GeoIP, análise de *User‑Agent*, *rate‑limiting* e integração avançada com hooks do SMF.

---

Por que o CAPTCHA comum já não trava os robôs avançados?

CAPTCHA visual (texto distorcido, imagens) e até mesmo o reCAPTCHA v2 podem ser resolvidos por serviços de *captcha‑solving* baseados em IA.  
Além disso:

* **Treinamento de redes neurais** permite reconhecer padrões de distorção quase como humanos.
* **Bots headless** utilizam navegadores sem cabeça (Puppeteer, Playwright) que executam o JavaScript do reCAPTCHA e enviam a resposta ao servidor.
* **Serviços de terceiros** (2Captcha, Anti‑Captcha) fornecem respostas em segundos por um custo baixo.

Portanto, confiar apenas num CAPTCHA está obsoleto para proteger o registo contra bots sofisticados.

---

Estratégia 1 – Perguntas e respostas personalizadas (Q&A)

O SMF já inclui a funcionalidade de "Pergunta de segurança" no registo. Para torná‑la eficaz contra bots russos e chineses:

1. **Crie perguntas que exigem conhecimento cultural local** (ex.: "Qual é a capital da França?"). Bots estrangeiros costumam falhar em perguntas que envolvem idioma ou conhecimento regional.
2. **Use variações dinâmicas** – armazene um conjunto de 30 + perguntas e responda aleatoriamente.
3. **Desative respostas "case‑insensitive"** e permita apenas respostas exatas.

$modSettings['qa_verification'] = 1;               // Ativa Q&A
$modSettings['qa_questions'] = serialize(array(
    'Qual é a capital da França?' => 'Paris',
    'Qual é o nome do primeiro presidente dos EUA?' => 'George Washington',
    // ... adicione 30+ perguntas aqui ...
));

**Dica SEO:** Inclua palavras‑chave como "registo seguro SMF", "bloquear bots" nos textos das perguntas – isso ajuda a indexar o seu tópico como referência de segurança.

---

Estratégia 2 – Bloqueio por GeoIP (russos e chineses)

A maioria dos bots indesejados provém de IPs alocados na Rússia (RU) e China (CN). Use um serviço de GeoIP (por exemplo, *MaxMind GeoLite2*) para rejeitar esses países no registo.

1. **Instale a extensão PHP GeoIP2** no servidor.
2. **Adicione um hook** no ficheiro *Sources/Subs.php* para validar o país antes de criar a conta.

// Exemplo de hook em Subs.php
function block_bot_countries()
{
    global $user_info, $txt;
    $ip = $user_info['ip'];
    $reader = new \GeoIp2\Database\Reader('/path/to/GeoLite2-Country.mmdb');
    $country = $reader->country($ip)->country->isoCode;

    $blocked = array('RU', 'CN');
    if (in_array($country, $blocked))
    {
        fatal_error('Registo indisponível para o seu país.');
    }
}
add_integration_function('integrate_register', 'block_bot_countries');

**Importante:** Mantenha a base GeoIP atualizada semanalmente para evitar falsos positivos.

---

Estratégia 3 – Filtragem de User‑Agent e Referer

Bots headless costumam enviar *User‑Agents* genéricos ou ausentes. Crie uma lista negra e rejeite registos suspeitos.

function block_suspicious_agents()
{
    $ua = strtolower($_SERVER['HTTP_USER_AGENT'] ?? '');
    $blocked_agents = array(
        'python-requests',
        'curl',
        'wget',
        'headlesschrome',
        'phantomjs',
        // adicione variações conhecidas
    );

    foreach ($blocked_agents as $bad)
        if (strpos($ua, $bad) !== false)
            fatal_error('User‑Agent não permitido.');
}
add_integration_function('integrate_register', 'block_suspicious_agents');

Além disso, verifique o cabeçalho **Referer** – se o registo não vem de uma página do seu fórum, bloqueie.

function verify_referer()
{
    $referer = $_SERVER['HTTP_REFERER'] ?? '';
    if (strpos($referer, 'https://comunidade.smfpt.net/') !== 0)
        fatal_error('Referer inválido.');
}
add_integration_function('integrate_register', 'verify_referer');

---

Estratégia 4 – Rate Limiting e Honeypot

1. **Rate Limiting** – limite a 3 tentativas de registo por IP a cada 10 minutos.

function limit_register_attempts()
{
    global $user_info, $smcFunc;
    $ip = $user_info['ip'];
    $now = time();

    $request = $smcFunc['db_query']('', '
        SELECT attempts, last_attempt
        FROM {db_prefix}log_register_attempts
        WHERE ip = {string:ip}',
        array('ip' => $ip)
    );
    $row = $smcFunc['db_fetch_assoc']($request);
    $smcFunc['db_free_result']($request);

    if ($row && $row['attempts'] >= 3 && ($now - $row['last_attempt']) < 600)
        fatal_error('Muitas tentativas de registo. Tente novamente mais tarde.');

    // Atualiza contador
    $smcFunc['db_insert']('replace',
        '{db_prefix}log_register_attempts',
        array('ip' => 'string', 'attempts' => 'int', 'last_attempt' => 'int'),
        array($ip, $row ? $row['attempts'] + 1 : 1, $now),
        array('ip')
    );
}
add_integration_function('integrate_register', 'limit_register_attempts');

2. **Honeypot** – adicione um campo oculto no formulário de registo que humanos não preenchem. Se o campo for preenchido, bloqueie.




No PHP:

function check_honeypot()
{
    if (!empty($_POST['website']))
        fatal_error('Detecção de bot.');
}
add_integration_function('integrate_register', 'check_honeypot');

---

Estratégia 5 – Integração avançada com reCAPTCHA v3 (score) + token

O reCAPTCHA v3 não apresenta desafio ao utilizador; devolve um *score* (0‑1). Defina um limiar baixo (ex.: 0.3) e combine com as outras medidas.

1. Registe‑se no Google reCAPTCHA e obtenha **site‑key** e **secret‑key**.
2. Insira o script no template de registo.
3. Verifique o score no servidor.

// No Register.template




No PHP:

function verify_recaptcha_v3()
{
    $token = $_POST['recaptcha_token'] ?? '';
    $secret = 'YOUR_SECRET_KEY';
    $response = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=$secret&response=$token");
    $data = json_decode($response, true);

    if (!$data['success'] || $data['score'] < 0.3)
        fatal_error('Falha na verificação de segurança (reCAPTCHA).');
}
add_integration_function('integrate_register', 'verify_recaptcha_v3');

Combine o score com a verificação de Q&A para elevar ainda mais a barreira.

---

Estratégia 6 – Modificando o fluxo de registo via hooks do SMF

O SMF oferece *integration hooks* que permitem inserir código personalizado sem tocar nos arquivos core. Use os hooks:

* `integrate_register` – executado antes de criar a conta.
* `integrate_register_after` – após a criação (para enviar e‑mail de verificação).

Exemplo completo de um *plugin* que reúne todas as verificações acima:

// File: Sources/CustomRegisterSecurity.php
if (!defined('SMF'))
    die('No direct access!');

function custom_register_security_init()
{
    add_integration_function('integrate_register', 'block_bot_countries');
    add_integration_function('integrate_register', 'block_suspicious_agents');
    add_integration_function('integrate_register', 'verify_referer');
    add_integration_function('integrate_register', 'limit_register_attempts');
    add_integration_function('integrate_register', 'check_honeypot');
    add_integration_function('integrate_register', 'verify_recaptcha_v3');
    // Q&A já está ativado nas configurações.
}
custom_register_security_init();

Instale o ficheiro em *Sources/* e adicione ao *Settings.php*:

$modSettings['custom_register_security'] = true;

---

Estratégia 7 – Testes, monitorização e manutenção contínua

1. **Logs detalhados** – registre cada falha de registo em *log_security* para analisar padrões.
2. **Ferramentas de monitorização** – use o *SMF Admin Dashboard* ou integrações com *Fail2Ban* para bloquear IPs que excedam limites.
3. **Atualizações regulares** – mantenha o SMF, o GeoIP e as bibliotecas PHP sempre na última versão.
4. **Teste A/B** – compare registos com e sem as novas camadas para garantir que não está a bloquear utilizadores legítimos.

$smcFunc['db_insert']('insert',
    '{db_prefix}log_security',
    array('ip' => 'string', 'reason' => 'string', 'time' => 'int'),
    array($user_info['ip'], 'Bot bloqueado - país RU', time()),
    array()
);

---

Conclusão – Segurança em camadas é a única solução viável

Bloquear 100 % dos bots russos e chineses requer:

* **Perguntas e respostas personalizadas** que dependam de conhecimento cultural.
* **Filtragem GeoIP** para negar registos desses países.
* **Validação de User‑Agent, Referer, Hone

Citação🛑 Cansado de apagar bots e utilizadores falsos manualmente?
Proteja a sua comunidade de forma definitiva. Se precisa de um tema premium, moderno, que afaste bots invasores e funcione perfeitamente em telemóveis, conheça o portfólio de design da Aplic.com.n