Schlagwort-Archive: NLS

DBMS_SCHEDULER und die Zeitumstellung

Alle (halbe) Jahre wieder kommt die Umstellung zwischen Winterzeit und Sommerzeit. Daher stelle ich hier einen Erfahrungsbericht eines konkreten Troubleshooting-Falles ein, weil sich dabei ein paar Details zum Verhalten des Datenbank-Schedulers rund um die Zeitumstellung lernen lassen.

Anlass war ein Problem eines Kunden, bei dem nach Umstellung auf die Sommerzeit ein Job plötzlich nicht mehr zum richtigen Zeitpunkt ausgeführt wurde. Weiterlesen

Lateral SQL Injection: Neue Erkenntnisse

SQL Injection ist ein Verfahren, über eine Anwendung, die den Zugriff auf die Datenbank bereitstellt, eigene Datenbankbefehle einzuschleusen. Jeder Entwickler, der sicherheitsrelevante DB-Anwendungen schreibt und dabei dynamisch generiertes SQL einsetzt, sollte mit diesem Angriffsszenario und den Gegenmaßnahmen vertraut sein.

David Litchfield von databasesecurity.com hat bereits 2008 eine spezielle Form von SQL Injection in Oracle demonstriert, die er „Lateral Injection“ nannte. Das Verfahren hat es ermöglicht, in PL/SQL-Prozeduren trotz korrekt typisierter Parameter mit Hilfe von NLS_DATE_FORMAT schadhaften Code in dynamisches SQL einzuschleusen. Diese Woche nun wies er auf ein neues Whitepaper hin, das aufzeigt, daß auch NUMBER-Parameter mit Hilfe von NLS_NUMERIC_CHARACTERS dergestalt manipuliert werden können, daß die Ausführung fremder Funktionen möglich wird. Weiterlesen

Datenverlust über Datenbank-Link

Gerade bin ich mal wieder auf ein altes, aber stets aktuelles Thema gestoßen worden: Internationalisierung („Globalization“ im Oracle-Sprech).

In diesem speziellen Fall geht es um ein Szenario, bei dem Daten über einen DB-Link abgefragt werden. Dabei gehen einige Sonderzeichen verloren, die in der Quell-DB aber zu sehen sind. Hier eine kurze Zusammenfassung des Szenarios:

  1. DB „ORC1“ hat einen DB-Link zu „ORC2“.
  2. Tabellenspalte „ename“ enthält Sonderzeichen, z.B. „´“ (Akut).
  3. Abfrage der Spalte aus ORC1 mit „SELECT ename FROM emp@orc2;“
  4. Das Sonderzeichen wird bei dieser Abfrage nicht angezeigt.
  5. ORC1 hat den Zeichensatz WE8ISO8859P15, ORC2 WE8ISO8859P1.

Der Grund, weshalb das Sonderzeichen auf dem Weg über den Link verloren geht, liegt in den unterschiedlichen Zeichensätzen. Metalink Note 121627.1 beschreibt die Unterschiede und zeigt, daß im neueren P15-Zeichensatz einige Zeichen des P1-Zeichensatzes (z.B. gegen das Euro-Symbol) ersetzt wurden.

Eine kleine Aufstellung der Unterschiede zwischen den beiden Zeichensätzen:

Hex  |  WE8ISO8859P1 (ISO Latin 1)  |  WE8ISO8859P15 (ISO Latin 9)
Code |  Beschreibung                |  Beschreibung
-----+------------------------------+------------------------------------
A4   |  Währungssymbol (¤)          |  EURO-Symbol (€)
     |                              |
A6   |  Vertikaler Balken (¦)       |  Großes S mit Hatschek (Š)
     |                              |
A8   |  Trema (¨)                   |  Kleines s mit Hatschek (š)
     |                              |
B4   |  Akut  (´)                   |  Großes Z mit Hatschek (Ž)
     |                              |
B8   |  Cedille  (¸)                |  Kleines z mit Hatschek (ž)
     |                              |
BC   |  Ein Viertel (¼)             |  Große OE-Ligatur (Œ)
     |                              |
BD   |  Einhalb  (½)                |  Kleine oe-Ligatur (œ)
     |                              |
BE   |  Drei Viertel  (¾)           |  Großes Y mit Trema (Ÿ)
-----+------------------------------+------------------------------------

Bleibt die Frage nach einer Lösung. Die könnte in der Gegenfrage bestehen, ob man einen allein stehenden Akut denn benötigt und überhaupt zulassen sollte.

Andernfalls ist eine Angleichung der Zeichensätze angesagt. Da die Änderung eines DB-Zeichensatzes mit einigem Aufwand verbunden ist, sollte überlegt werden, gleich auf Unicode umzusteigen – der beherrscht in Version 4 immerhin 96.382 Zeichen.

Wer die Ergebnisse einer Zeichenkonvertierung auf die Schnelle prüfen will, kann das übrigens mit der SQL-Funktion „convert“:

SELECT CONVERT( '`Hallo Welt´', 'WE8ISO8859P15','WE8ISO8859P1' )
  FROM DUAL;

Weblinks