Blog Was das kostenlose Audit findet Teil 1 von 9

Ihre Mediathek ist öffentlich

Die Mediathek ist kein privater Ordner, weder in WordPress noch anderswo. So halten Sie hochgeladene Entwürfe privat, ohne die API abzuschalten oder Links zu zerstören.

Standardmäßig öffentlich, in jedem System

Eine Mediathek ist ein Ordner auf einem Webserver. Wer eine Datei hochlädt, veröffentlicht sie. Das gilt für WordPress, Drupal und eine statische Website gleichermaßen; der Unterschied ist nur, wie leicht die Auflistung zu finden ist.

In WordPress ist die Auflistung eine Adresse entfernt. Die REST API unter /wp-json/wp/v2/media gibt jedem, der fragt, jede Datei der Mediathek zurück, ohne Anmeldung. Die JSON:API von Drupal tut das Gleiche. Das ist so gewollt: Dieselbe API betreibt den Block-Editor, Galerien, mobile Apps und die Integrationen, die Ihr Team bereits nutzt.

Woher die Überraschung kommt

Menschen behandeln die Mediathek wie Dropbox: einen privaten Ordner, in dem man eine Datei ablegt, um einen Link zu bekommen. Also füllt sie sich mit Dateien, die niemand veröffentlichen wollte. Entwurf drei eines Papiers, dessen Entwurf vier auf der Seite steht. Eine Vorstandsmappe, hochgeladen, damit eine Person sie herunterladen konnte. Ein Bericht, der für nächste Woche geplant ist und heute hochgeladen wurde.

Zwei Dinge werden verwechselt. Eine Datei, auf die keine Seite verlinkt, ist unverlinkt, nicht privat. Eine Datei, die schwer zu finden ist, ist versteckt, nicht privat. Die API listet beide auf, und eine Suchmaschine, die die Adresse findet, indexiert beide.

Warum das Abschalten der API die falsche Lösung ist

Die naheliegende Reaktion ist, die REST API abzuschalten oder den Medien-Endpunkt zu verstecken. Das ist Sicherheit durch Verschleierung: Es unterbindet einen Weg, Dateien aufzulisten, während jede direkte Adresse weiter funktioniert, und es zerstört die Editor-Funktionen und Integrationen, die von der API abhängen.

Die Frage, die zu beantworten ist, lautet: Welche Dateien in der Mediathek sollen öffentlich sein? Sobald Sie das Datei für Datei entschieden haben, ist die Auflistung über die API kein Problem mehr.

So gehen Sie in WordPress damit um

Erstens: Schauen Sie nach. Öffnen Sie /wp-json/wp/v2/media?media_type=application auf Ihrer eigenen Website und lesen Sie, was zurückkommt. Jeder im Internet kann dieselbe Liste sehen.

Zweitens: Entscheiden Sie für jede Datei. Öffentliche Dateien bleiben. Überholte Entwürfe und alles, was nie veröffentlicht werden sollte, werden gelöscht; eine veröffentlichte Fassung pro Papier. Dateien, die existieren müssen, aber nicht auffindbar sein sollen, werden als privat markiert.

Drittens: Markieren Sie sie. Wir haben genau dafür ein kleines Plugin geschrieben, LFW Private Media: ein Kontrollkästchen „Privat“ an jedem Anhang sowie Massenaktionen in der Medienliste. Eine private Datei verschwindet aus der öffentlichen API, der Website-Suche, den Anhangseiten und den Sitemaps, während Ihre Redaktion weiterhin alles sieht. Herunterladen können Sie es unter LFW.com/dl/lfw-private-media.zip. Wenn Sie lieber den Mechanismus sehen möchten, statt etwas zu installieren: Die ganze Idee passt in eine kleine Datei:

Code anzeigen Code ausblenden PHP, 27 Zeilen
<?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

Eine Grenze gilt für das Plugin wie für den Codeausschnitt. Eine Datei, die bereits unter einer direkten Adresse öffentlich ist, bleibt für jeden erreichbar, der diese Adresse hat. Sie als privat zu markieren verhindert, dass Fremde sie entdecken. Es stellt die Datei nicht hinter eine Anmeldung. Alles wirklich Vertrauliche sollte überhaupt nicht in den Upload-Ordner. Stellen Sie es hinter einen zugangsgeschützten Download.

Wenn Sie Kunde sind

Sie müssen nichts installieren. Stellen Sie in Ihrem Portal eine Anfrage, und wir prüfen die Mediathek gemeinsam mit Ihnen, löschen, was wegsoll, markieren als privat, was bleiben soll, und installieren das Plugin. Das ist eine kleine Aufgabe im Rahmen der Website-Betreuung, kein eigenes Projekt.

Wenn Sie noch nicht Kunde sind, sagt Ihnen das kostenlose Audit, wie viele Dateien Ihre Website heute jedem auflistet, der fragt. Wer diese Zahl sieht, hört meist auf, die Mediathek wie Dropbox zu behandeln.

Das kostenlose Audit für Ihre Website starten

Diese Prüfung ist Teil des kostenlosen Audits. Geben Sie Ihre Domain ein, um zu sehen, was es auf Ihrer Website findet.

Nur öffentliche Informationen. Ergebnisse in etwa einer Minute.