Inicio Fóruns Wiki Videos Galeria Comunidades Empregos FAQ Termos de Uso Contato Sobre Twitter Facebook Linkedin
Registre-se Grupos Sociais Blogs Calendário Marcar Fóruns Como Lidos
Voltar   Under-Linux.org > Blogs > root@blog:/# chmod o+r *
Visite também: Br-Linux ·  VivaOLinux ·  LinuxSecurity ·  Dicas-L ·  NoticiasLinux ·  SoftwareLivre.org ·  [mais]
Avalie este Artigo

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

Submit "[Curso de Python] Interação com o usuário - Parte 2" to Digg Submit "[Curso de Python] Interação com o usuário - Parte 2" to del.icio.us Submit "[Curso de Python] Interação com o usuário - Parte 2" to StumbleUpon Submit "[Curso de Python] Interação com o usuário - Parte 2" to Google
Posted 09-11-2009 at 10:08 by Magnun

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

Magnun Leno
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)
Visitas 336 Comentários 0 Editar Tags Email Blog Entry
Total Comments 0

Comentários

Enviar um comentario Enviar um comentario

Horários baseados na GMT -3. Agora são 22:06.


Powered by vBulletin®
Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.3.2 ©2009, Crawlability, Inc.