🧱 Introduzione
In questa terza parte della guida verrà implementato un sistema di protezione crittografica per WordPress e WooCommerce, utilizzando l’algoritmo AES-256 tramite OpenSSL, al fine di cifrare i dati sensibili degli utenti (nome, email, indirizzo di spedizione, ecc.) prima che vengano salvati nel database. L’obiettivo è garantire che nessun dato venga salvato in chiaro nel database, mantenendo la compatibilità con Tor e un ambiente completamente isolato dal web tradizionale. Libsodium è un’alternativa moderna e sicura, ma per semplicità e compatibilità nel contesto di questo POC, si è scelto OpenSSL.
ℹ️ Nota: aspetti come la cifratura del disco, snapshot automatici, gestione dei backup cifrati e tecniche di anti-forensics non sono trattati in questa guida. Verranno pubblicati come contenuti separati avanzati. Per soluzioni personalizzate e ambienti di produzione, offro supporto IT su misura. Si consiglia fortemente di cifrare il disco già in fase di installazione del sistema operativo.
Prima di procedere, assicurati di aver completato correttamente la Parte 2 e di avere un’installazione WordPress pulita, accessibile solo via Tor, senza utenti reali né plugin non autorizzati.
📌 BTCPay Server e l’integrazione per i pagamenti in Bitcoin saranno trattati in una guida separata.
💡 Nota tecnica: WooCommerce deve essere installato e funzionante prima dell’implementazione della cifratura. Questo perché la struttura dei metadati, gli hook e i flussi ordine vengono registrati solo dopo l’installazione del plugin. Cercare di cifrare i dati prima di questa fase comprometterebbe il corretto funzionamento degli hook e del salvataggio sicuro.
🔐 1. Obiettivi di questa fase
- Crittografare i dati utente memorizzati da WooCommerce, inclusi nome, indirizzo, telefono ed email, con l’eccezione del nome utente e della mail dell’account, che rimangono in chiaro per garantire la compatibilità con il sistema di login
- Proteggere moduli personalizzati e form di checkout
- Visualizzare i dati criptati anche nel backend admin
- Aggiungere 2-3 prodotti di test per simulare un ordine
⚙️ 2. Installazione WooCommerce e configurazione iniziale
🎨 Nota: per questo POC viene utilizzato uno dei temi predefiniti di WordPress (es. Twenty Twenty-Five). La guida non tratta personalizzazione grafica o sviluppo frontend, ma si concentra esclusivamente su funzionalità e sicurezza.
📦 2.1 Installare WooCommerce
Accedi al pannello di amministrazione WordPress via Tor Browser, quindi:
- Vai su Plugins → Add Plugin
- Cerca “WooCommerce”
- Fai clic su Install Now, quindi su Activate
⚙️ 2.2 Configurare le funzionalità del checkout
💡 Nota tecnica: in questo POC la creazione degli account è mantenuta attiva, poiché i dati sensibili vengono cifrati prima di essere memorizzati. Questo garantisce che l’anonimato del cliente resti preservato anche in presenza di un account registrato. Inoltre, l’uso degli account semplifica la comunicazione con lo staff e il tracciamento dello stato degli ordini da parte dell’utente. Tuttavia, l’attivazione degli account comporta anche una maggiore esposizione a potenziali abusi, come la generazione di account o ordini fittizi. In ambienti di produzione, si raccomanda di affiancare questa configurazione a sistemi di rate limiting, logging avanzato e filtri anti-spam lato server.
Impostazioni consigliate – WooCommerce → Settings → Accounts & Privacy

Privacy policy
- Imposta una pagina fittizia oppure lascia il campo vuoto
Personal data retention
- Lascia tutti i campi vuoti: i dati cifrati verranno conservati finché necessario per il test
🧹 2.3 Rimuovere campi non necessari dal checkout (Opzionale)
Installa il plugin gratuito Checkout Field Editor for WooCommerce o modifica via hook per:
- Rimuovere il campo telefono
- Rendere opzionale o rimuovere qualsiasi altro campo indesiderato
Assicurati che i seguenti campi rimangano attivi:
- Nome, Cognome
- Indirizzo 1, Indirizzo 2
- Città, Stato, CAP, Paese
- Note ordine (opzionale)
🧪 2.4 Creare prodotti di test
- Vai su Products → Add New
- Inserisci un titolo, breve descrizione e un prezzo simbolico in EUR o USD (la valuta sarà poi sostituita con BTC in fase di integrazione BTCPay)
- Imposta lo stato come “pubblicato”
Crea almeno 3 prodotti per testare il flusso di checkout.

