Visite também: BR-Linux ·  VivaOLinux ·  LinuxSecurity ·  Dicas-L ·  NoticiasLinux ·  SoftwareLivre.org ·  [mais]
Ver Feed RSS

root@blog:/# chmod o+r *

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

Avalie este Post de Blog
por em 09-11-2009 às 12:08 (798 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:

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
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...

Enviar "[Curso de Python] Interação com o usuário - Parte 2" para Digg Enviar "[Curso de Python] Interação com o usuário - Parte 2" para del.icio.us Enviar "[Curso de Python] Interação com o usuário - Parte 2" para StumbleUpon Enviar "[Curso de Python] Interação com o usuário - Parte 2" para Google

Publicidade


Comentários

Comentar Comentar

Trackbacks

Total de Trackbacks 0
URL do Trackback: