Blog Che cosa trova l'audit gratuito Parte 1 di 9

La sua libreria media è pubblica

La libreria media non è una cartella privata, né in WordPress né altrove. Come mantenere private le bozze caricate senza disattivare l’API né rompere i link.

Pubblica per impostazione predefinita, in tutti i sistemi

Una libreria media è una cartella su un server web. Caricare un file significa pubblicarlo. Vale per WordPress, per Drupal e per un sito statico; l’unica differenza è quanto sia facile trovare l’elenco.

In WordPress, l’elenco è a un indirizzo di distanza. La REST API in /wp-json/wp/v2/media restituisce ogni file della libreria media a chiunque lo chieda, senza accesso. La JSON:API di Drupal fa l’equivalente. È voluto: la stessa API alimenta l’editor a blocchi, le gallerie, le app mobili e le integrazioni che il suo team usa già.

Da dove viene la sorpresa

Le persone trattano la libreria media come un Dropbox: una cartella privata in cui si mette un file per ottenerne un link. Così si riempie di file che nessuno voleva pubblicare. La bozza tre di un rapporto di cui la bozza quattro è quella sulla pagina. Un documento del consiglio caricato perché una persona potesse scaricarlo. Un rapporto previsto per la settimana prossima, caricato oggi.

Si confondono due fatti. Un file a cui nessuna pagina mette un link è non collegato, non privato. Un file difficile da trovare è nascosto, non privato. L’API elenca entrambi, e un motore di ricerca che trova l’indirizzo li indicizzerà entrambi.

Perché disattivare l’API è la correzione sbagliata

La risposta istintiva è disattivare la REST API, o nascondere l’endpoint dei media. È sicurezza per oscurità: si blocca un modo di elencare i file mentre ogni indirizzo diretto continua a funzionare, e si rompono le funzioni dell’editor e le integrazioni che dipendono dall’API.

La domanda da decidere è quali file della libreria media debbano essere pubblici. Una volta fatta questa scelta file per file, l’elenco dell’API smette di essere un problema.

Come fare in WordPress

Prima di tutto, guardi. Apra /wp-json/wp/v2/media?media_type=application sul suo sito e legga che cosa torna. Chiunque su Internet può vedere lo stesso elenco.

Poi decida file per file. I file pubblici restano. Le bozze superate e tutto ciò che non era mai destinato alla pubblicazione si eliminano; una versione pubblicata per rapporto. I file che devono esistere senza essere scoperti si rendono privati.

Infine, li contrassegni. Abbiamo scritto un piccolo plugin proprio per questo, LFW Private Media: una casella Privato su ogni allegato, più azioni di gruppo nell’elenco dei Media. Un file privato scompare dall’API pubblica, dalla ricerca del sito, dalle pagine degli allegati e dalle sitemap, mentre i suoi editor continuano a vedere tutto. Lo scarichi da LFW.com/dl/lfw-private-media.zip. Se preferisce vedere il meccanismo invece di installare qualcosa, l’intera idea sta in un piccolo file:

Mostra il codice Nascondi il codice PHP, 27 righe
<?php
/**
 * Plugin Name: Private media (minimal)
 * Keeps attachments carrying the meta key _lfw_private out of the public REST API.
 * Editors (anyone who can upload files) still see them.
 */

// The collection: /wp-json/wp/v2/media
add_filter( 'rest_attachment_query', function ( $args ) {
  if ( current_user_can( 'upload_files' ) ) { return $args; }
  $args['meta_query']   = isset( $args['meta_query'] ) ? $args['meta_query'] : array();
  $args['meta_query'][] = array( 'key' => '_lfw_private', 'compare' => 'NOT EXISTS' );
  return $args;
} );

// A single item: /wp-json/wp/v2/media/123
add_filter( 'rest_request_before_callbacks', function ( $response, $handler, $request ) {
  if ( current_user_can( 'upload_files' ) ) { return $response; }
  if ( preg_match( '#^/wp/v2/media/(\d+)$#', $request->get_route(), $m )
       && '1' === get_post_meta( (int) $m[1], '_lfw_private', true ) ) {
    return new WP_Error( 'rest_post_invalid_id', 'Invalid post ID.', array( 'status' => 404 ) );
  }
  return $response;
}, 10, 3 );

// Mark a file private: add the meta key _lfw_private with the value 1.
// With WP-CLI: wp post meta update <attachment-id> _lfw_private 1

Un limite vale sia per il plugin sia per il frammento di codice. Un file già pubblico a un indirizzo diretto resta accessibile a chiunque abbia quell’indirizzo. Renderlo privato impedisce agli sconosciuti di scoprirlo. Non mette il file dietro un’autenticazione. Ciò che è davvero riservato non deve stare nella cartella dei caricamenti. Lo metta dietro un download ad accesso controllato.

Se è un cliente

Non deve installare nulla. Apra una richiesta nel suo portale e analizzeremo con lei la libreria media, elimineremo ciò che deve sparire, renderemo privato ciò che deve restare e installeremo il plugin. È una piccola attività inclusa nel canone, non un progetto a parte.

Se non è ancora un cliente, l’audit gratuito le dirà quanti file il suo sito elenca oggi a chiunque lo chieda. Vedendo quel numero, la maggior parte delle persone smette di trattare la libreria media come un Dropbox.

Esegua l'audit gratuito sul suo sito

Questo controllo fa parte dell'audit gratuito. Inserisca il suo dominio per vedere che cosa trova sul suo sito.

Solo informazioni pubbliche. Risultati in circa un minuto, in inglese.