✅ 2.5 Testare il checkout
- Visita il sito in modalità utente tramite Tor Browser
- Aggiungi un prodotto al carrello
- Procedi con il checkout compilando solo i campi richiesti
- Se visualizzi “No shipping options available”, assicurati di aver configurato almeno una zona di spedizione valida in WooCommerce → Settings → Shipping
- Se appare “No payment method provided”, attiva temporaneamente il metodo di pagamento “Cash on Delivery” o “Check Payments” da WooCommerce → Settings → Payments
- Completa l’ordine (anche se non verrà pagato)
- Accedi al backend e verifica che l’ordine sia stato registrato correttamente
➡️ A questo punto, il sistema è pronto per implementare la cifratura dei dati sensibili nel passo successivo.
✉️ Nota tecnica: in questo POC non è previsto l’invio automatico di email. WooCommerce, di default, tenta di notificare il cliente via email dopo l’ordine. Tuttavia, la configurazione di un server SMTP o relay Tor-based è un argomento avanzato e non è trattato in questa guida. Questo aspetto è disponibile esclusivamente tramite i miei servizi IT dedicati alla messa in produzione sicura di ambienti WordPress/WooCommerce nel Dark Web.
🔐 3. Implementazione della cifratura dei dati utente
📥 3.1 Intercettare i dati durante il checkout
Per cifrare i dati sensibili al momento dell’ordine, utilizziamo l’hook woocommerce_new_order
. Questo viene eseguito subito dopo che l’ordine è stato creato e salvato nel database, consentendo di modificare i dati appena persistiti prima che vengano processati da altri componenti del sistema, come notifiche automatiche o plugin terzi
Aggiungi il seguente codice nel file functions.php
del tuo tema child. Puoi modificarlo direttamente da:
- Pannello WordPress: Aspetto → Editor del Tema → Seleziona “functions.php”
- Accesso SSH: via terminale, con un editor come
vi
onano
vi /var/www/mydrugs3oe3a7o6izy6j4u5jjfm3r52ldgf4cwp2dh6pvqr2rbccjnad.onion/wp-content/themes/twentytwentyone/functions.php
Inserisci il codice subito dopo il tag ********************<?php
, all’inizio del file, ma fuori da qualsiasi altra funzione o condizione preesistente. Assicurati inoltre di non chiudere il file con ********************?>
, per evitare problemi di parsing PHP.
add_action('woocommerce_new_order', 'encrypt_order_hpos_on_create', 20, 1);
function encrypt_order_hpos_on_create($order_id) {
global $wpdb;
$key = file_get_contents('/var/keys/key.bin');
$iv = file_get_contents('/var/keys/iv.bin');
if (!$key || !$iv) return;
$address_types = ['billing', 'shipping'];
$fields = ['first_name', 'last_name', 'address_1', 'address_2', 'city', 'postcode', 'state', 'country', 'email', 'phone'];
foreach ($address_types as $type) {
$row = $wpdb->get_row(
$wpdb->prepare("SELECT * FROM wp_wc_order_addresses WHERE order_id = %d AND address_type = %s", $order_id, $type),
ARRAY_A
);
if (!$row) continue;
$updates = [];
foreach ($fields as $field) {
if (!empty($row[$field])) {
$enc = openssl_encrypt($row[$field], 'aes-256-cbc', $key, 0, $iv);
if ($enc !== false) {
$updates[] = $wpdb->prepare("`$field` = %s", $enc);
}
}
}
if (!empty($updates)) {
$sql = "UPDATE wp_wc_order_addresses SET " . implode(', ', $updates) . " WHERE order_id = %d AND address_type = %s";
$wpdb->query($wpdb->prepare($sql, $order_id, $type));
}
}
}
📌 Nota: key.bin
e iv.bin
devono essere file binari contenenti rispettivamente una chiave a 256 bit (32 byte) e un vettore IV a 128 bit (16 byte), con permessi restrittivi (chmod 600
).
🔒 3.2 Posizionare le chiavi fuori dal webroot
mkdir -p /var/keys
openssl rand -out /var/keys/key.bin 32
openssl rand -out /var/keys/iv.bin 16
chmod 600 /var/keys/*
chown www-data:www-data /var/keys/*
➡️ A questo punto, ogni campo specificato verrà salvato nel database in formato cifrato, visibile come testo codificato Base64 nel backend WooCommerce.
📌 Procedi ora con un test reale: crea un nuovo ordine di prova tramite Tor Browser, inserendo dati fittizi nei campi richiesti (nome, indirizzo, email, ecc.). Una volta completato l’ordine, accedi al backend WooCommerce e verifica che i valori dei metadati dell’ordine siano cifrati. Questo confermerà che la funzione openssl_encrypt()
è stata correttamente applicata ai campi specificati.

🔓 4. Decifrare i dati manualmente via script CLI
Per decifrare i dati utente in modo sicuro, crea un file chiamato decrypt-hpos-secure.php
con il seguente contenuto:
<?php
require_once '/var/www/mydrugs3oe3a7o6izy6j4u5jjfm3r52ldgf4cwp2dh6pvqr2rbccjnad.onion/wp-load.php';
$key = file_get_contents('/var/keys/key.bin');
$iv = file_get_contents('/var/keys/iv.bin');
if (!$key || !$iv) {
fwrite(STDERR, "❌ Chiave o IV non trovata.\n");
exit(1);
}
$order_id = intval($argv[1] ?? 0);
if (!$order_id) {
fwrite(STDERR, "❌ Specificare ID ordine. Uso: php decrypt-hpos-secure.php 42\n");
exit(1);
}
global $wpdb;
$address_types = ['billing', 'shipping'];
$fields = ['first_name', 'last_name', 'address_1', 'address_2', 'city', 'postcode', 'state', 'country', 'email', 'phone'];
echo "\n🔓 Dati decifrati per l'ordine #$order_id\n";
foreach ($address_types as $type) {
$row = $wpdb->get_row(
$wpdb->prepare("SELECT * FROM wp_wc_order_addresses WHERE order_id = %d AND address_type = %s", $order_id, $type),
ARRAY_A
);
if (!$row) {
echo "\n❌ Nessun dato $type trovato.\n";
continue;
}
echo "\n📦 $type address:\n";
foreach ($fields as $field) {
$val = $row[$field] ?? null;
if ($val !== null) {
$dec = openssl_decrypt($val, 'aes-256-cbc', $key, 0, $iv);
echo str_pad($field, 15) . ": " . ($dec !== false && $dec !== '' ? $dec : '---') . "\n";
} else {
echo str_pad($field, 15) . ": ---\n";
}
}
}
Esegui il file dalla shell con:
php decrypt-hpos-secure.php 48

⚠️ Sicurezza operativa
- Esegui la decifratura esclusivamente in ambienti controllati e affidabili
- Lo script CLI viene eseguito dalla shell del server: i dati vengono elaborati in memoria e visualizzati a schermo, senza essere scritti su disco. Il comando potrebbe apparire nella cronologia della shell (bash history), ma in questo contesto è accettabile
- Cancella eventuali file temporanei dopo l’uso
- Non salvare mai le chiavi crittografiche nel database o all’interno del browser
📌 Nota tecnica: trattandosi di una dimostrazione tecnica, alcune funzionalità come la cifratura dell’username e dell’email non sono implementate per evitare interferenze con il meccanismo di autenticazione. In un sistema di produzione, questi dati sarebbero comunque protetti dalla cifratura del disco. La presenza di un nome o email senza altri dati sensibili (come indirizzo o telefono) è considerata accettabile in questo scenario.
✅ Conclusione
Hai ora un sistema WooCommerce in grado di cifrare i dati sensibili degli utenti, mantenendo compatibilità con ambienti Tor. La Parte 4 della guida coprirà l’integrazione con BTCPay Server per i pagamenti in Bitcoin.
🔐 Per estensioni avanzate come backup cifrati, storage protetto, logging offuscato o anti-forensics, richiedi il mio supporto IT personalizzato.