Блок SQL-инъекции Oracle с DBMS_ASSERT
Этот код запускает ошибки
query_string:= 'SELECT '||dbms_assert.sql_object_name(trim(оба '' из return_field))|| ' FROM '||dbms_assert.schema_name(trim(оба '' из from_schema))|| '.'||dbms_assert.sql_object_name(trim(оба '' из from_table))|| ' WHERE '||dbms_assert.sql_object_name(key_field) || ' = '||key_value; EXECUTE IMMEDIATE query_string в return_result;
неверный объект sql.
из документации я чувствую, что любой объект в таблице является объектом SQL??
что здесь не так?
рассмотрим следующую функцию в оракуле 10g
Рассмотрим следующую функцию в контексте 10g
СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ФУНКЦИЮ scott.tab_lookup (ключевое поле CHAR, ключевое_значение CHAR, from_schema CHAR, from_table CHAR, возвращаемое поле CHAR, возвращаемый_тип CHAR) RETURN VARCHAR2 IS result_a varchar2(1000); query_string VARCHAR2(4000); /* версия 0.5*/ BEGIN query_string:= 'SELECT '||dbms_assert.qualified_sql_name(trim(from_table||'.'||return_field))|| ' FROM '||dbms_assert.schema_name(trim(from_schema))|| '' || dbms_assert.sql_object_name (дифферент (from_table))|| ' WHERE '||dbms_assert.qualified_sql_name(from_table||'.'||key_field) || ' = '||key_value; IF(return_type = 'SQL') THEN result_a:= query_string; ELSE EXECUTE IMMEDIATE query_string --USING key_value в result_a; END IF; ВОЗВРАТ (результат_а); ИСКЛЮЧЕНИЕ, КОГДА NO_DATA_FOUND THEN RETURN(NULL); КОГДА TOO_MANY_ROWS THEN RETURN('**ERR_DUPLICATE**'); КОГДА ДРУГОЙ THEN /* ORA-44001 INVALID_SCHEMA_NAME ORA-44002 INVALID_OBJECT_NAME ORA-44003 INVALID_SQL_NAME ORA-44004 INVALID_QUALIFIED_SQL_NAME */ IF SQLCODE = -44001 THEN RETURN(* SEN RETURN) ELSIF SQLCODE = -44002 THEN RETURN('*ERR_INVALID_OBJECT*'); ELSIF SQLCODE = -44003 THEN RETURN('*ERR_INVALID_SQL_NAME*'); ELSIF SQLCODE = -44004 THEN RETURN('*ERR_INVALID_QALIFIED_SQLNAME*'); конец если; return ('*ERR_'||sqlcode); КОНЕЦ; /
я получаю ERR_INVALID_OBJECT
- получить Генерированный SQL как Значение Выберите scott.tab_lookup('ID',1,'TEST','TEST_TABLE','TEST_DESC','SQL') из двойного; -- -или же- - получить значение, возвращаемое из поля базы данных Выберите scott.tab_lookup('ID',1,'TEST','TEST_TABLE','TEST_DESC','') из двойного;
мой стол похож
test_table ==================== ID, TEST_DESC ==================== "11", "ТЕСТ 1" "12", "ТЕСТ 5000" "13", "ЗНАЧЕНИЕ ВХОДА ТЕСТА" "14", "JUNK VALUE" "50", "ТЕСТ ЗНАЧЕНИЕ 50"
эта таблица находится в схеме 'TEST', и я связан со SCOTT, и у SCOTT есть 'GRANT SELECT на TEST.TEST_TABLE to scott'
все еще я получаю ошибку
ERR_INVALID_OBJECT
1 ответ
Решение
query_string := 'SELECT '||dbms_assert.qualified_sql_name(trim(from_schema||'.'||from_table||'.'||return_field))||
' FROM '||dbms_assert.schema_name(trim(from_schema))||
'.'||dbms_assert.sql_object_name(trim(from_table))||
' WHERE '||dbms_assert.qualified_sql_name(from_schema||'.'||from_table||'.'||key_field) || ' = '||key_value;
EXECUTE IMMEDIATE query_string into return_result;
Из документов..
- ENQUOTE_LITERAL - заключает в кавычки строковый литерал
- ENQUOTE_NAME - заключает имя в двойные кавычки
- NOOP - возвращает значение без проверки
- QUALIFIED_SQL_NAME - проверяет, является ли входная строка квалифицированным именем SQL
- SCHEMA_NAME - Функция Проверяет, что входная строка является именем существующей схемы
- SIMPLE_SQL_NAME - проверяет, является ли входная строка простым именем SQL
- SQL_OBJECT_NAME - проверяет, является ли строка входного параметра квалифицированным идентификатором SQL существующего объекта SQL