首批通过分布式安全可靠测评,为关键业务系统打造
数据转换的安全注意事项
更新时间:2026-06-10 08:10:23
在 OceanBase 数据库 Oracle 模式下,格式模型是描述存储在字符串中的日期时间或数字数据格式的字符文本。在进行数据转换时,需要注意相关安全事项。
当将日期时间值隐式转换为文本或不指定格式模型而显式转换为文本时,根据源数据的类型,格式模型是由相应的全局会话系统变量定义的,这些系统变量包括 NLS_DATE_FORMAT、NLS_TIMESTAMP_FORMAT 或 NLS_TIMESTAMP_TZ_ FORMAT。这些参数的值可以在客户端环境或 ALTER SESSION 语句中指定。
当不指定格式模型而对关联到动态 SQL 语句的日期时间值进行显式转换时,格式模型对系统变量的依赖性会对数据库安全产生负面影响。
动态 SQL 语句是指由 PL 程序或者存储过程生成的 SQL 语句。OceanBase 数据库使用 EXECUTE IMMEDIATE 语句处理大多数动态 SQL 语句。在一定条件下也可以使用 PL 系统包 DBMS_SQL 运行动态 SQL 语句。
如下所示,start_date 的数据类型为 DATE,使用系统变量 NLS_DATE_FORMAT 中指定的格式模型将 start_date 的值转换为文本,再将结果传递到 SQL 文本中。日期时间格式模型可以简单地由双引号所包含的文本组成。
SELECT last_name FROM employees WHERE hiredate > '' || start_date || '';
说明
- 用户通过为显式转换的格式模型设置全局系统变量决定上述示例中的转换产生了什么文本。
- 如果 SQL 语句由过程执行,则该过程的执行可能会由于会话变量的修改而被 SQL 注入。当某些过程具有更高权限(例如 Definer's Rights Procedure)时,造成的安全方面的影响可能更大。
数值的隐式和显式转换也可能遇到类似的问题,因为转换结果可能取决于会话系统变量 NLS_NUMERIC_CHARACTERS。此系统变量定义小数分隔符和千分位分隔符。如果将小数点分隔符定义为引号或双引号,则可能会出现 SQL 注入。