Вторник, 23.07.2024, 11:03

  • Полезные Скрипты Oracle
Главная Книги Быстрый Поиск О Сайте

Oracle
PL/SQL
Решения для Oracle
ПОИСК
Быстрый поиск
 Сделать более безопасный пароль для профиля пользователя
-- utlpwdmg.sql 
CONNECT / as sysdba
CREATE OR REPLACE 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(52);
BEGIN
digitarray:= '0123456789';
chararray:= 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
punctarray:='!"#$%&()``*+,-/:;<=>?_';
-- -------------------------------------------------- --
-- Проверка на совпадение имени пользователя и пароля --
-- -------------------------------------------------- --
IF NLS_LOWER(password) = NLS_LOWER(username)
THEN
raise_application_error(-20001, 'Пароль совпадает с именем');
END IF;
-- --------------------------------------------- --
-- Проверка минимальной длины пароля --
-- --------------------------------------------- --
IF LENGTH(password) < 4 THEN
raise_application_error(-20002, 'Длина пароля должна быть не менее 4 символов');
END IF;
-- ---------------------------------------------
-- Проверка пароля на простоту. Словарь может быть
-- дополнен по желанию.
-- ---------------------------------------------
IF NLS_LOWER(password) IN ('welcome', 'qwerty', 'database', 'account',
'user', 'password', 'oracle', 'computer',
'abcd', '123456', '111111') THEN
raise_application_error(-20002, 'Пароль слишком прост');
END IF;
-- ----------------------------------------------
-- Проверка содержания как минимум одной цифры,
-- одного символа и одного знака знака пунктуации.
-- ----------------------------------------------
-- 1. Проверка на наличие цифр
-- ----------------------------------------------
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(-20003, 'Пароль должен содержать
как минимум 1 цифру, 1 символ и 1 знак пунктуации'
);
END IF;
-- ---------------------------------------------
-- 2. Проверка на наличие символа
-- ---------------------------------------------
<>
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(-20003, 'Пароль должен содержать
как минимум 1 цифру, 1 символ и 1 знак пунктуации'
);
END IF;
-- ---------------------------------------------
-- 3. Проверка на наличие знака пунктуации
-- ---------------------------------------------
<>
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(-20003, 'Пароль должен содержать
как минимум 1 цифру, 1 символ и 1 знак пунктуации'
);
END IF;
<>
-- ---------------------------------------------
-- Проверка отличия нового пароля от старого
-- как минимум на три символа
-- ---------------------------------------------
IF old_password = '' THEN
raise_application_error(-20004, 'Старый пароль пуст');
END IF;
differ := LENGTH(old_password) - LENGTH(password);
IF ABS(differ) < 3 THEN
IF LENGTH(password) < LENGTH(old_password) THEN
m := LENGTH(password);
ELSE
m := LENGTH(old_password);
END IF;
differ := ABS(differ);
FOR i IN 1..m LOOP
IF SUBSTR(password,i,1) != SUBSTR(old_password,i,1) THEN
differ := differ + 1;
END IF;
END LOOP;
IF differ < 3 THEN
raise_application_error(-20004, 'Пароль должен отличатся
как минимум на три символа'
);
END IF;
END IF;
-- ---------------------------------------------
-- Все хорошо возвращаем TRUE
-- ---------------------------------------------
RETURN(TRUE);
END;
/

CREATE PROFILE DEVELOPER_PROFILE LIMIT
PASSWORD_LIFE_TIME 60
PASSWORD_GRACE_TIME 10
PASSWORD_REUSE_TIME 1800
PASSWORD_REUSE_MAX UNLIMITED
FAILED_LOGIN_ATTEMPTS 3
PASSWORD_LOCK_TIME 1/1440
PASSWORD_VERIFY_FUNCTION verify_function;




Copyright sql.ucoz.com © 2024
Оцените сайт

Всего ответов: 51