UDFs 和过程的安全实践¶
本主题介绍编写安全的用户定义的函数 (UDFs) 和过程的最佳实践。
本主题内容:
UDF 处理程序实践¶
您的函数或方法(以及您调用的任何库函数或方法)必须作为纯函数,仅对接收的数据起作用,并基于该数据返回值,而不会产生副作用。您的代码不应试图影响基础系统的状态,除非消耗合理数量的内存和处理器时间。
过程和 UDF 处理程序实践¶
处理程序代码在受限引擎中执行。您的代码和您使用的库方法中的代码都不应使用任何禁止的系统调用,包括:
过程控制。例如,您不能对进程进行分叉。(但是,您可以使用多个线程。)
访问处理程序运行所在的文件系统。
除以下例外情况外,处理程序不应读取或写入文件:
处理程序可以读取 IMPORTS 子句中指定的暂存文件。有关更多信息,请参阅 CREATE FUNCTION 或 CREATE PROCEDURE。
处理程序可以将文件(如日志文件)写入
/tmp
目录。每个查询都有专属的内存支持的文件系统,其中存储了各自的
/tmp
,因此不同的查询不会出现文件名冲突。但是,如果单个查询调用多个 UDF,并且这些 UDFs 试图写入相同的文件名,则查询中可能会发生冲突。
网络访问。
不能使用处理程序创建套接字,但可以使用处理程序 访问外部网络上的资源。
备注
不能使用 Snowflake JDBC 驱动程序中的代码访问数据库。UDF 本身不能充当 Snowflake 的客户端。
对于 Java 或 Scala 中的处理程序¶
不支持使用 JNI(Java 原生接口)。Snowflake 禁止加载包含原生代码(而不是 Java 字节码)的库。
在 政府区域 使用时,Java UDFs 支持经过验证、符合联邦信息处理标准 (140-2) (FIPS 140-2) 要求的加密算法。只能使用适用于 Java 的 BouncyCastle 加密 API 的 FIPS 批准模式中允许的加密算法。有关 FIPS 140-2 的信息,请参阅 FIPS 140-2 (https://csrc.nist.gov/publications/detail/fips/140/2/final)。