IBM Buch

Verwaltung und Programmierung für OS/400

Makro-Entwicklungsverfahren

Net.Data stellt mehrere Mechanismen bereit, mit denen Benutzer Eingabevariablen Werte zuordnen können. Sie können sicherstellen, daß Makros auf die gewünschte Art ausgeführt werden, indem Sie diese Eingabevariablen durch das Makro prüfen lassen. Ihre Datenbank und Anwendung sollten zudem so entworfen werden, daß der Zugriff von Benutzern auf Daten, zu deren Anzeige sie berechtigt sind, begrenzt ist.

Verwenden Sie beim Schreiben Ihrer Net.Data-Makros folgende Entwicklungsverfahren. Diese Verfahren tragen dazu bei, daß Ihre Anwendungen wie gewünscht ausgeführt werden und daß der Datenzugriff auf Benutzer mit entsprechender Berechtigung begrenzt ist.

Sicherstellen, daß Net.Data-Variablen in einer URL-Adresse nicht überschrieben werden können
Die Einstellung von Net.Data-Variablen durch einen Benutzer in einer URL-Adresse überschreibt die Auswirkung von DEFINE-Anweisungen, mit denen Variablen in einem Makro initialisiert werden. Dadurch wird eventuell die Art der Makroausführung geändert. Sie können dies verhindern, indem Sie Ihre Net.Data-Variablen mit der Funktion DTW_ASSIGN() initialisieren.

Beispiel: Verwenden Sie @DTW_ASSIGN(SHOWSQL, "NO") anstelle von %DEFINE SHOWSQL="NO", um die Net.Data-Variable SHOWSQL festzulegen. In diesem Fall überschreibt eine Abfragezeichenfolgezuordnung wie SHOWSQL=YES die Makroeinstellung nicht.

Sie können die Anzeige von SQL-Anweisungen in Produktionsumgebungen mit einer der folgenden Methoden inaktivieren:

Informationen zur Syntax und Beispiele für die Net.Data-Variable SHOWSQL finden Sie unter SHOWSQL im Kapitel über Variablen des Handbuchs Net.Data Reference.

Mit DTW_ASSIGN können Sie auch sicherstellen, daß andere Net.Data-Variablen wie RPT_MAX_ROWS oder START_ROW_NUM nicht überschrieben werden. Weitere Informationen zu diesen Variablen finden Sie im entsprechenden Kapitel über Variablen des Handbuchs Net.Data Reference.

Sicherstellen, daß Ihre SQL-Anweisungen nicht so geändert werden können, daß sich das beabsichtigte Verhalten Ihrer Anwendung ändert

Durch das Hinzufügen einer Net.Data-Variablen zu einer SQL-Anweisung in einem Makro können Benutzer die SQL-Anweisung vor ihrer Ausführung dynamisch ändern. Der Makroautor ist dafür verantwortlich, die vom Benutzer gestellten Eingabewerte zu prüfen und sicherzustellen, daß eine SQL-Anweisung mit einem Variablenverweis nicht auf unerwartete Weise geändert wird. Ihre Net.Data-Anwendung sollte vom Benutzer gestellte Eingabewerte in der URL-Adresse prüfen, so daß die Net.Data-Anwendung ungültige Eingaben zurückweisen kann. Beim Entwerfen einer Gültigkeitsprüfung sollten Sie die folgenden Schritte ausführen:

  1. Geben Sie die Syntax für gültige Eingaben an. Zum Beispiel muß eine Kunden-ID mit einem Buchstaben anfangen und kann nur alphanumerische Zeichen enthalten.

  2. Ermitteln Sie, welcher Schaden durch versehentliche oder absichtliche falsche Eingaben sowie durch Eingaben, durch die auf interne Daten der Net.Data-Anwendung zugegriffen werden soll, verursacht werden kann.

  3. Nehmen Sie in das Makro Eingabeprüfungsanweisungen auf, die die Anforderungen der Anwendung erfüllen. Eine derartige Prüfung hängt von der Syntax der Eingabe und ihrer Verwendungsweise ab. In einfacheren Fällen reicht es eventuell aus, die Eingabe auf ungültigen Inhalt zu überprüfen oder Net.Data aufzurufen, um den Typ der Eingabe zu prüfen. Wenn die Syntax der Eingabe komplexer gestaltet ist, muß der Makroentwickler eventuell die Eingabe teilweise oder vollständig syntaktisch analysieren, um zu prüfen, ob sie gültig ist.

