Net.Data 會提供數種機制,容許使用指定值給輸入變數。 若要確定巨集是以您想要的方式執行,巨集應該驗證這些輸入變數。 在設計您的資料庫及應用程式時,您也應該限制使用者對有權看到的資料的存取權。
當撰寫 Net.Data 巨集時,請使用下列開發技術。 這些技術將協助您確保您的應用程式是按照想要的方式執行,且僅有適當授權的使用者可存取資料。
範例:不要使用 %DEFINE SHOWSQL="NO" 來設定 Net.Data SHOWSQL 變數,請使用 @DTW_ASSIGN(SHOWSQL, "NO")。然後,如 SHOWSQL=YES 查詢字串指定將不會置換巨集設定。
您可以使用下列其中一種方法,讓 SQL 陳述式無法顯示在生產系統中。
請參閱 Net.Data 參考手冊的變數一章中的 SHOWSQL,以取得 SHOWSQL Net.Data 變數的語法及範例。
您也可以使用 DTW_ASSIGN,來確保其它 Net.Data 變數 (如 RPT_MAX_ROWS 或 START_ROW_NUM) 不會被置換。 請參閱 Net.Data 參考手冊中有關變數的章節,以取得這些變數的詳細資訊。
新增 Net.Data 變數到巨集內的 SQL 陳述式,將容許使用者在執行 SQL 陳述式之前,可動態更改它。 驗證使用者提供的輸入值是巨集撰寫者的責任,且他要確保含有變數參照的 SQL 陳述式不會遭到不預期的修改。 您的 Net.Data 應用程式應該確認使用者從 URL 提供的輸入值, 以便 Net.Data 應用程式可以拒絕無效的輸入。 您的驗證設計處理應該包括下列步驟:
範例 1:使用 DTW_POS() 字串函數來驗證 SQL 陳述式
%FUNCTION(DTW_SQL) query1() { select * from shopper where shlogid = '$(shlogid)' %}
shlogid 變數的值應該是購物者 ID。它的目的在於將 SELECT 陳述式傳回的橫列限制為含有購物者 ID 識別的購物者的資訊的橫列。不過, 如果傳遞字串 "smith' or shlogid<>'smith" 作為變數 shlogid 的值,則查詢將變成:
select * from shopper where shlogid = 'smith' or shlogid<>'smith'
這個使用者修改過的原始 SQL SELECT 陳述式將傳回整個購物者表格。
Net.Data 字串函數可用來驗證使用者不會以不適當方式修改 SQL 陳述式。 例如,下列邏輯可用來確保與 shlogid 變數有關聯的輸入值是由單一購物者 ID 構成的:
@DTW_POS(" ", $(shlogid), result) %IF (result == "0") @query1() %ELSE %{ perform some sort of error processing %} %ENDIF
範例 2:使用 DTW_TRANSLATE()
假設您的應用程式需要驗證輸入變數 num_orders 提供的值是一個整數。其中一種方法就是建立一個轉換表 trans_table, 含有所有鍵盤字元,但數值字元 0-9 除外,並使用 DTW_TRANSLATE 及 DTW_POS 字串函數來驗證輸入:
@DTW_TRANSLATE(num_orders, "x", trans_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
請注意,使用者無法在 Web 瀏覽器中修改儲存程序內的 SQL 陳述式, 且使用者提供的輸入參數會受到與輸入參數有關聯的 SQL 資料類型的限制。 在使用 Net.Data 字串函數來驗證使用者輸入值不是很實際的情況中,您可以使用儲存程序。
範例:查詢字串指定 (如 filename="../../x") 可能會造成併入的檔案是來自不是在 INCLUDE_PATH 架構陳述式中指定的目錄。 假設您的 Net.Data 起始設定檔含有下列路徑架構陳述式:
INCLUDE_PATH /usr/lpp/netdata/include
且您的 Net.Data 巨集含有下列 INCLUDE 陳述式:
%INCLUDE "$(filename)"
filename="../../x" 的查詢字串指定將併入檔案 /usr/lpp/x, 這不是 INCLUDE_PATH 架構陳述式規格想要的檔案。
Net.Data 字串函數可用來驗證提供的檔名是否適合應用程式。例如,下列邏輯可用來確保 與檔名變數有關聯的輸入值沒有字串 "..":
@DTW_POS("..", $(filename), result) %IF (result > "0") %{ perform some sort of error processing %} %ELSE %{ continue with normal processing %} %ENDIF
範例:下列 SQL 陳述式將傳回變數 order_rn 所識別的訂單的訂單資訊:
select setsstatcode, setsfailtype, mestname from merchant, setstatus where merfnbr = setsmenbr and setsornbr = $(order_rn)
這種方法將容許瀏覽器中的使用者指定隨機訂單號碼,且可能取得其它客戶訂單的敏感資料。 保護這種外洩的方法就是製作下列變更:
例如,如果 shlogid 是含有與訂單有關聯的客戶 ID 的直欄, 且 SESSION_ID 是含有瀏覽器的使用者的鑑定 ID 的 Net.Data 變數,則您可以用下列陳述式置換先前的 SELECT 陳述式:
select setsstatcode, setsfailtype, mestname from merchant, setstatus where merfnbr = setsmenbr and setsornbr = $(order_rn) and shlogid = $(SESSION_ID)
至於保護資產的詳細資訊, 請參閱常見問題 (FAQ) 中有關網際網路安全列示的部份,其 Web 網址如下:
http://www.w3.org/Security/Faq