powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Как работает wwv_flow_security.check_db_password?
16 сообщений из 16, страница 1 из 1
Как работает wwv_flow_security.check_db_password?
    #35610819
uranic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто знает по какому алгоритму реализована функция wwv_flow_security.check_db_password ?

Я знаю только два способа:

1-й способ. Через EXECUTE IMMEDIATE 'alter user ' || p_user_name || ' identified by ' || p_password;
Приблизительно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SELECT u.PASSWORD
     INTO old_pass_hash
     FROM dba_users u
    WHERE u.username = p_user_name;

   EXECUTE IMMEDIATE 'alter user ' || p_user_name || ' identified by ' || p_password;

   SELECT u.PASSWORD
     INTO new_pass_hash
     FROM dba_users u
    WHERE u.username = p_user_name;

   IF old_pass_hash = new_pass_hash
   THEN
      v_ret := FALSE;                                                                         
   ELSE
      v_ret := TRUE;                                                                        
   END IF;

   EXECUTE IMMEDIATE 'alter user ' || p_user_name || ' identified by values ''' || old_pass_hash
                     || '''';
   Return v_RET;

 


2. Через поптытку создания DBLINK.

Но выглядят эти способы не очень красиво. Может есть другой способ которого я не заню?
...
Рейтинг: 0 / 0
Как работает wwv_flow_security.check_db_password?
    #35611150
Фотография Ales Protiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Судя по всему первым способом.
...
Рейтинг: 0 / 0
Как работает wwv_flow_security.check_db_password?
    #35611256
uranic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ales Protiv Судя по всему первым способом

Ага, в интеренете видел упоминания о проблемах безопасности APEX до 3.0.1 в этой функции. Там же обрывки кода самой функции.

По поводу алгоритма, правильно ли я понимаю, что если я в любом приложении Apex использующим авторизацию DB, введу пользователя SYS, то на непродолжительное время пароль у SYS будет изменен на тот, который я введу?

Боязно как-то.
...
Рейтинг: 0 / 0
Как работает wwv_flow_security.check_db_password?
    #35611480
Фотография Ales Protiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да, дырка походу.
С другой стороны зная дырку - нет проблем её заткнуть ;)
...
Рейтинг: 0 / 0
Как работает wwv_flow_security.check_db_password?
    #35611886
uranic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и как же можно заткнуть?

Я бы не сказал что это дырка. Но реализация проверки пользователь/пароль смущает.
Но судя по всему других путей для проврки в Oracle нет.
...
Рейтинг: 0 / 0
Как работает wwv_flow_security.check_db_password?
    #35612056
Фотография Ales Protiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых никто не заставляет использовать именно эту схему аутентификации. Более того, если нету веских причин этого делать, то её не следует использовать.
Во-вторых, если уж используется эта схема, то никто не мешает поставить те же validations на странице логина, или прописать conditions в процессе login, где запретить использование потенциально опасных имен пользователей.
...
Рейтинг: 0 / 0
Как работает wwv_flow_security.check_db_password?
    #35612189
auriga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проверка реализована именно так, как указано в первом способе
правда еще проверяется длина имени и пароля < 30 символов
...
Рейтинг: 0 / 0
Как работает wwv_flow_security.check_db_password?
    #35612556
uranic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ales ProtivВо-первых никто не заставляет использовать именно эту схему аутентификации. Более того, если нету веских причин этого делать, то её не следует использовать.


Хотел бы услышать почему? Сейчас на новом проекте как раз и думал использовать авторизацию от Oracle.

Ales ProtivВо-вторых, если уж используется эта схема, то никто не мешает поставить те же validations на странице логина, или прописать conditions в процессе login, где запретить использование потенциально опасных имен пользователей.

За эту подсказку отдельное спасибо.
...
Рейтинг: 0 / 0
Как работает wwv_flow_security.check_db_password?
    #35612579
uranic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
auriga проверка реализована именно так, как указано в первом способе
правда еще проверяется длина имени и пароля < 30 символов

Это я знал. Вот как выглядит моя реализация:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
 FUNCTION CHECK_DB_PASSWORD (p_user_name VARCHAR2, p_password VARCHAR2)
   RETURN BOOLEAN
IS
   l_stmt          VARCHAR2 ( 4000 );
   old_pass_hash   dba_users.PASSWORD%TYPE;
   new_pass_hash   dba_users.PASSWORD%TYPE;
   v_ret           BOOLEAN;
BEGIN

  IF p_user_name IS NULL OR p_password IS NULL
   THEN
      RETURN FALSE;
   END IF;

   IF    LENGTH (p_password) >  30 
      OR INSTR (p_password, '"') >  0 
      OR INSTR (LOWER (p_password), 'chr(34)') >  0 
   THEN
      RETURN FALSE;
   END IF;

   SELECT u.PASSWORD
     INTO old_pass_hash
     FROM dba_users u
    WHERE u.username = p_user_name;

   EXECUTE IMMEDIATE 'alter user ' || p_user_name || ' identified by ' || p_password;

   SELECT u.PASSWORD
     INTO new_pass_hash
     FROM dba_users u
    WHERE u.username = p_user_name;

   IF old_pass_hash = new_pass_hash
   THEN
      v_ret := FALSE;                                                                         
   ELSE
      v_ret := TRUE;                                                                        
   END IF;

   EXECUTE IMMEDIATE 'alter user ' || p_user_name || ' identified by values ''' || old_pass_hash
                     || '''';
   Return v_RET;                     

EXCEPTION 
  WHEN NO_DATA_FOUND THEN RETURN FALSE; 
END;

Поправте если чего забыл.
...
Рейтинг: 0 / 0
Как работает wwv_flow_security.check_db_password?
    #35612632
Фотография Ales Protiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uranicAles ProtivВо-первых никто не заставляет использовать именно эту схему аутентификации. Более того, если нету веских причин этого делать, то её не следует использовать.


Хотел бы услышать почему? Сейчас на новом проекте как раз и думал использовать авторизацию от Oracle.


Пользы от неё потому что почти никакой. Только что пароль сама проверяет, да и то видите каким способом.
...
Рейтинг: 0 / 0
Как работает wwv_flow_security.check_db_password?
    #35612928
auriga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
uranicПоправте если чего забыл.

:)


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
  
FUNCTION CHECK_DB_PASSWORD( P_USER_NAME IN VARCHAR2, P_PASSWORD IN VARCHAR2 )
    RETURN BOOLEAN
    IS
      SUCCESS_I PLS_INTEGER := - 1 ;
      P_USER_CT PLS_INTEGER;
      L_STMT VARCHAR2(  255  );
      L_OLD_PASSWORD VARCHAR2(  30  );
      L_NEW_PASSWORD VARCHAR2(  30  );
      L_ACCOUNT_STATUS VARCHAR2(  32  );
      L_EXPIRY_DATE DATE;
      L_USER_NAME VARCHAR2(  256  );
      L_PASSWORD VARCHAR2(  256  );
    BEGIN
      IF P_USER_NAME IS NULL OR P_PASSWORD IS NULL THEN
         RETURN FALSE;
       ELSE
         L_USER_NAME := WWV_FLOW_ASSERT.SIMPLE_SQL_NAME( P_USER_NAME );
         L_PASSWORD := WWV_FLOW_ASSERT.NOOP( P_PASSWORD );
      END IF;
      IF LENGTH( L_PASSWORD ) >  30  OR INSTR( L_PASSWORD, '"' ) >  0  OR INSTR( LOWER( L_PASSWORD ), 'chr(34)' ) >  0  THEN
         RETURN FALSE;
      END IF;
      BEGIN
         SELECT account_status into l_account_status
        from sys.dba_users
       where username = l_user_name
        and account_status NOT LIKE 'LOCKED%';
       EXCEPTION
         WHEN NO_DATA_FOUND THEN
            RETURN FALSE;
      END;
      BEGIN
         SELECT password,expiry_date into l_old_password,l_expiry_date
        from sys.dba_users
       where username = l_user_name;
       EXCEPTION
         WHEN NO_DATA_FOUND THEN
            RETURN FALSE;
      END;
      L_STMT := 'ALTER USER "' || L_USER_NAME || '" IDENTIFIED BY "' || L_PASSWORD || '"';
      EXECUTE IMMEDIATE L_STMT;
      BEGIN
         SELECT password into l_new_password
        from sys.dba_users
       where username = l_user_name;
       EXCEPTION
         WHEN NO_DATA_FOUND THEN
            RETURN FALSE;
      END;
      IF ( L_OLD_PASSWORD != L_NEW_PASSWORD ) THEN
         L_STMT := 'ALTER USER "' || L_USER_NAME || '" IDENTIFIED BY VALUES''' || L_OLD_PASSWORD || '''';
         EXECUTE IMMEDIATE L_STMT;
      END IF;
      IF ( L_ACCOUNT_STATUS LIKE 'EXPIRED%' AND L_EXPIRY_DATE IS NULL ) OR L_EXPIRY_DATE < SYSDATE THEN
         L_STMT := 'ALTER USER "' || L_USER_NAME || '" password expire';
         EXECUTE IMMEDIATE L_STMT;
      END IF;
      RETURN L_OLD_PASSWORD = L_NEW_PASSWORD;
      RETURN FALSE;
   END CHECK_DB_PASSWORD;

...
Рейтинг: 0 / 0
Как работает wwv_flow_security.check_db_password?
    #35613586
uranic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
auriga ...

Супер!. Если не секрет, откуда код? Разврапил?
...
Рейтинг: 0 / 0
Как работает wwv_flow_security.check_db_password?
    #35615475
auriga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да

http://oracle-rewrap.narod.ru/
...
Рейтинг: 0 / 0
Как работает wwv_flow_security.check_db_password?
    #35662173
uranic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как пользоваться этим чудом?
Как не пытался выдает тот же файл что и на входе...
Пробовал пакеты из Oracle 10.2.0.3.
Теперь захотелось посмотреть как устроен пакет wwv_flow_audit.
...
Рейтинг: 0 / 0
Как работает wwv_flow_security.check_db_password?
    #35662542
auriga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
утилита не понимает длинных имен файлов

там ничего интересного

PROCEDURE AUDIT_ACTION( P_TABLE_NAME IN VARCHAR2, P_ACTION IN VARCHAR2, P_TABLE_PK IN NUMBER )
IS
L_ID NUMBER := NULL;
L_PAGE NUMBER := NULL;
BEGIN
WWV_FLOW_UTILITIES.CHECK_SGID;
IF WWV_FLOW.G_IMPORT_IN_PROGRESS OR G_CASCADE THEN
RETURN;
END IF;
SELECT wwv_seq.nextval into l_id from dual;
IF P_TABLE_NAME IN ( 'WWV_FLOW_STEPS', 'WWV_FLOW_STEP_BUTTONS', 'WWV_FLOW_STEP_BRANCHES', 'WWV_FLOW_STEP_ITEMS', 'WWV_FLOW_STEP_ITEM_HELP', 'WWV_FLOW_STEP_COMPUTATIONS', 'WWV_FLOW_STEP_VALIDATIONS', 'WWV_FLOW_STEP_PROCESSING', 'WWV_FLOW_PAGE_PLUGS' ) THEN
L_PAGE := V( 'FB_FLOW_PAGE_ID' );
ELSE
L_PAGE := NULL;
END IF;
BEGIN
INSERT into wwv_flow_builder_audit_trail (
ID, AUDIT_DATE, AUDIT_ACTION, FLOW_TABLE,
FLOW_TABLE_PK, FLOW_USER, FLOW_ID, PAGE_ID, SCN)
values (
l_id, sysdate, p_action, p_table_name,
p_table_pk, nvl(v('USER'),user),
decode(wwv_flow.g_flow_id,
4750,v('F4750_P2_ID'),
4150,v('F4150_P1_FLOW_ID'),
nvl(v('FB_FLOW_ID'),wwv_flow.g_flow_id)),
l_page,
dbms_flashback.get_system_change_number);
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
END AUDIT_ACTION;
PROCEDURE REMOVE_AUDIT_TRAIL( P_FLOW_ID IN NUMBER )
IS
BEGIN
WWV_FLOW_UTILITIES.CHECK_SGID;
DELETE from wwv_flow_builder_audit_trail
where flow_id = p_flow_id and security_group_id = wwv_flow_security.g_security_group_id;
END REMOVE_AUDIT_TRAIL;
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как работает wwv_flow_security.check_db_password?
    #38409024
Фотография Есть вопрос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
APEX4.2: sys.wwv_flow_val.verify_user
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Как работает wwv_flow_security.check_db_password?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]