Pular para o conteúdo
Visualizando 7 posts - 1 até 7 (de 7 do total)
  • Autor
    Posts
  • #102493
    braza
    Participante

      Boa 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.

      #102494
      rman
      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.

        #102497
        braza
        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.

          #102499
          rman
          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. 😯

            #102500
            braza
            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????

              #102503
              rman
              Participante

                @braza

                Pelo que andei lendo é assim mesmo que faz, será que é bug o 9i ?

                #102508
                braza
                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!!!!

                Visualizando 7 posts - 1 até 7 (de 7 do total)
                • Você deve fazer login para responder a este tópico.