Absichern von DocumentDataProvider Implementierungen

Dieser Artikel beschreibt, wie Implementierungen von DocumentDataProvidern aus jadice web toolkit Version 5.5.5.0 und älter abgesichert werden können, um die Anzeige beliebiger Dokumente im Dateisystem des verwendeten Applikationsservers zu unterbinden. 

Hintergrund

Das serverseitige Laden von Dokumenten erfolgt im jadice web toolkit über kundenspezifische Implementierungen des Interfaces com.levigo.jadice.web.server.DocumentDataProvider. Teil der Distribution des jadice web toolkits sind diverse Demoanwendungen, die Kunden als Vorlage für ihre eigene, integrierende Anwendung dienen können. Bestandteil der Demoanwendungen sind Beispiel-Implementierungen von DocumentDataProvidern, die von Kunden als Vorlage für eigene spezifische Implementierungen genutzt werden können. Einige dieser Beispiel-Implementierungen extrahieren den Identifikator des zu ladenden Dokuments aus einer URL, die vom Browser an den Server geschickt wird. Aufgrund einer unzureichenden Prüfung dieser URL in den betroffenen Beispielimplementierungen, kann der Browser durch die Übermittlung einer präparierten URL das Laden einer beliebigen Datei im Dateisystem des Servers anstoßen (vorausgesetzt der Benutzer des Applikationsservers besitzt Leseberechtigung auf diese Datei).

In manchen Anwendungsfällen wird eine clientseitige Javascript API exponiert, über die der Identifikator des zu ladenden Dokuments von einer anderen Browseranwendung gesetzt werden kann. Die zugehörige exponierte Funktion kann dann auch über die Browserkonsole aufgerufen werden, um eine präparierte URL an den Server zu übertragen.

Betroffene Implementierungen

Betroffen sind die folgenden Implementierungen aus dem Package "com.levigo.jadice.web.demo.common.server.dataprovider"

  • UrlDocumentDataProvider
  • UrlRelativeDataProvider

Falls eine kundenspezifische Implementierung auf einer dieser beiden Beispielimplementierungen aufbaut, sollte eine Anpassung gemäß des folgenden Abschnitts erfolgen. 

Lösung

Um das Laden von Dateien aus dem Dateisystem des Applikationsservers zu unterbinden, kann die übermittelte URL serverseitig geprüft werden. Falls das Format der URL nicht der Erwartung entspricht, wird der Ladevorgang abgebrochen.

Codestelle

Eine angepasste Implementierung für die Klasse UrlRelativeDocumentDataProvider könnte folgendermaßen aussehen. Analog dazu könnte auch ein Fix für die Klasse UrlDocumentDataProvider aussehen:

/**
 * <pre>
 * Copyright (c), levigo holding gmbh.
 *
 * This file is subject to the terms and conditions defined in
 * file 'LICENSE.txt', which is part of this source code package.
 * </pre>
 */
package com.levigo.jadice.web.demo.common.server;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Objects;

import com.levigo.jadice.web.demo.common.server.dataprovider.SimpleDocumentDataProvider;
import com.levigo.jadice.web.demo.common.shared.service.sources.RemoteIDHandle;
import com.levigo.jadice.web.demo.common.shared.service.sources.RemoteIDSource;
import com.levigo.util.base.Provider;

public class UrlRelativeDataProvider extends SimpleDocumentDataProvider<RemoteIDSource, RemoteIDHandle> {

  private final URL baseURL;

  public UrlRelativeDataProvider(URL baseURL) {
    Objects.requireNonNull(baseURL, "baseURL");
    check(baseURL);
    this.baseURL = baseURL;
  }

  @Override
  public RemoteIDHandle createSourceHandle(RemoteIDSource source) {
    return new RemoteIDHandle(source.getId());
  }

  @Override
  public Provider<InputStream, IOException> getStream(final RemoteIDSource source) {
    return get(source.getId());
  }

  @Override
  public Provider<InputStream, IOException> getRecoveryStream(RemoteIDHandle sourceHandle) {
    return get(sourceHandle.getId());
  }

  protected Provider<InputStream, IOException> get(final String id) {
    return new Provider<InputStream, IOException>() {
      @Override
      public InputStream get() throws IOException {
        URL url;
        url = new URL(baseURL + id);
        return url.openStream();
      }
    };
  }

  protected void check(URL url) {
    final String protocol = url.getProtocol();
    if (!(protocol.equals("http") || protocol.equals("https")))
      throw new RuntimeException("An invalid protocol was specified: " + protocol + " - " + url.toString());
  }
}

Der oben aufgeführte Fix ist ab jadice web toolkit Version 5.6.0.0 Teil der Distribution. Die Klasse UrlRelativeDocumentDataProvider wurde mit jadice web toolkit Version 5.6.0.0 aus der Distribution gelöscht.

Nach Stichwort filtern

Derzeit gibt es keine Elemente mit den ausgewählten Stichwörtern.