Beispiel 1: Verwenden der Zeichenfolgefunktion DTW_POS() zum Prüfen von SQL-Anweisungen

%FUNCTION(DTW_SQL) query1() {  		
   select * from shopper where shlogid = '$(shlogid)'              
%}

Der Wert der Variable shlogid soll eine Käufer-ID (shopper) sein. Durch diese Variable soll die Anzahl der Zeilen, die durch die Anweisung SELECT zurückgegeben wird, auf die Zeilen begrenzt werden, die Informationen zum durch die Käufer-ID angegebenen Käufer enthalten. Wenn jedoch die Zeichenfolge "smith' or shlogid<>'smith" als Wert der Variable shlogid übergeben wird, sieht die Abfrage wie folgt aus:

select * from shopper where shlogid = 'smith' or shlogid<>'smith'

Diese vom Benutzer geänderte Version der ursprünglichen SQL-Anweisung SELECT gibt die gesamte Käufertabelle zurück.

Mit den Net.Data-Zeichenfolgefunktionen können Sie sicherstellen, daß die SQL-Anweisung nicht auf unerwünschte Weise durch den Benutzer geändert wird. Sie können z. B. mit der folgenden Logik sicherstellen, daß der Eingabewert, der der Variablen shlogid zugeordnet ist, aus einer einzelnen Käufer-ID besteht:

@DTW_POS(" ", $(shlogid), result)
%IF (result == "0")
  @query1()
%ELSE
  %{ perform some sort of error processing %}
%ENDIF

Beispiel 2: Verwenden von DTW_TRANSLATE()

Angenommen, Ihre Anwendung muß sicherstellen, daß der in der Eingabevariablen number_of_orders bereitgestellte Wert eine ganze Zahl ist. Hierzu können Sie die Umsetztabelle input_translation_table erstellen, die alle Tastaturzeichen mit Ausnahme der numerischen Zeichen 0-9 enthält, und die Eingabe mit den Zeichenfolgefunktionen DTW_TRANSLATE und DTW_POS prüfen:

@DTW_TRANSLATE(number_of_orders, "x", input_translation_table, "x", string_out) 
      
 @DTW_POS("x", string_out, result)
 
     %IF (result = "0")
 
       %{ continue with normal processing %}
 
%ELSE
 
       %{ perform some sort of error processing %}
 
%ENDIF

Beachten Sie, daß SQL-Anweisungen in gespeicherten Prozeduren nicht durch Benutzer über Web-Browser geändert werden können und daß vom Benutzer gestellte Eingabeparameterwerte durch die SQL-Datentypen, die den Eingabeparametern zugeordnet sind, beschränkt sind. In Situationen, in denen es unpraktisch ist, Benutzereingabewerte mit den Net.Data-Zeichenfolgefunktionen zu prüfen, können Sie gespeicherte Prozeduren verwenden.

Sicherstellen, daß ein Dateiname in einer INCLUDE-Anweisung nicht so geändert wird, daß sich das beabsichtigte Verhalten Ihrer Anwendung ändert
Wenn Sie den Wert für den Dateinamen mit einer INCLUDE-Anweisung bei Verwendung einer Net.Data-Variablen angeben, dann wird die aufzunehmende Datei erst während der Ausführung der INCLUDE-Datei ermittelt. Soll der Wert dieser Variablen in Ihrem Makro festgelegt werden, ein Benutzer jedoch nicht in der Lage sein, den vom Makro bereitgestellten Wert über einen Browser zu überschreiben, dann legen Sie den Wert der Variablen mit DTW_ASSIGN anstelle von DEFINE fest. Wenn der Benutzer in der Lage sein soll, über einen Browser einen Wert für den Dateinamen bereitzustellen, dann sollte Ihr Makro den angegebenen Wert prüfen.

Beispiel: Eine Abfragezeichenfolgezuordnung wie filename="../../x" kann zur Aufnahme einer Datei aus einem Verzeichnis führen, das normalerweise nicht in der Konfigurationsanweisung INCLUDE_PATH angegeben ist. Angenommen, Ihre Net.Data-Initialisierungsdatei enthält die folgende Pfadkonfigurationsanweisung:

