- Este tópico contém 6 respostas, 2 vozes e foi atualizado pela última vez 14 anos, 1 mês atrás por
braza.
-
AutorPosts
-
17 de janeiro de 2012 às 7:05 pm #102493
braza
ParticipanteBoa tarde,
Estou trabalhando com o Oracle 9i (9.2.0.6.0) e estou criando um profile com uma função que faz uma verificação de complexidade de senha.
Para fazer essa complexidade utilizei como exemplo, o arquivo ORACLE_HOMErdbmsadminutlpwdmg.sql.
Os testes que fiz deram certo, exceto para a parte em que diz: A senha deve ter ao menos três caracteres diferentes da senha anterior.
O meu código é o seguinte:
========================================
create or replace function fnc_verifica_complex_senha
(
pe_dsc_login varchar2, — nome da conta que está tendo a sua senha alterada
pe_dsc_senha_nova varchar2, — descricao da nova senha desta conta
pe_dsc_senha_antiga varchar2 — descricao da antiga senha desta conta
) return boolean
is/*
====================================================================================================
Autor:………………. Ailton Braz
Dt. Criacao:…………. 26-11-2010
Dt. atualizacao:………
Ds. atualizacao……….
Objetivo:……………. Função que verifica a complexidade da senha conforme a política de senhas adota pela empresa.
Retorna VERDADEIRO caso a senha informada tenha um alto grau de complexidade, outro caso, FALSO.
====================================================================================================
*/sConjuntoLetraMaiuscula varchar2(26) := ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’;
sConjuntoLetraMinuscula varchar2(26) := ‘abcdefghijklmnopqrstuvwxyz’;
sConjuntoNumeros varchar2(10) := ‘0123456789’;
sConjuntoCaracterEspecial varchar2(22) := ‘!”#$%&()“*+,-/:;<=>?_’;sDscSenha varchar2(200) := pe_dsc_senha_nova;
–sSenhaAnterior varchar2(200) := pe_dsc_senha_antiga;
sDscSenhaAntiga varchar2(200) := null;
sDscCaracter char(1);nContGrupoMaiuscula number(1) := 0;
nContGrupoMinuscula number(1) := 0;
nContGrupoNumeros number(1) := 0;
nContGrupoEspecial number(1) := 0;sDscContaAux varchar2(200) := null;
nDiferenca number(10) := 0;
nTamanho number(10) := 0;
nCont number(1) := 0;begin
— Verifica se a nova senha tem o mesmo nome da conta
if (pe_dsc_senha_nova = pe_dsc_login) then
raise_application_error(-20000,’!@#A senha tem a mesma descrição do nome da conta.#@!’);
return false;
end if;–Verifica o tamanho mínimo da senha
if (length(pe_dsc_senha_nova) < 6) then raise_application_error(-20001,'!@#A quantidade de caracteres da senha é inferior a 6 digitos.#@!'); return false; end if; --Verifica se a senha é muito simples. Este é apenas um pequeno dicionario de palavras. if (upper(pe_dsc_senha_nova) in ('BEM-VINDO','TESTE','DBA','ORACLE','BANCO','123','ABC','MANAGER','SYS','SYSTEM')) then raise_application_error(-20002,'!@#A senha é muito simples.#@!'); return false; end if; --A senha deve possuir 3 dos quatro grupos de caracteres especificados for nCont in 1 .. length(sDscSenha) loop sDscCaracter := substr(sDscSenha,nCont,1); ------------------------------------------------------------------------- ------------------------------------------------------------------------- --Verifica se a senha possui caracteres do grupo De letras maiusculas ------------------------------------------------------------------------- ------------------------------------------------------------------------- if (instr(sConjuntoLetraMaiuscula,sDscCaracter) <> 0) then
nContGrupoMaiuscula := 1; — Especifica que a senha possui caracteres do grupo letras maiusculas
end if;————————————————————————-
————————————————————————-
–Verifica se a senha possui caracteres do grupo De letras minusculas
————————————————————————-
————————————————————————-if (instr(sConjuntoLetraMinuscula,sDscCaracter) <> 0) then
nContGrupoMinuscula := 1; — Especifica que a senha possui caracteres do grupo letras minusculas
end if;————————————————————————-
————————————————————————-
–Verifica se a senha possui caracteres do grupo de numeros
————————————————————————-
————————————————————————-if (instr(sConjuntoNumeros,sDscCaracter) <> 0) then
nContGrupoNumeros := 1; — Especifica que a senha possui caracteres do grupo numeros
end if;————————————————————————-
————————————————————————-
–Verifica se a senha possui caracteres do grupo de caracteres especiais
————————————————————————-
————————————————————————-if (instr(sConjuntoCaracterEspecial,sDscCaracter) <> 0) then
nContGrupoEspecial := 1; — Especifica que a senha possui caracteres do grupo especiais
end if;–Verifica se a senha atende aos requisitos de caracteres
if ((nContGrupoEspecial + nContGrupoNumeros + nContGrupoMaiuscula + nContGrupoMinuscula) >= 3) then
exit;
end if;end loop;
–Verifica se a senha atende aos requisitos de caracteres
if ((nContGrupoEspecial + nContGrupoNumeros + nContGrupoMaiuscula + nContGrupoMinuscula) < 3) then raise_application_error(-20003,'!@#A senha deve conter 3 dos 4 grupos de caracteres: (' || sConjuntoLetraMaiuscula || ');(' ||sConjuntoLetraMinuscula || ');(' || sConjuntoNumeros || ');(' || sConjuntoCaracterEspecial || ').#@!'); return false; end if; --Verifica se a nova senha e igual da antiga senha if (pe_dsc_senha_nova = pe_dsc_senha_antiga) then raise_application_error(-20004,'!@#A senha informada é igual a senha anterior.#@!'); return false; end if; --Verifica se a senha é a descrição da conta ao contrario for nCont in 1 .. length(pe_dsc_login) loop sDscContaAux := substr(pe_dsc_login,nCont,1) || sDscContaAux; end loop; if (sDscContaAux = pe_dsc_senha_nova) then raise_application_error(-20005,'!@#A senha informada é igual ao nome da conta escrita ao contrário.#@!'); return false; end if; [color=red] --Verifica se a nova senha difere da anterior em pelo menos 3 caracteres. nDiferenca := abs(length(pe_dsc_senha_nova) - length(pe_dsc_senha_antiga)); if (nDiferenca < 3) then if (length(pe_dsc_senha_nova) < length(pe_dsc_senha_antiga)) then nTamanho := length(pe_dsc_senha_nova); else nTamanho := length(pe_dsc_senha_antiga); end if; for nCont in 1 .. nTamanho loop if (substr(pe_dsc_senha_nova,nCont,1) <> substr(pe_dsc_senha_antiga,nCont,1)) then
nDiferenca := nDiferenca + 1;
end if;end loop;
if (nDiferenca < 3) then raise_application_error(-20006,'!@#A senha informada deve diferir da anterior em pelo menos 3 caracteres.#@!'); return false; end if; end if; return true; end; ======================================== [/color] Essa última verificação não está passando no teste. Eu consigo criar a senha praticamente igual a anterior. O que há de errado??? Obrigado.
17 de janeiro de 2012 às 7:28 pm #102494rman
Participante@braza
nDiferenca := abs(length(pe_dsc_senha_nova) - length(pe_dsc_senha_antiga));if (nDiferenca < 3) then
Essa parte está estranha. Provavelmente nem chega a testar a quantidade de caracteres diferente pois não está entrando no IF.
17 de janeiro de 2012 às 8:24 pm #102497braza
Participante[quote=”rman”:1yfxpgre]@braza
nDiferenca := abs(length(pe_dsc_senha_nova) - length(pe_dsc_senha_antiga));if (nDiferenca < 3) then
Essa parte está estranha. Provavelmente nem chega a testar a quantidade de caracteres diferente pois não está entrando no IF.[/quote]
Quando eu faço um teste individual, eu mesmo informando os parâmetros, a função funciona direitinho.
Quando eu faço o teste de sistema, não funciona. Eu percrbi que eu não consigo pegar o valor da senha anterior, nessa função, no teste de sistema.
Essa parte apenas verifica se a nova senha é maior que a anterior. Se for maior em três dígitos ou mais, a verificação não precisa ser feita.
O fato de não conseguir recuperar o valor da senha anterior já faz com que a execução não entre no “IF”.
Tentei tirar esse trecho e o “IF” mas mesmo assim não consigo comparar nada com a senha anterior, pois não consigo recuperar o seu valor nesta função.
O que posso fazer nesse caso, para recuperar o valor da senha anterior???
Como seria o algoritmo para fazer essa verificação ???
Executei a mesma função do exemplo do Oracle e também não funcionou. Por isso tentei mudar o código.
O problema é o mesmo. O valor da senha antiga não é recuperado na função.
17 de janeiro de 2012 às 8:56 pm #102499rman
Participante@braza
Pelo que vi a senha antiga é parâmetro da função, se não tem valor o erro deve estar na chamada da função, o aplicativo deve estar passando null neste parametro. 😯
17 de janeiro de 2012 às 10:11 pm #102500braza
Participante[quote=”rman”:4sytq9m7]@braza
Pelo que vi a senha antiga é parâmetro da função, se não tem valor o erro deve estar na chamada da função, o aplicativo deve estar passando null neste parametro. 😯 [/quote]
Isso. O valor está null.
Acontece que é o oracle que executa essa função. Ela é executada quando se tenta alterar a senha.
alter user teste identified by 123;
Nesse momento a função é executada. Como o oracle faz isso, não sei. Apenas associei o profile e o usuário.
Todos os outros testes funcionam, menos esse.
Alguma dica do que pode estar errado????
17 de janeiro de 2012 às 10:47 pm #102503rman
Participante@braza
Pelo que andei lendo é assim mesmo que faz, será que é bug o 9i ?
18 de janeiro de 2012 às 3:57 pm #102508braza
Participante[quote=”rman”:1kopdnzo]@braza
Pelo que andei lendo é assim mesmo que faz, será que é bug o 9i ?[/quote]
Eu também testei numa base 10gR2(10.2.0.5) e aconteceu o mesmo problema.
Valeu!!!!
-
AutorPosts
- Você deve fazer login para responder a este tópico.