Ich sehe Code von Entwicklern, die implizite Datumskonvertierung verwenden. Ich hätte gerne eine endgültige Antwort darauf, warum sie das nicht tun sollten.
SELECT * from dba_objects WHERE Created >= '06-MAR-2012';
Ich sehe Code von Entwicklern, die implizite Datumskonvertierung verwenden. Ich hätte gerne eine endgültige Antwort darauf, warum sie das nicht tun sollten.
SELECT * from dba_objects WHERE Created >= '06-MAR-2012';
Antworten:
Denn '2012/12/1'
in den USA ist 11 Monate nach dem gleichen Saitendatum in Europa.
Wenn Sie implizite Konvertierungen zulassen, sind Sie den Standorteinstellungen ausgeliefert.
Wenn Sie ein Unternehmen nennen können, bei dem 11 Monate eine akzeptable Fehlerquote darstellen, bin ich beeindruckt.
Es treten Probleme auf, wenn der Code in einer Sitzung mit einem anderen Datumsformat ausgeführt wird.
Anweisungsfehler
DROP TABLE t1;
CREATE TABLE t1 AS (SELECT sysdate mydate FROM dual WHERE 1=2);
ALTER SESSION SET NLS_DATE_FORMAT = 'MON-DD-RR';
INSERT INTO t1 VALUES ('01-02-12');
*
ERROR at line 1:
ORA-01843: not a valid month
Schlechte Daten
DROP TABLE t1;
CREATE TABLE t1 AS (SELECT sysdate mydate FROM dual WHERE 1=2);
--User 1
ALTER SESSION SET NLS_DATE_FORMAT = 'MM-DD-RR';
INSERT INTO t1 VALUES ('01-02-11');
--User 2
ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MM-RR';
INSERT INTO t1 VALUES ('01-02-11');
--User 3
ALTER SESSION SET NLS_DATE_FORMAT = 'RR-MM-DD';
INSERT INTO t1 VALUES ('01-02-11');
SELECT to_char(mydate,'MM/DD/YYYY') FROM t1;
In dieser Situation, weil jede der alter / insert-Anweisungen von verschiedenen Benutzern ausgeführt werden kann. Sie würden alle die gleichen Anweisungen ausführen, aber die resultierenden Daten wären völlig unterschiedlich. Die insert-Anweisungen können in einem Paket vergraben sein, das nur indirekt aufgerufen wird. Da kein Fehler zurückgegeben wurde, wird das Problem möglicherweise erst viel später gefunden.
SQL-Injektion
CLEAR SCREEN;
DROP TABLE Secrets;
CREATE TABLE Secrets (RevealDate Date, Secret Varchar2(200));
INSERT INTO Secrets VALUES (trunc(sysdate), '*** Common Knowledge. ***');
INSERT INTO Secrets VALUES (trunc(sysdate+1), '*** Don''t Let Anyone know this. ***');
CREATE OR REPLACE PROCEDURE ShowRevealedSecrets IS
vStatement varchar2(200);
vOutput Varchar2(1000);
vDate date:=sysdate;
begin
vStatement:='SELECT secret FROM Secrets WHERE RevealDate = ''' || vDate || '''';
execute immediate vStatement INTO vOutput;
DBMS_Output.Put_Line(vOutput);
END;
/
--Normal Use.
ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YY';
EXEC ShowRevealedSecrets();
--Explointing SQL Injection
ALTER SESSION SET NLS_DATE_FORMAT = '"'' OR RevealDate > sysdate--"';
EXEC ShowRevealedSecrets();
In dieser Situation kann eine böswillige Person das Datumsformat der Sitzungen so ändern, dass sie Zugriff auf Daten erhält, auf die sie normalerweise keinen Zugriff haben.