[Curso de Python] Interação com o usuário - Parte 2
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:
#!/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
Vamos começar explicando como a função input funciona.
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":
$ 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']
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:
#!/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
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:
$ python conecta_srv.py
Quantas vezes voce quer tentar acessar o servidor? 10
Ok, iremos tentar 10 vezes
$ python conecta_srv.py
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
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.
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...
CISCO CCNA: CSCO10991731
e-mail: magnunΘunder-linux.org
Blog: root@blog:/# chmod o+r *
Participe de uma comunidade!
"If you choose not to decide, you still have made a choice."
- Freewill (Rush)
Comentários
Enviar um comentario
|

![Submit "[Curso de Python] Interação com o usuário - Parte 2" to Digg](images/misc/bookmarksite_digg.gif)
![Submit "[Curso de Python] Interação com o usuário - Parte 2" to del.icio.us](images/misc/bookmarksite_delicious.gif)
![Submit "[Curso de Python] Interação com o usuário - Parte 2" to StumbleUpon](images/misc/bookmarksite_stumbleupon.gif)
![Submit "[Curso de Python] Interação com o usuário - Parte 2" to Google](images/misc/bookmarksite_google.gif)




