OceanBase 数据转换的安全注意事项
通过隐式转换或不指定格式模型的显式转换将日期时间值转换为文本时,格式模型由一个全局会话参数定义。根据源数据类型,这些参数名称为 NLS_DATE_FORMAT
、NLS_TIMESTAMP_FORMAT
或 NLS_TIMESTAMP_TZ_ FORMAT
。这些参数的值可以在客户端环境或 ALTER SESSION
语句中指定。
当不指定格式模型的显式转换对动态构造的 SQL 语句中的日期时间值进行显式转换时,格式模型对会话参数的选择过程会对数据库安全性产生负面影响。
动态构造的 SQL 语句是指由程序或者存储过程生成的 SQL 语句。执行动态构造的 SQL 语句,需要 OceanBase 内置的 PL 包 DBMS_SQL
或与 PL 语句 EXECUTE IMMEDIATE
相关,但这些并不是唯一执行动态构造的 SQL 文本的方式。
如下所示,start_date
的数据类型为 DATE
,使用会话参数 NLS_DATE_FORMAT
中指定的格式模型将 start_date
的值转换为文本,再将结果传递到 SQL 文本中。日期时间格式模型可以简单地由双引号所包含的文本组成。
SELECT last_name FROM employees WHERE hire_date > '' || start_date || '';
说明
为显式转换的格式模型设置全球化参数的用户可以决定上述转换产生了什么文本。
若 SQL 语句由过程执行,则该过程的执行可能会由于session变量的修改而被SQL注入。当某些过程具有更高权限(例如Definer's Rights Procedure)时,造成的安全方面的影响可能更大。