Aumentare la Sicurezza del Sito contro Bot e Registrazioni Fake

1 Febbraio 2026  di  Tech News


Chi e’ del settore sicurezza lo sa! Le registrazioni automatiche di spam sono diventate una delle principali criticità per la sicurezza dei siti web, con bot progettati per creare account fake, saturare i database e compromettere le prestazioni della piattaforma. Questo tipo di attacco sfrutta vulnerabilità comuni nei moduli di registrazione, generando traffico indesiderato e aumentando il rischio di ulteriori intrusioni.

Per mantenere un livello elevato di sicurezza online è fondamentale adottare soluzioni efficaci contro bot, spam e attività automatizzate, proteggendo così la stabilità del sito e l’esperienza degli utenti reali.

Cosa Succede nella Realta’

Chi sviluppa siti web si affida a dei framework ecommerce e cms che spesso lasciano dei buchi di sicurezza ad esempio nelle registrazioni degli utenti.

L’amministratore del sito si vede registrare, nel giro di qualche ora, centinaia di utenti con nomi fasulli.

A me e’ capitato e, te lo dico per esperienza, non e’ affatto semplice difendersi da attacchi pianificati con script che vanno in automatico.

La buona notizia e’ che questi attacchi non fanno grandi danni, solamente ti trovi il database con tanti utenti da cancellare perche’ non reali.

Evoluzione degli Attacchi Spam dagli anni 2000 a oggi

Dai primi anni 2000 a oggi, gli attacchi spam hanno subito un’evoluzione costante, diventando sempre più sofisticati e difficili da individuare. Nei primi anni del nuovo millennio lo spam era dominato da email massive e rudimentali, spesso inviate da botnet improvvisate che sfruttavano computer infetti. L’obiettivo principale era la diffusione di pubblicità non richiesta, phishing elementare e malware di base.

Con l’avanzare della tecnologia, tra il 2005 e il 2010 sono emersi attacchi spam automatizzati sui moduli online, come form di contatto, commenti e registrazioni. I bot iniziavano a compilare automaticamente campi web per generare backlink, diffondere contenuti fraudolenti o saturare i database dei siti. In questo periodo si diffondono anche le prime botnet professionali, capaci di inviare milioni di messaggi al giorno.

Dal 2010 in poi, l’evoluzione dei CMS e delle piattaforme web ha portato gli spammer a sfruttare vulnerabilità più complesse. Nascono gli spam bot intelligenti, in grado di aggirare CAPTCHA semplici, imitare il comportamento umano e creare registrazioni fake su larga scala. L’obiettivo non è più solo la pubblicità, ma anche la creazione di account falsi per attività fraudolente, attacchi di credential stuffing e campagne di phishing avanzato.

Negli ultimi anni, con l’aumento dell’automazione e dell’intelligenza artificiale, gli attacchi spam hanno raggiunto un nuovo livello di complessità. I bot moderni sono capaci di generare testi credibili, utilizzare proxy rotanti, simulare interazioni reali e colpire in modo mirato i moduli di registrazione dei siti web. Questo ha trasformato le registrazioni automatiche di spam in una delle minacce più diffuse per la sicurezza dei siti web, richiedendo soluzioni sempre più avanzate come sistemi anti‑bot evoluti, analisi comportamentale e protezioni basate su machine learning.

Come Difendersi da Attacchi SPAM

Se hai un sito web PHP, allora potresti incorporare nel sito una classe come quella che ti mostro per tenere traccia degli IP malevoli e che stanno registrando utenti fasulli.

<?php

class Firewall {

    private $storage;
    private $log_file;
    private $honeypot_field = 'hfaxin';
    private $allowed_routes = [];

    public function __construct($storage_path, $allowed_routes = []) {

        $this->storage = rtrim($storage_path, '/') . '/';
        $this->log_file = $this->storage . 'firewall.log';
        $this->allowed_routes = $allowed_routes;

        if (!is_dir($this->storage)) {
            mkdir($this->storage, 0755, true);
        }
    }

    /* -------------------------------------------------------------
        IP DETECTION
    ------------------------------------------------------------- */
    public function getClientIp() {
        if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $forwarded = array_reverse(explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']));
            foreach ($forwarded as $ip) {
                $ip = trim($ip);
                if (filter_var($ip, FILTER_VALIDATE_IP)) {
                    return $ip;
                }
            }
        }

        if (!empty($_SERVER['HTTP_X_REAL_IP']) && filter_var($_SERVER['HTTP_X_REAL_IP'], FILTER_VALIDATE_IP)) {
            return $_SERVER['HTTP_X_REAL_IP'];
        }

        return $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';
    }

    /* -------------------------------------------------------------
        LOGGING
    ------------------------------------------------------------- */
    private function log($msg) {
        $date = date('Y-m-d H:i:s');
        file_put_contents($this->log_file, "[$date] $msg\n", FILE_APPEND);
    }

    /* -------------------------------------------------------------
        HONEYPOT
    ------------------------------------------------------------- */
    public function checkHoneypot($route = '') {

        if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
            return true;
        }

        // Se la route NON è nella whitelist → NON controlliamo honeypot
        if (!empty($this->allowed_routes) && !in_array($route, $this->allowed_routes)) {
            return true;
        }

        $ip = $this->getClientIp();
        $page = $_SERVER['REQUEST_URI'] ?? 'unknown';

        // Logica honeypot: se il campo è valorizzato → SPAM
        if (!empty($_POST[$this->honeypot_field])) {
            $value = $_POST[$this->honeypot_field];
            $this->log("SPAM DETECTED | IP: $ip | Value: $value | Page: $page");

            header('HTTP/1.1 429 Too Many Requests');
            exit('Spam detected.');
        }

        $this->log("HONEYPOT OK | IP: $ip | Route: $route");
        return true;
    }

    /* -------------------------------------------------------------
        BLACKLIST
    ------------------------------------------------------------- */
    public function denyIfBlocked() {

        $ip = $this->getClientIp();
        $file = $this->storage . 'malicious_ips.txt';

        if (!file_exists($file)) return;

        $lines = file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
        if (!$lines) return;

        if (in_array($ip, $lines)) {
            $this->log("BLOCKED (blacklist) | IP: $ip");
            header('HTTP/1.1 403 Forbidden');
            exit('Access denied.');
        }
    }

    /* -------------------------------------------------------------
        RATE LIMIT
    ------------------------------------------------------------- */
    public function rateLimit($max_requests = 8, $seconds = 4) {

        // Pulizia automatica file temporanei
        $this->cleanupTmpFiles(300);

        $ip = $this->getClientIp();
        $now = time();

        $access_file = $this->storage . 'access_' . md5($ip) . '.tmp';
        $block_file  = $this->storage . 'block_' . md5($ip) . '.tmp';

        // Se l'IP è bloccato
        if (file_exists($block_file)) {
            $block_until = (int) file_get_contents($block_file);
            if ($now < $block_until) {
                $this->log("RATE LIMIT BLOCK | IP: $ip");
                header('HTTP/1.1 429 Too Many Requests');
                exit('Too many requests.');
            }
            unlink($block_file);
        }

        // Carica accessi recenti
        $accesses = [];
        if (file_exists($access_file)) {
            $accesses = explode("\n", trim(file_get_contents($access_file)));
            $accesses = array_filter($accesses, fn($ts) => ($now - (int)$ts) <= $seconds);
        }

        $accesses[] = $now;

        // Se superiamo il limite → blocco
        if (count($accesses) > $max_requests) {
            file_put_contents($block_file, $now + 10);
            $this->log("RATE LIMIT EXCEEDED | IP: $ip");
            header('HTTP/1.1 429 Too Many Requests');
            exit('Too many requests.');
        }

        file_put_contents($access_file, implode("\n", $accesses));
    }

    /* -------------------------------------------------------------
        CLEANUP FILE TEMPORANEI
    ------------------------------------------------------------- */
    public function cleanupTmpFiles($max_age_seconds = 300) {

        $files = glob($this->storage . '*.tmp');
        if (!$files) return;

        $now = time();

        foreach ($files as $file) {
            $mtime = filemtime($file);

            if ($mtime !== false && ($now - $mtime) > $max_age_seconds) {
                unlink($file);
            }
        }
    }
}

La classe Firewall è un sistema di protezione leggero e indipendente che aiuta a difendere un sito web da:

  • registrazioni spam tramite honeypot
  • attacchi automatizzati e bot aggressivi
  • IP malevoli tramite blacklist
  • flooding e brute‑force grazie al rate‑limit
  • accumulo di file temporanei con pulizia automatica

In pratica, monitora ogni richiesta, blocca quelle sospette e registra tutto in un file di log. È pensata per essere plug‑and‑play, senza dipendenze esterne.

Esempi di Utilizzo in Opencart

La classe si puo’ utilizzare in opencart come nell’esempio seguente:

<?php
// catalog/controller/account/register.php

require_once(DIR_SYSTEM . 'library/Firewall.php');

$fw = new Firewall(DIR_STORAGE . 'firewall/', ['account/register']);

// Blocca IP in blacklist
$fw->denyIfBlocked();

// Rate limit per evitare flood
$fw->rateLimit();

// Honeypot per bloccare bot
$fw->checkHoneypot('account/register');

Quando si parla di honeypot si itende una protezione informatica contro bot che compilano i forms.

Nella pratica in ogni form post si inserice un campo nascosto del tipo

<input type="text" name="hfaxin" style="display:none">

Un utente normale non lo vede, ma un bot puo’ vederlo e riempirlo oppure se un bot mirato puo’ non considerarlo e postare solo i campi base del framework.

Esempi di Utilizzo in WordPress

Per wordpress useremo la stessa classe, ma nel formato seguente

<?php
require_once __DIR__ . '/Firewall.php';

add_action('init', function() {

    $fw = new Firewall(WP_CONTENT_DIR . '/firewall/', ['wp-login.php']);

    // Blocca IP malevoli
    $fw->denyIfBlocked();

    // Rate limit su login e registrazione
    if (strpos($_SERVER['REQUEST_URI'], 'wp-login.php') !== false) {
        $fw->rateLimit();
        $fw->checkHoneypot('wp-login');
    }
});

Conclusioni

Con un po’ di lavoro ed ingegno possiamo cosi’ rendere piu’ sicuro un sito web da improvvisi attacchi spam.

Per inciso, in questo periodo, tutti gli attacchi subiti sono parti da servers e ip collocati in Russia. Non che abbia qualcosa contro la Russia, ma per farvi capire come si stiano muovendo le guerre ibride.

Potrebbe Interessarti


Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *