Registro delle modifiche

NeoFrag Reborn 1.1.0

Luandre 23 ago 2026 11 min di lettura 36
Sommario
Sommario

Sicurezza

  • Revisione di sicurezza di tutto il codice, e correzione delle falle gravi che ha rilevato:
    • Backup: gli archivi di backup (una copia del database e della cartella config/, che contiene le password) non si possono più scaricare da un semplice indirizzo web, né con Apache né con nginx; solo l'amministrazione (Monitoraggio) li consegna. Il loro nome contiene ora una parte casuale, impossibile da indovinare. La cartella dei log (logs/) è protetta allo stesso modo.
    • Token segreti: gli identificativi di sessione, i token dei moduli e i link inviati per e-mail (password dimenticata, convalida dell'account) vengono da un generatore casuale sicuro; erano prevedibili. Questi link scadono dopo un'ora, e una nuova richiesta annulla la precedente.
    • Accesso: l'autenticazione a due fattori (2FA) e i ban vengono verificati qualunque sia il modo di accedere — password, account Discord, Google o GitHub, link «password dimenticata» —, e non più solo con la password.
    • Link nelle e-mail: l'indirizzo del sito usato nei link inviati per e-mail, al ritorno da un accesso tramite Discord, Google o GitHub e al ritorno da un pagamento Stripe è quello salvato all'installazione (config/url.php), e non più quello che la richiesta dichiara: un attaccante non può più far inviare un link che porti al proprio sito.
    • Pagine di amministrazione: un nome di allegato truccato (in una segnalazione di moderazione) o un falso indirizzo IP (intestazione X-Real-IP, nella cronologia delle sessioni) potevano iniettarvi codice; ora vengono verificati e neutralizzati. Il messaggio di benvenuto di un server di gioco, fornito da un servizio esterno, viene ripulito prima di essere mostrato.
    • Azioni di amministrazione: eliminare, attivare o disattivare, chiudere, approvare, ripristinare, svuotare… richiedono ora un token di sicurezza nei 23 moduli che non ne avevano. Erano semplici link o moduli senza token: un link truccato, cliccato da un amministratore connesso, bastava a scatenare l'azione.
    • Strumenti: gli script della cartella tools/ si eseguono solo da riga di comando, mai da un indirizzo web; a ogni modifica, l'integrazione continua verifica che nessuna dipendenza PHP abbia una falla nota (composer audit).
    • Pulsanti resi muti dalla politica di sicurezza (CSP): la CSP rigorosa del sito blocca le azioni scritte nell'HTML (onclick="…"), per cui questi pulsanti non facevano nulla: banner dei cookie, numero di righe delle tabelle di amministrazione, conferme del cestino e delle revisioni, nome del file allegato nella messaggistica, azioni di gruppo delle menzioni del forum, selezione di un campo al clic, pulsante della finestra di eliminazione. Sono ricollegati in un altro modo e funzionano anche nei contenuti caricati senza ricaricare la pagina. Il selettore del numero di righe chiamava inoltre jQuery, che era già stato rimosso.
  • Politica di sicurezza dei contenuti (CSP) rigorosa: servita dal sito con un token proprio di ogni pagina, rifiuta gli script scritti nella pagina senza quel token (unsafe-inline), il codice costruito al volo (unsafe-eval) e gli oggetti incorporati (object-src 'none'); gli script arrivano ormai solo dal sito e da un breve elenco di indirizzi, dato che TinyMCE e CodeMirror sono ora ospitati dal sito stesso.
  • Sessione rinnovata all'accesso: l'identificativo di sessione cambia quando si accede; un identificativo imposto prima dell'accesso non dà più accesso alla sessione aperta.
  • Segreti cifrati nel database: la password SMTP e la chiave dell'autenticazione a due fattori (2FA) sono cifrate (AES-256-GCM); una copia del database non le consegna più in chiaro. Un valore esistente viene cifrato al successivo salvataggio.
  • Webhook: un webhook non può più puntare alla rete interna del server (indirizzi privati, locali o riservati rifiutati, reindirizzamenti non seguiti).

Aggiunto

  • File CSS e JavaScript sempre aggiornati: ogni file viene richiesto con la sua data di modifica (?v=…), così il browser lo ricarica appena cambia — compreso un file sostituito da un tema o caricato a mano —, senza dover aumentare nf_version_css (che resta usato quando il file non si trova).
  • Marketplace: la finestra «Aggiornamenti» della pagina Temi & Addons segnala che è disponibile una nuova versione di NeoFrag Reborn; l'aggiornamento del nucleo stesso resta manuale.
  • Aggiornamenti degli addon: la stessa finestra confronta gli addon installati con il catalogo del marketplace e installa le nuove versioni, con le loro migrazioni del database.
  • Installer: nuovo aspetto — logo di NeoFrag Reborn, banner «Fork non ufficiale di NeoFrag», riconoscimento a Michaël BILCOT e Jérémy VALENTIN (licenza LGPLv3) a piè di pagina, caratteri Inter e Space Grotesk, colori turchese.
  • File: un gestore di file (albero delle cartelle, caricamento, permessi di lettura per file o per cartella), portato da HiddenCMS, di HiddenBlob (LGPLv3). Incluso nel nucleo.
  • Emoji personalizzate (modulo Emoji, incluso nel nucleo): l'amministrazione aggiunge immagini con un nome, che :nome: mostra nei messaggi e nelle firme del forum, nelle notizie, nelle pagine, negli eventi e nel reclutamento, tra gli altri.
  • Newsletter: invio programmato alla data scelta, a piccoli lotti trattati dall'attività pianificata del sito (cron) invece di inviare tutto in una volta; monitoraggio delle aperture (tasso di apertura per campagna, misurato con un'immagine invisibile); modelli di e-mail riutilizzabili; scelta dei destinatari: tutti gli iscritti, solo i membri o un gruppo.
  • Eventi: un evento può ripetersi ogni giorno, ogni settimana o ogni mese, per il numero di volte scelto — ogni data diventa un evento a tutti gli effetti. I partecipanti, tranne quelli che hanno declinato, ricevono un promemoria sul sito (campanella delle notifiche) prima dell'evento, 24 ore prima per impostazione predefinita; i promemoria passano per l'attività pianificata del sito (cron).
  • Reazioni con emoji: sei reazioni a scelta (👍❤️😂😮😢😡) invece di un solo cuore, come su Discord o Facebook, ognuna con il suo conteggio; i vecchi «mi piace» diventano ❤️.
  • Widget «Stato live» (l'ex widget Twitch): segue più canali alla volta, su Twitch e su YouTube (credenziali Twitch e chiave API YouTube da fornire), con gioco, spettatori, titolo, miniatura e player integrato.
  • Pagine composte: sotto il suo testo, una pagina può mostrare blocchi di altri moduli (ultime notizie, notizie di una categoria, ultimi articoli, download popolari), disposti nell'ordine voluto e impostati uno per uno dalla modifica della pagina. Lo shortcode accetta anche impostazioni, per esempio [block:news.latest count=2].
  • Tema Extend, di Chewbaka, portato su NeoFrag Reborn (Bootstrap 5, modalità giorno e notte), con licenza CC BY-NC-SA 4.0; disponibile nel marketplace.
  • Ricerca istantanea: il widget di ricerca propone risultati dalla seconda lettera digitata (notizie, forum, pagine).
  • Ordinamento degli elenchi di amministrazione: dieci elenchi (notizie, articoli, annunci, download, FAQ, libro degli ospiti, link, media, sondaggi, wiki) si ordinano secondo il criterio scelto.
  • Avatar animati: una GIF animata caricata come avatar resta animata — sempre se il server dispone di Imagick, altrimenti finché non supera i 250 × 250 pixel.
  • Permessi: la griglia dei permessi si apre in una finestra, senza lasciare la pagina.
  • Gestore di file del webmaster (Monitoraggio, pulsante «Gestisci file»): sfogliare i file del sito, modificarli in un editor (CodeMirror), crearne, rinominarli o eliminarli. Le cartelle config/, logs/ e backups/ restano fuori portata; ogni salvataggio conserva una copia .nfbak ed entra nel registro di audit. Ogni scrittura richiede la password webmaster, distinta da quella dell'account e conservata fuori dal database (definita all'installazione o nel Monitoraggio, scheda «Sicurezza webmaster»); una volta definita, viene richiesta di nuovo anche per eliminare o svuotare i backup e per cambiare la chiave dell'attività pianificata.
  • Note di rilascio da un'unica fonte: tools/changelog-section.php estrae una versione di questo registro delle modifiche (CHANGELOG.md), in Markdown o in HTML; le note delle release GitHub ne derivano, e i loro testi non possono più divergere.

Modificato

  • Installer «tutto compreso»: la procedura guidata passa a quattro passaggi (Requisiti → Database → Amministratore → Terminato). Tutti i moduli, widget e temi inclusi vengono installati e attivati al passaggio «Database», e la home page mostra le notizie appena l'installazione è finita; il passaggio «Moduli» e i suoi profili scompaiono.
  • Bootstrap 4.6.2 → 5.3.8, e jQuery non viene più caricato: il JavaScript del sito si appoggia a un piccolo strumento interno (window.NF). Nove plugin jQuery o Bootstrap 4 sono sostituiti (notifiche → toast di Bootstrap 5, selectize → Tom Select, selettore di date → flatpickr, FullCalendar 3 → 6, selettori di colore e di icona, albero e indicatori → codice interno, barre di scorrimento → scorrimento nativo), e jQuery UI da SortableJS. Quattro script dimenticati chiamavano ancora jQuery: sono riscritti nella 1.2.0.
  • Modalità scura: tabelle, schede, menu a tendina ed editor di testo prendono i colori scuri del tema invece di restare bianchi, in tutti i temi.
  • Impostazioni dei widget e disposizione delle pagine: salvate in JSON invece che nel formato di serializzazione di PHP, il che chiude una via di iniezione di codice; le vecchie impostazioni continuano a essere lette.
  • Grafici delle statistiche: Chart.js (licenza MIT) sostituisce Highstock, una libreria commerciale che impediva di ridistribuire liberamente il CMS.

Corretto

  • MySQL 8: aprire una discussione o rispondere nel forum, dividere o unire discussioni, avviare una conversazione nella messaggistica, riordinare le immagini dello Slider… fallivano con un errore fatale su MySQL 8, che rifiutava il modo in cui il sito apriva le sue transazioni. Ora passano per le funzioni di mysqli previste a questo scopo.
  • Emoji: un'emoji — o qualsiasi carattere a 4 byte — in un testo provocava un errore del database. La connessione e tutte le tabelle passano a utf8mb4 (collation utf8mb4_unicode_ci, riconosciuta sia da MySQL 8 sia da MariaDB 10; le collation proprie di MariaDB 11, che facevano fallire l'installazione altrove, scompaiono).
  • where('col', []) generava una condizione vuota (→ DELETE/UPDATE su tutta la tabella): ora produce 1 = 0 (insieme vuoto).
  • Date oltre il 2038: l'invio programmato di una newsletter, la pubblicazione programmata di una notizia, di un articolo, di una galleria o di una pagina, e le date di un evento non potevano superare il 19 gennaio 2038: oltre, MariaDB rifiutava il salvataggio, senza alcun messaggio. Queste date arrivano ora fino all'anno 9999; le installazioni esistenti sono aggiornate tramite una migrazione.
  • /user/login e /user/registration rispondevano «pagina non trovata»: i pulsanti «Accedi» e «Registrazione» dei temi portano lì quando JavaScript è disattivato o il link viene aperto in una nuova scheda. Questi indirizzi aprono ora la finestra di accesso o di registrazione.
  • Nebula: il pulsante «Registrazione» restava visibile quando le registrazioni erano chiuse, e portava a una pagina non trovata. Ora è nascosto in quel caso.
  • Widget Discord: indica la vera causa di un errore (widget disattivato sul server, identificativo sconosciuto, rete) invece di un messaggio generico, mostra il vero logo del server (letto nell'invito pubblico) e conta correttamente i membri online — l'elenco fornito da Discord si ferma a 100, il che falsava il conteggio dei server grandi.
  • Widget TeamSpeak, vista ad albero: andava in crash con PHP 8 e ripiegava sulla scheda semplice. L'albero dei canali e dei client è ora disegnato dal widget stesso, con icone Font Awesome (non serve più un pacchetto di icone); un errore di rete mostra un messaggio generico, senza rivelare l'indirizzo né la porta del server.
  • Widget Discord, Twitch e Server di gioco: mostravano «irraggiungibile» anche quando il servizio rispondeva (la risposta veniva decodificata due volte). Le richieste del sito inviano inoltre un identificativo del browser (User-Agent): senza di esso, i servizi protetti da Cloudflare rispondevano con un rifiuto (errore 403).
  • Backup e Monitoraggio: creare un backup andava in crash sui server con PHP-FPM, e falliva con nginx o Plesk, che rispondevano «pagina non trovata» agli indirizzi in .json; eliminare o scaricare un backup portava a una pagina non trovata; l'albero del Monitoraggio mostrava un errore al primo aggiornamento. Tutto corretto.
  • Marketplace irraggiungibile: URL predefinito passato a senza www (https://neofrag-reborn.xyz/marketplace).
  • Caricamento di più file: il primo file di un caricamento multiplo faceva fallire il caricamento («pagina non trovata») — era ciò che bloccava il caricamento nel modulo File. Per gli sviluppatori: uploaded_file() scambiava l'indice 0 per l'assenza di indice.
  • Webhook: la registrazione di un membro (user.registered), un nuovo commento (comment.created) e una nuova discussione del forum (forum.topic) attivano finalmente il loro webhook; questi eventi venivano proposti ma mai emessi.

Documentazione

  • Documentazione (guide della wiki): per gli sviluppatori, i moduli (form() e form2()) e la validazione delle impostazioni di un widget; per gli amministratori, la risoluzione dei problemi di installazione, un esempio di creazione di un ruolo e cosa fare quando il marketplace è irraggiungibile. Una nota spiega come configurare nginx o Plesk, che rispondevano «pagina non trovata» agli indirizzi in .json.

Da leggere anche

0
Commenti

Gestisci i miei cookie

Il sito installa solo i cookie necessari al suo funzionamento: non richiedono il suo consenso. Gli altri servizi appartengono ad altre società; si caricano solo se li accetta. La sua scelta è conservata per sei mesi, e può cambiarla in qualsiasi momento.

Necessari al sito Sempre attivi

  • __Host-session Mantiene il suo accesso e protegge i moduli dagli invii fraudolenti. Fino alla chiusura del browser; un anno con «Ricordami»
  • nf_consent Conserva le scelte che fa in questa finestra. 6 mesi
  • nf_fuseau Mostra le date e gli orari nel suo fuso orario. 1 anno
  • Memoria del browser Conserva la sua scelta tra modalità giorno e notte, e la presentazione scelta per l’elenco degli articoli. Finché non lo svuota

Video

I video integrati nelle pagine: il lettore proviene dalla piattaforma, che riceve il suo indirizzo IP e può installare i propri cookie.

Musica

I brani e le playlist integrati nelle pagine: il lettore proviene dalla piattaforma, che riceve il suo indirizzo IP e può installare i propri cookie.