Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
BoBr Участник со стажем
Вступление в Клуб: 30.01.2013
|
Пт Сен 20, 2013 11:50  VERIFY_FUNCTION |
|
Полезность: Нет оценки
|
Добрый день! Подсажите, кто и как использует данную функцию VERIFY_FUNCTION ? Никак не могу добиться того, что мне надо. В Oracle все хорошо, а АРМы постоянно ругаются .
Сам использую так:
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,'!"№;% *()_+/|,','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;
| - у нас так, проблем нету |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|