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

  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
  6. Avatar de Humildade
    Fala sério!!!

    Este é um exemplo de como são encontradas as falhas de segurança? rsrs

    Muito bacana este tópico!

    Abs
  7. Avatar de fabraga
    Boa!!
  8. Avatar de tony130666
    Que bom eu estar de volta. Mesmo depois de um bom tempo, me sinto muito feliz em retornar aqui e relembrar momentos incríveis. Espero que faça um site com um curso interativo e bem completo, se é que tem como ficar melhor do que já é.
    Sei lá, talvez integração com banco de dados (python + MySQL), entre outras coisas.
  9. Avatar de gpzim98
    Cheguei bem atrasado nos posts mais tudo bem...
    Parabéns.

+ Enviar Comentário