Examples for SQL injection v17
The following examples demonstrate some approaches for using DBMS_ASSERT
to help prevent SQL injections.
edb=# CREATE TABLE open_tab_dbassert ( code VARCHAR2(5), description VARCHAR2(50) ); CREATE TABLE edb=# INSERT INTO open_tab_dbassert VALUES ('ONE', 'Description for ONE'); INSERT 0 1 edb=# INSERT INTO open_tab_dbassert VALUES ('TWO', 'Description for TWO'); INSERT 0 1 edb=# CREATE TABLE secret_tab_dbassert ( code VARCHAR2(5), description VARCHAR2(50) ); CREATE TABLE edb=# INSERT INTO secret_tab_dbassert VALUES ('CODE1', 'SECRET 1'); INSERT 0 1 edb=# INSERT INTO secret_tab_dbassert VALUES ('CODE2', 'SECRET 2'); INSERT 0 1 edb=# CREATE OR REPLACE PROCEDURE get_open_data_dbassert(p_code IN VARCHAR2) AS l_sql VARCHAR2(32767); c_cursor SYS_REFCURSOR; l_buffer VARCHAR2(32767); BEGIN DBMS_OUTPUT.put_line('Raw input format: (' || p_code || ')'); l_sql := 'SELECT description FROM open_tab_dbassert WHERE code = ''' || p_code || ''''; DBMS_OUTPUT.put_line(l_sql); OPEN c_cursor FOR l_sql; LOOP FETCH c_cursor INTO l_buffer; EXIT WHEN c_cursor%NOTFOUND; DBMS_OUTPUT.put_line(l_buffer); END LOOP; close c_cursor; l_buffer:=null; DBMS_OUTPUT.put_line('Input with DBMS_ASSERT : DBMS_ASSERT.ENQUOTE_LITERAL(' || p_code || ')'); l_sql := 'SELECT description FROM open_tab_dbassert WHERE code = ' || sys.DBMS_ASSERT.ENQUOTE_LITERAL(p_code); DBMS_OUTPUT.put_line(l_sql); OPEN c_cursor FOR l_sql; LOOP FETCH c_cursor INTO l_buffer; EXIT WHEN c_cursor%NOTFOUND; DBMS_OUTPUT.put_line(l_buffer); END LOOP; close c_cursor; END; CREATE PROCEDURE --Output edb=# EXEC get_open_data_dbassert('ONE'' OR ''1''=''1'); Raw input format: (ONE' OR '1'='1) SELECT description FROM open_tab_dbassert WHERE code = 'ONE' OR '1'='1' Description for ONE Description for TWO Input with DBMS_ASSERT : DBMS_ASSERT.ENQUOTE_LITERAL(ONE' OR '1'='1) ERROR: numeric or value error CONTEXT: edb-spl function get_open_data_dbassert(character varying) line 19 at assignment edb=# EXEC get_open_data_dbassert('ONE'' UNION SELECT description FROM secret_tab_dbassert WHERE ''1''=''1'); Raw input format: (ONE' UNION SELECT description FROM secret_tab_dbassert WHERE '1'='1) SELECT description FROM open_tab_dbassert WHERE code = 'ONE' UNION SELECT description FROM secret_tab_dbassert WHERE '1'='1' SECRET 1 SECRET 2 Description for ONE Input with DBMS_ASSERT : DBMS_ASSERT.ENQUOTE_LITERAL(ONE' UNION SELECT description FROM secret_tab_dbassert WHERE '1'='1) ERROR: numeric or value error CONTEXT: edb-spl function get_open_data_dbassert(character varying) line 19 at assignment