INCLUDE_PATH /usr/lpp/netdata/include

Und angenommen, Ihr Net.Data-Makro enthält die folgende INCLUDE-Anweisung:

%INCLUDE "$(filename)"

Die Abfragezeichenfolgezuordnung filename="../../x" würde die Datei /usr/lpp/x enthalten, was durch die Angabe der Konfigurationsanweisung INCLUDE_PATH nicht beabsichtigt war.

Mit den Net.Data-Zeichenfolgefunktionen können Sie prüfen, ob der bereitgestellte Dateiname für die Anwendung geeignet ist. Sie können z. B. mit der folgenden Logik sicherstellen, daß der Eingabewert, der der Dateinamenvariablen zugeordnet ist, nicht die Zeichenfolge ".." enthält:

@DTW_POS("..", $(filename), result)
%IF (result > "0")
  %{ perform some sort of error processing %}
%ELSE
%{ continue with normal processing %}
%ENDIF 

Entwerfen Ihrer Datenbank und Abfragen, so daß Benutzeranforderungen keinen Zugriff auf sensible Daten anderer Benutzer haben
Einige Datenbankentwürfe sammeln sensible Benutzerdaten in einer einzigen Tabelle. Sofern SQL-Anforderungen SELECT nicht auf eine gewisse Art qualifiziert sind, hat diese Vorgehensweise zur Folge, daß ein beliebiger Benutzer über einen Web-Browser eventuell Zugriff auf alle sensiblen Daten hat.

Beispiel: Die folgende SQL-Anweisung gibt Auftragsinformationen zu einem durch die Variable order_rn angegebenen Auftrag zurück:

select setsstatcode, setsfailtype, mestname
	from   merchant, setstatus
	where  merfnbr   = setsmenbr
	and    setsornbr = $(order_rn)

Diese Methode ermöglicht Benutzern, über einen Browser willkürliche Auftragsnummern anzugeben und möglicherweise sensible Informationen zu den Aufträgen anderer Kunden abzurufen. Sie können sich hiervor zum Beispiel schützen, indem Sie die folgenden Änderungen vornehmen:

Wenn z. B. shlogid die Spalte mit der Kunden-ID ist, die dem Auftrag zugeordnet ist, und wenn SESSION_ID eine Net.Data-Variable ist, welche die authentifizierte ID des Benutzers am Browser enthält, dann können Sie die vorherige SELECT-Anweisung durch die folgende Anweisung ersetzen:

select setsstatcode, setsfailtype, mestname
  from   merchant, setstatus
  where  merfnbr   = setsmenbr
  and    setsornbr = $(order_rn)
  and    shlogid   = $(SESSION_ID)

Verwenden verdeckter Net.Data-Variablen
Mit verdeckten Net.Data-Variablen können Sie verschiedene Kenndaten Ihrer Net.Data-Makros vor Benutzern schützen, die Ihre HTML-Quelle mit ihrem Web-Browser anzeigen möchten. Sie können zum Beispiel die interne Struktur Ihrer Datenbank verdecken. Weitere Informationen zu verdeckten Variablen finden Sie in Verdeckte Variablen.

Anfordern von Informationen zur Gültigkeitsprüfung von einem Benutzer
Sie können Ihr eigenes Schutzschema basierend auf der vom Benutzer gestellten Eingabe erstellen. Beispielsweise könnten Sie anhand eines HTML-Formulars Informationen zur Gültigkeitsprüfung von einem Benutzer anfordern und diese Informationen dann anhand von Daten, die Ihr Net.Data-Makro aus einer Datenbank abruft, oder durch Aufrufen eines externen Programms aus einer Funktion, die in Ihrem Net.Data-Makro definiert ist, überprüfen lassen.

Weitere Informationen zum Schutz Ihrer Datenbestände enthält die Internet-Liste zu häufig gestellten Sicherheitsfragen, die Sie unter folgender Web-Adresse finden:

http://www.w3.org/Security/Faq


[ Seitenanfang | Vorherige Seite | Nächste Seite | Inhaltsverzeichnis | Index ]