ТЕГ: PL/SQL, PRAGMA AUTONOMOUS_TRANSACTION, ВЫПОЛНИТЬ НЕМЕДЛЕННО, dbms_assert

Руководство OWASP затрагивает некоторые приложения, использующие номер кредитной карты. В базе данных администратор базы данных пометил 16-значное поле каким-либо методом, который будет возвращать замаскированное значение формата (например, 1234-xxxx-xxxx-7890) при выборе, а также дает некоторые хранимая процедура для установки размаскировки тоже.

Таким образом, проблема будет возникать с существующим кодом (оператор sql для веб-вызова C#), когда вставка или обновление выбранного поля кредитной карты маски, как в приведенном ниже операторе sql, будет вставлять замаскированное значение кредитной карты в таблицу.

вставить в tableX (crcard_no)

выберите crcard_no

из таблицы 1 а

где …

Другая проблема возникает, когда оператор выбирает значение из той же замаскированной таблицы.

вставить в table1 (crcard_no)

выберите crcard_no

из таблицы 1 а

где …

это вернет ORA-28081.

Предлагаемое решение состоит в том, чтобы

вставьте новый оператор в код

1. вызов сохранен, чтобы разоблачить поле кредитной карты перед выбором.

2. Измените существующий оператор для хранения данных, а затем перейдите к оператору nset/update.

e.g.

для записи (выберите crcard_no из таблицы 1)

петля

v_cardno := rec.crcard_no;

вставить в таблицу1 (crcard_no) значение (v_cardno)

конечная петля;

3. вызов сохранен для маскировки поля кредитной карты.

…Тогда я спрашиваю себя, есть ли другой способ, более простой и короткий, чем это решение

например, получить значение из «а» функции, которая получает значение из таблицы, как определено.

так что мне не нужно повторно выполнять шаги 1 и 3, и мне не нужно изменять выражение существования так сильно, как шаг 2 предлагаемого решения, потому что я ленив.

после одного дня гугления, наконец, я нашел свое решение

  • с помощью PRAGMA AUTONOMOUS_TRANSACTION вы можете сделать оператор новой функции незадействованным методом маскирования (до свидания! ORA-28081). — но на самом деле эта команда может быть опасной в некоторых случаях, потому что она будет работать как независимый сеанс.
  • с помощью EXECUTE IMMEDIATE вы можете заставить функцию получить любой столбец, передав любое имя таблицы и где claase в функции (но не для того, чтобы получить santize для предотвращения инъекции)

КОД ЗДЕСЬ

функция GetOneRowData_CRTable

(IS_UNMASK в varchar2, p_ColName в varchar2, p_TableName в varchar2

, p_WhereClause varchar2 ,ISTHROW в varchar2 )

вернуть varchar2

рет varchar2 (100);

sqlstmtvarchar2 (5000);

s_key varchar2 (200);

s_ColName varchar2 (200);

s_TableName varchar2 (500);

s_Where varchar2 (5000);

ПРАГМА АВТОНОМНАЯ_ТРАНЗАКЦИЯ;

начинать

ЕСЛИ IS_UNMASK не равен нулю, то

— 1. вызов сохранен для демаскирования поля кредитной карты перед выбором.

КОНЕЦ ЕСЛИ;

— ====== Проверка и санация: предотвращение инъекции

s_TableName :=DBMS_ASSERT.SQL_OBJECT_NAME (p_TableName);

выберите ВЛАДЕЛЕЦ||’.’|| Table_Name в s_TableName из all_tables, где table_name = upper(s_TableName);

s_ColName := dbms_assert.qualified_sql_name( s_TableName || ‘.’ ||p_ColName);

s_Where := p_WhereClause ;

s_Where := replace(p_WhereClause, '\', '');

s_Where := replace(p_WhereClause, '-', '');

s_Where := replace(p_WhereClause, ';', '');

s_ColName := trim('''' from DBMS_ASSERT.ENQUOTE_LITERAL (p_ColName));

s_ColName := replace(s_ColName, '\', '');

s_ColName := replace(s_ColName, '-', '');

s_ColName := replace(s_ColName, ';', '');

ЕСЛИ s_Where равен нулю, тогда s_Where:=’ 1=1 ‘; КОНЕЦ ЕСЛИ;

— =============================

sqlstmt := 'выбрать' || s_ColName || 'ОТ'|| s_имя_таблицы || ‘ где rownum=1 и ‘ || s_Где;

— dbms_output.put_line(sqlstmt);

ВЫПОЛНИТЬ НЕМЕДЛЕННО sqlstmt в ret ;

ЕСЛИ IS_UNMASK не равен нулю, то

— 3. вызов сохранен для маскировки поля кредитной карты.

КОНЕЦ ЕСЛИ;

возврат рет;

ИСКЛЮЧЕНИЕ

когда ДРУГИЕ тогда

ЕСЛИ IS_UNMASK не равен нулю, то

— 3. вызов сохранен для маскировки поля кредитной карты.

КОНЕЦ ЕСЛИ;

Если ISTHROW не равен нулю, то

поднимать;

ЕЩЕ

dbms_output.put_line (sqlerrm);

рет:=’’;

возврат рет;

КОНЕЦ ЕСЛИ;

Конец GetOneRowData_CRTable ;

Для получения дополнительной информации попробуйте прочитать ссылку ниже — http://www.sqlinjection.net/defense/pl-sql/http://www.dba-oracle.com/t_avoiding_mutating_table_error.htmhttp:/ /stackoverflow.com/questions/3050963/autonomous-transaction-pros-and-cons- https://oracle-base.com/articles/10g/dbms_assert_10gR2#NOOP