Vai al contenuto

Chiunque può avviare le attività pianificate del tuo sito tramite wp-cron.php

Avviso Intero dominio Sicurezza

Istruzioni generali. Apri questo articolo dal tuo report PageCheck per vederlo compilato con l’indirizzo del tuo sito e le regole per il suo server web.

Che cos’è

WordPress esegue le sue attività pianificate – pubblicare gli articoli programmati, inviare e-mail, backup, aggiornamenti dei plugin – tramite il file wp-cron.php. Di serie lo avvia da solo mentre i visitatori navigano nel sito, quindi il file deve rispondere alle richieste da internet.

Cosa non va

Il file risponde a chiunque, quindi chiunque, bot compresi, può avviare le attività pianificate del sito tutte le volte che vuole. Ogni richiesta fa caricare WordPress per intero, quindi richieste ripetute sono un modo economico per caricare il server e rallentare il sito. Le attività avviate dalle visite sono anche poco affidabili: su un sito poco visitato partono in ritardo.

Come correggere

Segui i passaggi in quest’ordine: bloccare prima il file fermerebbe gli articoli programmati e le e-mail.

1. Esegui le attività pianificate dal server. Aggiungi nel pannello dell’hosting un’attività pianificata (cron) che venga eseguita ogni 5 minuti:

  • Plesk: Websites & Domains → Scheduled Tasks → Add Task, tipo «Run a PHP script», script httpdocs/wp-cron.php.
  • cPanel: Cron Jobs, comando cd /home/USER/public_html && php wp-cron.php (con il tuo nome account e la tua cartella).
  • Un server con WP-CLI: wp cron event run --due-now --path=/path/to/site.

Esegui il file con PHP sul server, non aprendo il suo indirizzo via internet (wget o curl): il passaggio 3 lo blocca. Gli hosting WordPress gestiti hanno spesso già un’attività sul server: chiedi a loro.

2. Impedisci a WordPress di avviarlo a ogni visita. Aggiungi questa riga a wp-config.php, sopra la riga /* That's all, stop editing! */:

wp-config.php

define( 'DISABLE_WP_CRON', true );

3. Chiudi il file all’esterno. Usa la regola per il tuo server web (il tuo hosting può dirti quale è):

Apache o LiteSpeed: nel file .htaccess nella cartella principale del sito, sopra la riga «# BEGIN WordPress»

<Files "wp-cron.php">
    Require all denied
</Files>

nginx: nel blocco server del sito

location = /wp-cron.php {
    deny all;
}

Con Cloudflare puoi bloccarlo lì invece: Security → WAF → Custom rules, una regola «URI Path equals /wp-cron.php» con l’azione Block.

4. Verifica. Apri https://example.com/wp-cron.php: ora dovrebbe rispondere «Forbidden» (403). Programma un articolo di prova qualche minuto avanti e verifica che venga pubblicato in orario, poi esegui di nuovo questo controllo.

Close wp-cron.php on my WordPress site to requests from the internet, without breaking scheduled tasks. https://example.com/wp-cron.php currently answers anyone.
The web server type is not known; check which one the site runs on.

Steps, in this order:
1. Set up a server-side scheduled task that runs WordPress cron every 5 minutes with PHP on the server (php wp-cron.php from the site's folder, or wp cron event run --due-now). Not wget/curl over HTTP: step 3 would block it.
2. Add define( 'DISABLE_WP_CRON', true ); to wp-config.php above "That's all, stop editing!".
3. Deny HTTP access to /wp-cron.php: on Apache/LiteSpeed a <Files "wp-cron.php"> Require all denied </Files> block in .htaccess above # BEGIN WordPress; on nginx location = /wp-cron.php { deny all; } in the server block.
4. Verify: /wp-cron.php answers 403, wp cron event list shows no overdue events after 10 minutes, and a post scheduled a few minutes ahead is published on time.
Tell me exactly which files you changed and what to check in the hosting control panel.

Resources:
- Hooking WP-Cron into the system task scheduler (WordPress.org): https://developer.wordpress.org/plugins/cron/hooking-wp-cron-into-the-system-task-scheduler/

Controlla il tuo sito per sapere se ha questo problema. Controlla un sito