ТЕГ: 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.htm — http:/ /stackoverflow.com/questions/3050963/autonomous-transaction-pros-and-cons- https://oracle-base.com/articles/10g/dbms_assert_10gR2#NOOP