So prüfen Sie die Personalisierung bzw. Zeitsteuerung bei Binärdateien

Dieser Artikel beschreibt, wie Sie Binärdokumente, die mit Ansichtsrechten versehen sind, vor einem Direktaufruf schützen.

Mit Hilfe der PHP-Framework Funktion wRepository::checkPermissionViewDocument können Sie PHP-Dateien auf einfache Weise personalisieren. Es genügt, die Berechtigungsprüfung im Kopfbereich einer Datei durchzuführen, um die Anzeige gegebenenfalls zu verhindern. Dies ist in den Beispielprojekten bereits standardmässig so umgesetzt.

Falls Sie andere Dokumententypen wie z.B. Bilder (JPG, PNG, etc.), ZIP oder PDF-Dateien personalisieren wollen, können Sie den Direktaufruf solcher Binärdateien über eine .htaccess Datei umleiten.

Ein Apache Webserver stellt Ihnen hierzu das Apache Modul mod_rewrite zur Verfügung (siehe auch weiterführende Artikel). Dieses Modul ist auf den Apache Installationen der meisten Provider bereits enthalten und ermöglicht es, aufgerufene Links vor deren Ausführung beliebig umzuwandeln. Erfragen Sie dies sicherheitshalber bei Ihrem Provider!

Der direkte Aufruf von Binär-Dokumenten kann auf diese Weise z.B. über eine PHP-Datei umgelenkt werden, über welche die Ansichtsrechte oder der Online-Stauts (offline, Zeitsteuerung) geprüft werden.

Weblication® CMS stellt hierzu softwareseitig die accessDocument.php zur Verfügung, welche über die entsprechende PHP-Framework Funktion die Ansichtsrechte und Zeitsteuerung eines Binärdokumentes prüfen kann. Die jeweilige Binärdatei muss im Falle einer Personalisierungsprüfung eingecheckt sein und in den Datei-Eigenschaften (Personalisierung) entsprechende Ansichtsbenutzer bzw. -gruppen hinterlegt haben. Dies kann auch verzeichnisübergreifend über die Standard-Dateieinstellungen für nicht eingecheckte Dateien vorgenommen werden (siehe weiterführende Links).

Das nachfolgende Beispiel einer .htaccess Datei führt dies beispielhaft im Verzeichnis /projekt-de/kundenbereich/ an und prüft Dateien mit der Endung .pdf, .doc, .png, .jpg, .jpeg und .gif.

Die Regeln können um beliebige Dateiendungen erweitert werden, NC steht dabei für nicht case sensitive (siehe hierzu auch weiterführende Links). Beachten Sie auch, dass die Regeln auf Unterverzeichnisse vererbt werden. Passen Sie die Pfade an Ihre Projektpfade an!

Beispiel: Auszug aus einer .htaccess innerhalb /[IHR-ASSETS-PROJEKT]/kundenbereich

RewriteEngine on

RewriteCond %{REQUEST_URI} \.(jpeg|jpg|webp|gif|png|svg)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) /weblication/grid5/scripts/wImage.php?action=showImageSizeNotYetAvailable [L]
                                      
RewriteCond %{REQUEST_URI} \.pdf$ [NC,OR]
RewriteCond %{REQUEST_URI} \.doc$ [NC,OR]
RewriteCond %{REQUEST_URI} \.png$ [NC,OR]
RewriteCond %{REQUEST_URI} \.jpg$ [NC,OR]
RewriteCond %{REQUEST_URI} \.jpeg$ [NC,OR]
RewriteCond %{REQUEST_URI} \.webp$ [NC,OR]
RewriteCond %{REQUEST_URI} \.gif$ [NC]

#forceDownload aktivieren, um Dateien beim Aufruf zum Speichern anzubieten:
RewriteRule (.*) /[IHR-LAYOUT-PROJEKT]/wGlobal/scripts/accessDocument.php?document=/[IHR-ASSETS-PROJEKT]/kundenbereich/$1&display=1&forceDownload=0&%{QUERY_STRING} [L]

Das aktuelle BASE Basisprojekt hat standardmässig keine Umschreibung bestimmter Binärdateien für das Assets-Verzeichnis gesetzt (Performancegründe). Die Dokumente innerhalb Ihres Assets-Verzeichnisses werden erst dann auf Berechtigung geprüft, wenn Sie dies explizit setzen. Nachfolgend ein Beispiel der Standardauslieferung der .htaccess für das Assets-Verzeichnis. Hiermit werden Dateien mit der angegebenen Dateiendung von der Umleitung auf die accessDocument.php ausgeschlossen. Standardmässig werden somit z.B. PDF- oder DOC-Dateien über das PHP-Skript geleitet, da diese Dateiendungen nicht über die .htaccess Datei ausgeschlossen werden.
Passen Sie die Pfade an Ihre Projektpfade an!

