Sicherheitsverfahren für UDFs und Prozeduren

Unter diesem Thema werden bewährte Verfahren zum Schreiben sicherer benutzerdefinierter Funktionen (UDFs) und Prozeduren beschrieben.

Unter diesem Thema:

Verfahren für UDF-Handler

Ihre Funktion (und alle Bibliotheksfunktionen, die Sie aufrufen) muss sich wie eine reine Funktion verhalten, die nur Auswirkungen auf die empfangenen Daten hat und einen auf diesen Daten basierenden Wert zurückgibt, ohne Nebeneffekte zu verursachen. Ihr Code sollte nicht versuchen, den Zustand des zugrunde liegenden Systems zu beeinflussen, abgesehen davon, dass er eine angemessene Menge an Speicher und Prozessorzeit verbraucht.

Verfahren für Prozeduren und UDF-Handler

Der Handler-Code wird innerhalb einer eingeschränkten Engine ausgeführt. Weder Ihr Code noch der Code in den Bibliotheksmethoden, die Sie verwenden, darf irgendwelche verbotenen Systemaufrufe bereitstellen, einschließlich:

  • Prozesssteuerung Sie können z. B. einen Prozess nicht aufspalten. (Sie können jedoch mehrere Threads verwenden.)

  • Zugriff auf das Dateisystem, auf dem der Handler ausgeführt wird.

    Bis auf die folgenden Ausnahmen dürfen Handler keine Dateien lesen oder schreiben:

    • Ein Handler kann in der IMPORTS-Klausel angegebene Stagingdateien lesen. Weitere Informationen dazu finden Sie unter CREATE FUNCTION oder CREATE PROCEDURE.

    • Handler können Dateien, wie z. B. Protokolldateien, in das /tmp-Verzeichnis schreiben.

      Jede Abfrage erhält ein eigenes, mit Arbeitsspeicher unterstütztes Dateisystem mit eigenem /tmp-Verzeichnis, sodass bei verschiedenen Abfragen keine Dateinamenkonflikte auftreten können.

      Konflikte innerhalb einer Abfrage sind jedoch möglich, wenn eine einzelne Abfrage mehr als eine UDF aufruft und diese UDFs versuchen, in Dateien mit demselben Namen zu schreiben.

      Bemerkung

      Da Python-UDFs in separaten Worker-Prozessen parallel ausgeführt werden kann, sollten Sie außerdem vorsichtig sein, wenn Sie in das „/tmp“-Verzeichnis schreiben.

      Weitere Informationen zum Schreiben von Dateien finden Sie unter Schreiben von Dateien. Ein Beispiel dazu finden Sie unter Entpacken einer Stagingdatei.

  • Netzwerkzugriff.

    Sie können einen Handler nicht verwenden, um Sockets zu erstellen, aber Sie können einen Handler verwenden, um auf Ressourcen in einem externen Netzwerk zuzugreifen.

    Bemerkung

    Sie nicht den Code im Snowflake-JDBC-Treiber verwenden, um auf die Datenbank zuzugreifen. Ihre UDF kann selbst nicht als Client von Snowflake agieren.

Handler in Java oder Scala

  • JNI (Java Native Interface) wird nicht unterstützt. Snowflake verbietet das Laden von Bibliotheken, die nativen Code (im Gegensatz zu Java-Bytecode) enthalten.

  • Bei Verwendung innerhalb einer Region für Regierungsbehörden bieten Java-UDFs Unterstützung von Verschlüsselungsalgorithmen, die validiert wurden, um die Anforderungen des Federal Information Processing Standard (140-2) (FIPS 140-2) zu erfüllen. Es können nur solche kryptographischen Algorithmen verwendet werden, die im FIPS-geprüften Modus der BouncyCastle-Kryptographie-API für Java zugelassen sind. Weitere Informationen zu FIPS 140-2 finden Sie unter FIPS 140-2.