[Curso de Python] Interação com o usuário - Parte 2
por
em 09-11-2009 às 11:08 (11658 Visualizações)
Antes de prosseguir leia os artigos anteriores aqui
Vamo continuar a ver métodos de "entrar em contato" com o usuário.
Interação com o usuário
No post anterior eu deixei um "desafio" para os mais curiosos. Achei que mais pessoas iam responder. Apenas o tony130666 deixou uma sugestão de código. Abaixo está reproduzido a contribuição do nosso colega:
Vamos começar explicando como a função input funciona.Código :#!/usr/bin/env python n1= input('Insira o primeiro numero inteiro ') n2= input('Insira o segundo numero inteiro ') print "A soma dos dois numeros eh:" , n1+n2
A função input
A função input tem a grande vantagem de interpretar a entrada do usuário e retornar um tipo em python. Dessa forma se eu digitar:
- 'teste' (sem as aspas) a função input irá entender que é uma string;
- 12 ela compreenderá que é um inteiro;
- 1.75 ela saberá que é um float;
- [1, 2, 'três'] ela saberá que é uma lista;
- (1, 2, 3) ele irá entender que é uma tupla;
- etc...
Com isso o exemplo do nosso colega funciona bem, muito bem por sinal. Mas tem um pequeno problema. Ele é arriscado! A função input tem uma pequena 'falha de segurança'. Com ela é possível emitir comandos python válidos, atrapalhar o funcionamento do programa e até visualizar informações restritas. Abaixo mostro o programa do nosso colega sendo "atacado":
Como podem ver, o programa dele funcionou na primeira vez. Na segunda eu inseri duas strings e ele fez a concatenação das strings. Na terceira vez eu "derrubei" o programa passando argumentos que não podem ser somados. Na quarta vez utilizei uma lista vazia e o comando dir() para visualizar as variáveis do programa naquele instante. Parece algo bobo, mas isso pode ser muito mais sério. Vamos tomar como exemplo o seguinte código:Código :$ python soma.py Insira o primeiro numero inteiro 2 Insira o segundo numero inteiro 3 A soma dos dois numeros eh: 5 $ python soma.py Insira o primeiro numero inteiro "este e " Insira o segundo numero inteiro "um teste" A soma dos dois numeros eh: este e um teste $ python soma.py Insira o primeiro numero inteiro 2 Insira o segundo numero inteiro "erro!" A soma dos dois numeros eh: Traceback (most recent call last): File "soma.py", line 6, in <module> print "A soma dos dois numeros eh:" , n1+n2 TypeError: unsupported operand type(s) for +: 'int' and 'str' $ python soma.py Insira o primeiro numero inteiro [] Insira o segundo numero inteiro dir() A soma dos dois numeros eh: ['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'n1']
Neste código simulamos uma utilitário que tentaria se conectar a um servidor utilizando um usuário e senha armazenados. Informamos a ele quantas vezes essa tentativa de conexão irá ser repetida em caso de erro. Vamos agora "atacar" esse programa:Código :#!/usr/bin/env python usuario = "magnun" senha = "123456" tentativas = input('Quantas vezes você quer tentar acessar o servidor? ') print 'Ok, iremos tentar', tentativas, 'vezes' # Aqui o programa continuaria
Ai temos a parte interessante. Na primeira tentativa digitei 10 para o programa rodar normalmente. Na segunda tentativa utilizei a função dir() para visualizar as variáveis do programa. Para minha surpresa temos 2 variáveis interessantes chamadas "usuario" e "senha". Na terceira vez rodei o programa e digitei "usuario" nome da variável que continha o usuário (que eu vi com o comando dir()), podemos ver que ele imprimiu o usuário! E por último, utilizando o mesmo método, consegui pegar a senha: 123456.Código :$ python conecta_srv.py Quantas vezes voce quer tentar acessar o servidor? 10 Ok, iremos tentar 10 vezes $ python conecta_srv.py Quantas vezes voce quer tentar acessar o servidor? dir() Ok, iremos tentar ['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'senha', 'usuario'] vezes $ python conecta_srv.py Quantas vezes voce quer tentar acessar o servidor? usuario Ok, iremos tentar magnun vezes $ python conecta_srv.py Quantas vezes voce quer tentar acessar o servidor? senha Ok, iremos tentar 123456 vezes
Claro, esse é um exemplo um pouco exagerado, mas coisas semelhantes podem vir a acontecer. Agora entramos em um dilema. A função raw_input retorna somente strings enquanto a função input, que retorna as variáveis, não oferece segurança.
No próximo post vou mostrar como utilizar o comando raw_input para resolver esse dilema e termos um programa seguro que só irá prossegui se for digitado o que você solicitou.
Até mais...
Comentários
+ Enviar Comentário