CftClub.ru
Клуб специалистов ЦФТ-Банк

VERIFY_FUNCTION

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Oracle DBA
Предыдущая тема :: Следующая тема  
Автор Сообщение
BoBr
Участник со стажем


Вступление в Клуб: 30.01.2013
СообщениеПт Сен 20, 2013 11:50   VERIFY_FUNCTION Ответить с цитатой
Полезность: Нет оценки
Добрый день! Подсажите, кто и как использует данную функцию VERIFY_FUNCTION ? Никак не могу добиться того, что мне надо. В Oracle все хорошо, а АРМы постоянно ругаются Sad.
Сам использую так:

CREATE OR REPLACE FUNCTION SYS.VERIFY_FUNCTION_PVB (username varchar2,
password varchar2,
old_password varchar2)
RETURN boolean IS

n boolean;
m integer;
cnt integer;
differ integer;
isdigit boolean;
ischar boolean;
ispunct boolean;
digitarray varchar2(20);
punctarray varchar2(25);
badsymbols varchar2(25);
chararray varchar2(152);
cur_sym varchar2(5);
cur_sym_revers varchar2(5);
cur_sym1 varchar2(5);
cur_sym_revers1 varchar2(5);
cur_sym2 varchar2(5);
cur_sym_revers2 varchar2(5);
qwerty_arrayLo varchar2(70);
qwerty_array1Lo varchar2(70);
cnt_sym integer; -- Сколько символов нельзя ввести подряд с клавиатуры
--
function revers(str_in in varchar2) return varchar2 is
result varchar2(40);
begin
for ii in reverse 1.. length(str_in) loop
result := result ||substr(str_in,ii,1);
end loop;
return (result);
end;
--
BEGIN
-- if Old_password is null then
-- Чтобы обойти bug администратора доступа, который при создании
-- пользователя - тупо ставит пароль равный имени.
-- Everything is fine; return TRUE ;
-- RETURN(TRUE);
-- end if;
--
IF ltrim(password) is null THEN
raise_application_error(-20004, 'Пароль не может быть пустым!');
END IF;
--
digitarray:= '0123456789';
chararray:= 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZйцукенгшщзхъфывапролджэячсмитьбюЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ';
-- До введения требования по знакам пунктуации
-- chararray := 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!#$%*+-=?_абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';
punctarray:= '!#$%*+-=?_';
badsymbols:= ' (){}[].,;:<>/|\"`''';
qwerty_arrayLo := '`1234567890-= qwertyuiop[]\ asdfghjkl;''\ \zxcvbnm,./';
qwerty_array1Lo := 'ё1234567890-= йцукенгшщзхъ\ фывапролджэ\ \ячсмитьбю.';
--
-- Check if the password is same as the username
IF nls_lower(password) = nls_lower(username) THEN
raise_application_error(-20001, 'Пароль, совпадающий с именем пользователя, запрещен!');
END IF;
--
-- Check for the minimum length of the password
IF length(password) < 8 THEN
raise_application_error(-20002, 'Длина пароля должна быть не меньше 8 символов!');
END IF;
--
-- Check if the password is too simple. A dictionary of words may be
-- maintained and a check may be made so as not to allow the words
-- that are too simple for the password.
-- IF NLS_LOWER(password) IN ('user', 'database', 'account', 'password', 'oracle', 'computer','ibs','tst','test','ibso') THEN
-- raise_application_error(-20002, 'Простой пароль запрещен!');
-- END IF;
--
-- IF translate(password,badsymbols,lpad('?',length(badsymbols),'?'))=password THEN null; else
-- raise_application_error(-20003, 'Пароль содержит недопустимые символы!');
-- END IF;
--
-- Check if the password contains at least one letter, one digit and one
-- punctuation mark.
-- 1. Check for the digit
IF translate(password,digitarray,lpad(' ',length(digitarray)))=password THEN
raise_application_error(-20003, 'Пароль должен содержать хотя бы одну цифру!');
END IF;
-- 2. Check for the character
IF translate(password,chararray,lpad(' ',length(chararray)))=password THEN
raise_application_error(-20003, 'Пароль должен содержать хотя бы одну букву!');
END IF;
-- 3. Check for the punctuation
-- До введения требования по знакам пунктуации
--IF translate(password,punctarray,lpad(' ',length(punctarray)))=password THEN
-- raise_application_error(-20003, 'Пароль должен содержать хотя бы один знак из: !#$%*+-=?_');
--END IF;
--
-- Check if the password differs from the previous password by at least
-- 3 letters
differ := abs(length(old_password) - length(password));
--
IF differ < 3 THEN
m := least(length(password),length(old_password));
FOR i IN 1..m LOOP
IF lower(substr(password,i,1)) != lower(substr(old_password,i,1)) THEN
differ := differ + 1;
END IF;
END LOOP;
IF differ < 1 THEN
raise_application_error(-20004, 'Новый пароль от старого должен отличаться хотя бы на 1 символ!');
END IF;
END IF;
--
/* проверка на наличие повторяющихся символов кол-вом больше 2 */
m := length(password);
for i in 1..m-3 loop
cur_sym := lpad(substr(password,i,1),3,substr(password,i,1));
if instr(substr(password,i),cur_sym)>0 then
raise_application_error(-20004, 'В пароле есть символ, который повторился подряд 3 раза, это запрещено!');
end if;
end loop;
--
/* проверка на наличие повторяющейся последовательности из 2-х символов кол-вом больше 2 */
m := length(password);
for i in 1..m-2 loop
if instr(password,substr(password,i,2),i+2)>0 then
raise_application_error(-20004, 'Пароль содержит недопустимо простую комбинацию символов, набранную повторно!');
end if;
end loop;
--
/* проверка на наличие символов идущих по порядку как и на клавиатуре кол-вом больше или = cnt_sym */
cnt_sym := 6;
m := length(password)-cnt_sym +1;
isdigit := false;
for i in 1..m loop
cur_sym := Lower(substr(password,i,cnt_sym));
cur_sym1:= translate(cur_sym,'~!@#$%^&*()_+{}|:"<>?','`1234567890-=[]\;'',./');
cur_sym2:= translate(cur_sym,'!"№;%Confused*()_+/|,','1234567890-=\\.');
cur_sym_revers := revers(cur_sym);
cur_sym_revers1:= revers(cur_sym1);
cur_sym_revers2:= revers(cur_sym2);
/* слева направо */
if Instr(qwerty_arrayLo,cur_sym1) > 0 then isDigit := true;
elsif Instr(qwerty_array1Lo,cur_sym2) > 0 then isDigit := true;
elsif Instr(chararray,cur_sym) > 0 then isDigit := true;
/* справа налево */
elsif Instr(qwerty_arrayLo, cur_sym_revers1) > 0 then isDigit := true;
elsif Instr(qwerty_array1Lo,cur_sym_revers2)> 0 then isDigit := true;
elsif Instr(chararray,cur_sym_revers) > 0 then isDigit := true; end if;
if isDigit then
raise_application_error(-20004, 'В пароле есть символы, набранные с клавиатуры подряд кол-вом больше '||(cnt_sym-1)||' раз!');
end if;
end loop;
--
-- Everything is fine; return TRUE ;
RETURN(TRUE);
--
END;
/
Serj
Профи