Beispiel: Auszug aus einer .htaccess innerhalb /[IHR-ASSETS-PROJEKT]

<IfModule mod_expires.c>
  ExpiresActive on
  ExpiresDefault           "access plus 30 minutes"
  ExpiresByType image/gif  "access plus 1 month"
  ExpiresByType image/jpg  "access plus 1 month"
  ExpiresByType image/jpeg "access plus 1 month"
  ExpiresByType image/webp "access plus 1 month"
  ExpiresByType image/png  "access plus 1 month"
  ExpiresByType video/mp4  "access plus 1 month"
  ExpiresByType video/ogg  "access plus 1 month"
</IfModule>

<IfModule mod_deflate.c>
  <FilesMatch "\.svg$">
    SetOutputFilter DEFLATE
  </FilesMatch>
</IfModule>

Header set X-Content-Type-Options "nosniff"

Options -Indexes

AddType video/mp4 .mp4
AddType video/mp4 .m4v
AddType audio/mpeg .mp3
AddType image/webp .webp

RewriteEngine on

RewriteCond %{REQUEST_URI} \.(jpeg|jpg|webp|gif|png|svg)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) /weblication/grid5/scripts/wImage.php?action=showImageSizeNotYetAvailable [L]

RewriteCond %{REQUEST_URI} \.\w+$ [NC]
RewriteCond %{REQUEST_URI} !\.gif$ [NC]
RewriteCond %{REQUEST_URI} !\.jpg$ [NC]
RewriteCond %{REQUEST_URI} !\.jpeg$ [NC]
RewriteCond %{REQUEST_URI} !\.webp$ [NC]
RewriteCond %{REQUEST_URI} !\.png$ [NC]
RewriteCond %{REQUEST_URI} !\.svg$ [NC]
RewriteCond %{REQUEST_URI} !\.swf$ [NC]
RewriteCond %{REQUEST_URI} !\.flv$ [NC]
RewriteCond %{REQUEST_URI} !\.avi$ [NC]
RewriteCond %{REQUEST_URI} !\.mov$ [NC]
RewriteCond %{REQUEST_URI} !\.wmv$ [NC]
RewriteCond %{REQUEST_URI} !\.mpg$ [NC]
RewriteCond %{REQUEST_URI} !\.mpeg$ [NC]
RewriteCond %{REQUEST_URI} !\.mp4$ [NC]
RewriteCond %{REQUEST_URI} !\.m4v$ [NC]
RewriteCond %{REQUEST_URI} !\.mp3$ [NC]
RewriteCond %{REQUEST_URI} !\.ogv$ [NC]
RewriteCond %{REQUEST_URI} !\.ogg$ [NC]
RewriteCond %{REQUEST_URI} !\.php$ [NC]
RewriteCond %{REQUEST_URI} !\.html$ [NC]

#forceDownload aktivieren, um Dateien beim Aufruf zum Speichern anzubieten:
RewriteRule (.*) /[IHR-LAYOUT-PROJEKT]/wGlobal/scripts/accessDocument.php?document=/[IHR-ASSETS-PROJEKT]/$1&display=1&forceDownload=0&%{QUERY_STRING} [L]

Hinweis

Liegt im Verzeichnis einer Binär-Datei (z.B. jpg Bild) keine solche .htaccess Datei ab, wird über die Datei-Eigenschaften (Personalisierung) einer dort enthaltenen Datei ein Warnhinweis ausgegeben:

"Die Personalisierung dieses Dokumentes wird vom Webserver derzeit nicht unterstützt!"

Ab CMS-Version 015.006.014.000 wird in solchen Fällen auch in den Standard-Dateieinstellungen (Eigenschaften - Personalisierung) ein Warnhinweis ausgegeben:

"Die Personalisierung ist nur dann sichergestellt, wenn in die entsprechenden Dateitypen in der .htaccess berücksichtigt werden. Bitte prüfen Sie das!"

Bei zeitgesteuerten oder offline gesetzten Dokumenten wird über die Datei-Eigenschaften (Veröffentlichung) folgende Meldung ausgegeben:

"Das Offline-Schalten dieses Dokumentes wird vom Webserver derzeit nicht unterstützt!"

Im Dateiexplorer selber wird zu solchen Dokumenten ein rotes Ausrufezeichen zum Datei-Status angezeigt, welcher per Tooltipp darüber informiert.