Pq "1a2b3c" é igual a "1a2b3caa"??

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Romega
Usuário Nível 1
Usuário Nível 1
Mensagens: 10
Registrado em: 08 Jan 2007 09:14

Pq "1a2b3c" é igual a "1a2b3caa"??

Mensagem por Romega »

Estou fazendo uma rotina simples para restringir acesso somente com senha. Supondo que a senha correta seja "1a2b3c", se eu digitar qualquer coisa da senha errada, se eu digitar a senha correta funciona normalmente. Mas se eu digitar "1a2b3casdada" tb funciona...
PQ????
Ou seja, ele analisa se a senha correta está dentro da senha digitada e não se a senha correta é exatamente igual a senha digitada...
Valeu pela ajuda...
Segue codfon...

Código: Selecionar todos

local ink := 0
local senre := "1a2b3c"
local senink := space(0)
local tempink := space(2)
local contink := 39

@ 8,13 to 14,61
@ 10,15 say "----> Sistema de Controle Financeiro Pessoal."
@ 12,15 say "        Senha de Acesso:" 
set color to n/w                     

@ 12,40 clear to 12,49

do while ink<>13
if contink>48
exit
else
contink := contink + 1
end if

ink := inkey(0)
@ 12,contink say "*"
tempink := chr(ink)
senink := senink + tempink
end do

if senink==senre
? "Senha correta"
inkey(0)
elseif senink<>senre
? "Senha incorreta"
quit
end if
Daikishimetai no ni...
Avatar do usuário
Clipper
Colaborador
Colaborador
Mensagens: 1334
Registrado em: 23 Ago 2004 00:04
Localização: Recife/PE

Mensagem por Clipper »

Prezado Colega

Veja como eu fiz, e funcionou.

Código: Selecionar todos

local ink := 0 
local senre := "1a2b3c" 
local senink := space(0) 
local tempink := space(2) 
local contink := 39 

cls
@ 8,13 to 14,61 
@ 10,15 say "----> Sistema de Controle Financeiro Pessoal." 
@ 12,15 say "        Senha de Acesso:" 
set color to n/w                      

@ 12,40 clear to 12,49 

do while .t. 
   if contink>48 
      exit 
   else 
      contink := contink + 1 
   end if 

   ink := inkey(0) 
   if ink=13
      exit
   endif
   @ 12,contink say "*" 
   tempink := chr(ink) 
   senink := senink + tempink 
end do 

if senink==senre 
   ? "Senha correta" 
   inkey(0) 
else
   ? "Senha incorreta" 
   quit 
end if
Até logo.

Marcelo
Programador que é programador, quando tá de folga vai inventar função nova, fazer testes, ou seja... se divertir
Cobra 210 - Drive de 8" 1.024 KB - 64 KB RAM - Impressora de Linha Cobra - Visicalc - Fortran - Dialog - Sistema Operacional SP/M (é sp/m mesmo - era o cp/m da cobra)
Avatar do usuário
Clipper
Colaborador
Colaborador
Mensagens: 1334
Registrado em: 23 Ago 2004 00:04
Localização: Recife/PE

Mensagem por Clipper »

Prezado Colega

Uma opção mais profissional seria o uso da claúsula PASSWORD ao GET.

Para adicionar a opção de PASSWORD no GET.

Compile e linke com sua aplicação o PRG que está no link abaixo, faça também a chamada dos arquivos CH que vão juntos.

www.phrep.com.br/getpass.zip

Agora você pode colocar assim para campos de senha :

SENHA=SPACE(10)
@ 10,25 GET SENHA PASSWORD PICT "XXXXXXXXXX"

ou

SENHA=SPACE(10)
@ 10,25 GET SENHA PASSWORD PICT "@!"

Você poderá usar BACKSPACE para desfazer uma digitação errada
Pode-se também mudar o caractere que aparece no lugar da senha

Até logo.

Marcelo
Programador que é programador, quando tá de folga vai inventar função nova, fazer testes, ou seja... se divertir
Cobra 210 - Drive de 8" 1.024 KB - 64 KB RAM - Impressora de Linha Cobra - Visicalc - Fortran - Dialog - Sistema Operacional SP/M (é sp/m mesmo - era o cp/m da cobra)
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

O contrário de senink==senre é !senink==senre. Assim a comparação é exata.

[]'s
Maligno
http://www.buzinello.com/prg
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem por Pablo César »

Eu ja estava por responder quando vi a tua resposta MARCELO e agora do MALIGNO.

Caro Romega, basicamente o colega Marcelo resolveu a questão por causa da concatenação da sua senha. No seu código-fonte o <Enter> tmabém era concatena no final da variavel senink. Experimente colocando alert(">"+senink+"<") após o seu do while e verá um caracter a mais no final da senha digitada. Sugiro você fazer o tratamento de todas as teclas que o usuário possa digitar. Teclas como:

BACKSPACE: para corregir apagado de trás pra frente
F1: chamar o help
Só aceitar maiusculas, assim o usuário não se bate tanto. ?? (a seu critério)
ESC: para o usuário sair sem poder acessar
F10: por exemplo para poder gerar uma contra-senha

