Ver Feed RSS

root@blog:/# chmod o+r *

[Curso de Python] Interação com o usuário - Parte 2

Avalie este Post de Blog

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:

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
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":
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']
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 :
#!/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:
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
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...

Atualizado 21-11-2010 em 23:02 por Magnun

Categorias
Python , Artigos , Artigos , Cursos , Curso de Python

Comentários

Página 1 de 2 12 ÚltimoÚltimo
  1. Avatar de fabiocs
    dicas de segurança.... muito importante...
  2. Avatar de tony130666
    Valeu Magnum, tu é fera mesmo, e o meu código foi de grande valia, pois é um código de iniciante para iniciante. Se fosse um código perfeito, não iríamos aprender o que você explicou.
    Estou muito feliz, com que esta linguagem proporciona.
    Respondi o primeiro post, onde percebi um erro no cabeçalho #!usr/bin/python e deveria ser por padrão #!/usr/bin/env python. Um detalhe que para mim que sou puro iniciante me valeu a atenção.

    E o problema da indentação que não foi culpa do nosso colega lá e sim do retorno da página.
    def linha(): >>> pede indentação
    print algo
    print algo
    Não mantem o espaço:
    ....... print algo
    ....... print algo
    Os pontos para mostra o espaço que deveria ter ficado....
  3. Avatar de tony130666
    faltou: Quantas vezes voce quer tentar acessar o servidor? dir() >>> estou certo?
    Mas deu para entender...

    $ python conecta_srv.py
    Ok, iremos tentar ['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'senha', 'usuario'] vezes
  4. Avatar de tony130666
  5. Avatar de dimasters
    Cara muito bom
Página 1 de 2 12 ÚltimoÚltimo

+ Enviar Comentário





Visite: BR-Linux ·  VivaOLinux ·  Dicas-L