Пароли не могут содержать имя пользователя или части полного имени пользователя в базе данных Oracle (pl / sq) - PullRequest
0 голосов
/ 28 июня 2019

На самом деле у меня есть небольшая проблема: я работаю над приложением, в котором форма для регистрации пользователя и пароль для завершения проверки не должны содержать имя пользователя и не должны содержать две последовательные буквы из имени пользователя. Требование клиента - сделать это с помощью хранимой процедуры. например, «zia123» не является подходящим паролем для пользователя «Zia»

Кто-нибудь имеет представление об этой PL? Функция хранимой процедуры SQL?

Ответы [ 2 ]

2 голосов
/ 28 июня 2019

Вы можете попробовать воспользоваться предоставленными функциями проверки пароля Oracle для помощи в написании такого рода вещей - ora12c_verify_function и ora12c_strong_verify_function на 12c.Я включил параметр old_password здесь, потому что общее требование проверки пароля сравнивает новый пароль со старым.

CREATE OR REPLACE function verify_password_complexity
    (username varchar2,
     password varchar2,
     old_password varchar2)
return varchar2 IS
begin

   -- password must not contain user's name. 
   -- They didn't specify but I'm assuming their requirements want a case-insensitive check.
   if (upper(password) like '%' || upper(username) || '%') then
      return 'password contains username';
   end if;

   -- must not contains consecutive 2 letters from user's name
   for u in (select substr(username,level,2) as pair -- get all pairs of letters
                from dual
                connect by level <= length(username)-1)
   loop
      -- does password contain this pair
      if (upper(password) like '%' || upper(u.pair) || '%') then
        return 'password contains 2 consecutive letters from username: ' || u.pair;
      end if;
   end loop;

   return 'password OK';

end;
/

Тестирование:

begin
  dbms_output.put_line(verify_password_complexity('testuser', 'lkajsdofiuwe', 'oiuwlkajsdf'));
  dbms_output.put_line(verify_password_complexity('testuser', 'lkajsdofiuwer', 'oiuwlkajsdf'));
  dbms_output.put_line(verify_password_complexity('testuser', 'lkatestuseruwe', 'oiuwlkajsdf'));
end;
/

password OK
password contains 2 consecutive letters from username: er
password contains username
2 голосов
/ 28 июня 2019

Например, функция:

SQL> create or replace function f_unpw (par_username in varchar2, par_password in varchar2)
  2    return varchar2
  3  is
  4    l_username varchar2(30)  := upper(par_username);
  5    l_password varchar2(30)  := upper(par_password);
  6    retval     varchar2(200) := 'Password is OK';
  7  begin
  8    if instr(l_password, l_username) > 0 or
  9       regexp_like(l_password, '[[:alpha:]]{2,}')
 10    then
 11       retval := 'Password contains username or two (or more) consecutive letters';
 12    end if;
 13
 14    return retval;
 15  end;
 16  /

Function created.

Тестирование:

SQL> with test (un, pw) as
  2    (select 'zIA' , 'zia123' from dual union all
  3     select 'LF'  , 'x123bh' from dual union all
  4     select 'Test', '334d'   from dual
  5    )
  6  select un,
  7         pw,
  8         f_unpw(un, pw) result
  9  from test;

UN   PW     RESULT
---- ------ ----------------------------------------------------------------------
zIA  zia123 Password contains username or two (or more) consecutive letters
LF   x123bh Password contains username or two (or more) consecutive letters
Test 334d   Password is OK

SQL>

Не стесняйтесь улучшать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...