Acostume ao seu usuário com o mesmo padrão de saidas e entradas. Isto é, padronize sempre a forma que você faria para sair, incluir, editar, deletear, etc... Isso fará que o usuário seja adestrado melhor... hehehe (uma brincadeirinha... hihi)

Também aconselho, você de nunca colocar a senha (mestre) no proprio código-fonte (porque pode ser alterada editando o executável). Faça dentro de um dbf com cadastro de usuarios. Fica uma coisa personalizada. Escripte as senhas e grave no DBF. Não utilize o nome de SENHAS.DBF (isto chama a atenção). Faça pelo menos 2 níveis de acesso, um operacional e outro gerencial. E faça num looping com número de tentativas esgotadas quando erra a senha, mas dê uma mensagem. As mensagens faça no rodapé da sua aplicação.

Eu espero ter te insentivado a tua imaginação. Sei que seu código era de testes.

Um clip-abraço :)Pos
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Pablo César escreveu:Também aconselho, você de nunca colocar a senha (mestre) no proprio código-fonte
Realmente. Senha em fonte, jamais.
Escripte as senhas e grave no DBF.
Não é o mais usual. O que normalmente se faz é armazenar apenas o hash do log-in. No log-in é calculado o hash e comparado com o que está armazenado. Claro que dificilmente alguém vai se dispor a quebrar a proteção da senha gravada, mas é um bom hábito armazenar apenas o hash. O mais popular, me parece, é o MD5. Mas pode-se usar qualquer outro. O CRC32 (menos eficiente) usa só 8 caracteres, enquanto o MD5 consome 32.

[]'s
Maligno
http://www.buzinello.com/prg
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem por Pablo César »

Maligno escreveu:O que normalmente se faz é armazenar apenas o hash do log-in... O mais popular, me parece, é o MD5. Mas pode-se usar qualquer outro.
Puxa, LEGAL ! Eu ja faço algo parecido mas não quis mencionar porque iria complicar pro colega. Mas seria muito bom saber onde podemos encontar o MD5 (conceito: http://pt.wikipedia.org/wiki/MD5) que possa utiizar com o Clipper ?. Você poderia dar um exemplo básico ?.

Um clip-abraço :)Pos
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Pablo César escreveu:Mas seria muito bom saber onde podemos encontar o MD5 (conceito: http://pt.wikipedia.org/wiki/MD5) que possa utiizar com o Clipper ?. Você poderia dar um exemplo básico ?.
Já tinha disponibilizado antes. Veja a thread a respeito. Para detalhes, leia o README que está no ZIP.

[]'s
Maligno
http://www.buzinello.com/prg
Avatar do usuário
Netavin
Usuário Nível 3
Usuário Nível 3
Mensagens: 306
Registrado em: 28 Fev 2007 08:37
Localização: Cacoal-RO

HASH ?

Mensagem por Netavin »

Bom dia malígno !
Que é isso !!! Dá uma chance para os novatos ! O que é Hash ?
Abraço!

Netavin.
TK90 / TK95 / APPLE IIe / 286 / 386 / 486 / 586 / AMD Atlhon
" Sem saber que era impossível, foi lá e fez !! "
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: HASH ?

Mensagem por Maligno »

Netavin escreveu:Que é isso !!! Dá uma chance para os novatos ! O que é Hash ?
Primeiro dê a você mesmo essa chance. Afinal, você tem um mundo inteiro na ponta dos dedos. :)))
Clique no link: http://pt.wikipedia.org/wiki/Hash

[]'s
Maligno
http://www.buzinello.com/prg
Avatar do usuário
Netavin
Usuário Nível 3
Usuário Nível 3
Mensagens: 306
Registrado em: 28 Fev 2007 08:37
Localização: Cacoal-RO

Hash

Mensagem por Netavin »

... valeu Maligno !!! Somei mais um grãozinho ao meu conhecimento.
Gostei do seu estilo: ensinar a pegar o peixe; não pescá-lo.

[]´s

Netavin.
TK90 / TK95 / APPLE IIe / 286 / 386 / 486 / 586 / AMD Atlhon
" Sem saber que era impossível, foi lá e fez !! "
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Re: Hash

Mensagem por Pablo César »

Netavin escreveu:ensinar a pegar o peixe; não pescá-lo.
É isso aí NETAVIN, senão o pessoal fica muito acomodado. E o verdeiro objetivo de tudo isto, é aprender a como fazer e não copiar somente.

Um clip-abraço :)Pos
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Romega,

Respondendo especificamente a sua pergunta: quando vc usa "=" para comparar dois strings, o tamanho deles não é comparado, só o conteúdo, e ainda assim a comparação é limitada ao tamanho do menor string. Por isso "1a2b3c" é igual a "1a2b3caa" (os 6 primeiros caracteres são iguais).

Se vc usar "==", mata o problema:
"1a2b3c"= "1a2b3caa" -> .t.
"1a2b3c"=="1a2b3caa" -> .f.
porque tanto o tamanho quanto o conteúdo têm que ser iguais.

Eolo
Responder