Вступление в Клуб: 02.08.2007
СообщениеПт Сен 20, 2013 12:41    Ответить с цитатой
Полезность: 1
Код:

FUNCTION       "VERIFY_FUNCTION" (username varchar2,
      password varchar2,
      old_password varchar2)
      RETURN boolean IS
      n boolean;
      m integer;
      differ integer;
      isdigit boolean;
      ischar  boolean;
      ispunct boolean;
      digitarray varchar2(20);
      punctarray varchar2(25);
      chararray varchar2(118);
 
   BEGIN
      digitarray:= '0123456789';
      chararray:= 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZабвгдеёжзийклмнопрстуфкцчшщьыъэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ';
      punctarray:='!"#$%&()''*+,-/:;<=>?_';
 
      --Check if the password is same as the username
   IF password = username THEN
      raise_application_error(-20091, 'Пароль не может быть одинаковым с именем пользователя');
   END IF;
 
      --Check for the minimum length of the password
   IF length(password) < 6 THEN
      raise_application_error(-20092, 'Длина пароля не может быть меньше 6 символов');
   END IF;
 
      --Check if the password is too simple. A dictionary of words may be
      --maintained and a check may be made so as not to allow the words
      --that are too simple for the password.
   IF NLS_LOWER(password) IN ('welcome', 'database', 'account', 'user', 'passw
ord', 'oracle',
   'computer', 'abcdef', 'manager', 'system', 'qwerty', '123456', '1234567', '
12345678', '555555',
   '111111', '222222', '333333', '444444', '666666', '777777', '888888', '9999
99', '000000',
   '654321', '012345') THEN raise_application_error(-20092, 'Пароль слишком простой');
   END IF;
 
      --Check if the password contains at least one letter, one digit and one

      --punctuation mark.
      --1. Check for the digit
      --You may delete 1. and replace with 2. or 3.
   isdigit:=FALSE;
   m := length(password);
   FOR i IN 1..10 LOOP
     FOR j IN 1..m LOOP
       IF substr(password,j,1) = substr(digitarray,i,1) THEN
         isdigit:=TRUE;
           GOTO findchar;
       END IF;
      END LOOP;
   END LOOP;
   IF isdigit = FALSE THEN
     raise_application_error(-20093, 'Пароль должен содержать хотябы одну цифру или одну букву');
   END IF;
      --2. Check for the character
   <<findchar>>
   ischar:=FALSE;
   FOR i IN 1..length(chararray) LOOP
     FOR j IN 1..m LOOP
       IF substr(password,j,1) = substr(chararray,i,1) THEN
          ischar:=TRUE;
            GOTO findpunct;
          END IF;
       END LOOP;
   END LOOP;
   IF ischar = FALSE THEN
     raise_application_error(-20093, 'Пароль должен содержать хотябы одну цифру или одну букву');
   END IF;
     --3. Check for the punctuation
   <<findpunct>>
   GOTO endsearch;
   ispunct:=TRUE;
   ispunct:=FALSE;
   ---------------------------------------------------------------------------
-----
   FOR i IN 1..length(punctarray) LOOP
     FOR j IN 1..m LOOP
       IF substr(password,j,1) = substr(punctarray,i,1) THEN
          ispunct:=TRUE;
            GOTO endsearch;
          END IF;
      END LOOP;
   END LOOP;
   IF ispunct = FALSE THEN raise_application_error(-20093, 'Пароль должен содержать хотябы одну цифру или одну букву');
   END IF;
   ---------------------------------------------------------------------------
-----
   <<endsearch>>
 
   RETURN(TRUE);
   END;
- у нас так, проблем нету
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Oracle DBA Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru