除了上面所说的方法,还可以使用 Net.Data 配置变量或宏开发技术来限制最终用户的活动、 隐蔽诸如数据库设计等共同资产、在产品环境内部验证用户提供的输入值。
Net.Data 提供了一些可用于限制最终用户活动或隐蔽数据库设计的配置变量。
您可以使用 以下的某种方法在生产环境中禁用 SQL 语句的显示:
参见 Net.Data Reference 的变量一章中有关 SHOWSQL 的内容,以获取 SHOWSQL Net.Data 变量的语法和示例。
您应当仔细 考虑是否要允许直接请求的使用,因为它可能给您的用户以执行多种函数的能力。在启用这种调用方式的时侯, 请确保处理 Net.Data 请求的用户标识具有适当的权限级别。
可以使用 DTW_DIRECT_REQUEST 配置变量来禁用直接请求。参见DTW_DIRECT_REQUEST:启用直接请求变量中的语法和附加信息。
要启用加密, 如将纯文本口令替换为加密口令:
要禁用加密:
Net.Data 提供了几个允许用户为输入变量赋值的机制。为了确保宏以预期方式执行,宏应确认这些 输入变量。您的数据库和应用程序在设计时也应将用户对数据的访问限制在该用户被授权看到的范围内。
在编写 Net.Data 宏时,可以使用以下开发技术。这些技术将帮助您确保应用程序预期完成,并且对数据的访问仅限于正确授权的用户。
示例:不使用:
%define START_ROW_NUM = "1"
使用:
@DTW_ASSIGN(START_ROW_NUM, "1")
以此方式指定变量可避免查询字符串赋值(如 "START_ROW_NUM=10") 覆盖宏设置。
对宏中的 SQL 语句添加一个 Net.Data 变量可以允许用户在执行 SQL 语句之前动态地改变该语句。宏的编写者应负责确认用户提供的输入值并确保包含变量引用的 SQL 语句不能以非预期的方式 进行修改。Net.Data 应用程序应确认用户从 URL 提供的输入值,这样,Net.Data 应用程序就 可以拒绝无效的输入。确认设计过程应包含以下步骤:
示例 1: 使用 DTW_POS() 字符串函数来验证 SQL 语句
%FUNCTION(DTW_SQL) query1() { select * from shopper where shlogid = '$(shlogid)' %}shlogid 的值是一个购物者标识。其作用是将 SELECT 语句返回的行限制在某些特定的行中, 这些行中包含有关由购物者标识所标识的购物者的信息。当然,如果字符串 "smith' or shlogid<>'smith" 被作为变量 shlogid 的值进行传递,则查询将变为:
select * from shopper where shlogid = 'smith' or shlogid<>'smith'
原来的 SQL SELECT 语句经过用户如此修改之后将返回整个购物者的表。
Net.Data 字符串函数 可用于验证 SQL 语句未被用户以不恰当的方式修改。例如, 可使用以下逻辑来确保单引号未被用来修改 SQL 语句:
@DTW_ADDQUOTE(shlogid, shlogid) @query1()
查询变为:
select * from shopper where shlogid = 'smith'' or shlogid<>''smith'
示例 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
请注意,浏览器前的用户无法修改存储过程中的 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 是包含与订单相关联的客户标识的列,SESSION_ID 是一个包含 浏览器前用户的授权标识的 Net.Data 变量,则可以用以下语句来替换前面的 SELECT 语句:
select setsstatcode, setsfailtype, mestname from merchant, setstatus where merfnbr = setsmenbr and setsornbr = $(order_rn) and shlogid = $(SESSION_ID)
有关保护资产的详情,参见以下 Web 站点中有关“经常询问的 问题”(FAQ) 的因特网安全性列表:
http://www.w3.org/Security/Faq