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.
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.
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:
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.
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
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)
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