Vous êtes sur la page 1sur 14

iblioteca math (funes matemticas):

>>> import math >>> x = 5 >>> math.sqrt(x) 2.2360679774997898 >>> from math import * >>> sin(x) -0.95892427466313845 >>> log(x) 1.6094379124341003 >>> cos(x) 0.28366218546322625

Biblioteca Tkinter (GUI padro)


from tkinter import * box = Button(text="Ok", command='exit') box.pack() box.mainloop()

Biblioteca smtplib (E-mail)


import smtplib server = smtplib.SMTP('mail.xx.net') # Envio de e-mail da conta @xy para a conta @xx server.sendmail('leonardo@xy.com', 'leonardo@xx.net', """To: leonardo@xx.net From: leonardo@xy.com Subject: Teste de envio de email Estou lhe enviando este email como um teste. """) server.quit() print 'Envio OK'

Biblioteca time Com ela podemos implementar por exemplo um contador, no caso mostrado abaixo o terminal dar uma pausa de 1 segundo entre cada impresso do intervalo "range(5)".
>>> import time >>> for i in range(5): print i time.sleep(1) ... 0 1 2 3 4

Urllib
Um exemplo de uso da biblioteca urllib com leitor de RSS feedparser para o uso na internet. O exemplo abaixo faz o download do mdulo feedparser depois faz a leitura do RSS da ltimas Notcias do site Terra.
>>> import urllib >>> url = 'http://diveintomark.org/projects/feed_parser/feedparser.py' >>> arq = urllib.urlopen(url) >>> open(feedparser.py, w).write(arq.read()) >>> import feedparser >>> terra = feedparser.parse('http://rss.terra.com.br/0,,EI1,00.xml') >>> terra.values() [...] >>>

[editar] Numpy
Numpy uma biblioteca matemtica de cdigo aberto para Python, com suporte a matrizes e vetores grandes, alm de um grande nmero de funes matemticas. O site oficial http://numpy.scipy.org/ . importante lembrar que Python possui uma biblioteca matemtica padro, chamada Math. Essa biblioteca precisa ser instalada antes de ser usada, no vem por padro. O exemplo abaixo mostra o uso da biblioteca Numpy na criao de arrays com valores aleatrios, e a manipulao desses valores.
>>> import numpy >>> a = numpy.random.randn(25) #Cria um array >>> len(a) #Informa o tamanho do array 25 >>> a #Mostra os valores do array array([-0.97662319, -0.91427827, -0.17596519, -1.21453417, -0.508037 , 1.0928856 , -0.83259417, 0.41311712, -0.03811292, 0.5168261 , 0.38207838, 1.27969391, -0.94028084, 0.33992957, -1.73894293, >>> a[0:10] #Mostra os valores do array, de 0 array([-0.97662319, -0.91427827, -0.17596519, -1.21453417, -0.508037 , 1.0928856 , >>> a[0:4]*2 #Multiplicao dos valores 0 at array([-1.95324639, -1.82855654, -0.35193039, >>> com 25 valores aleatrios

-1.07721448, -0.64067605, -0.4206412 , -0.40750775, -0.41181049, 0.45493473, -0.91343678, -0.89708382, 0.5228072 , 0.57514934]) at 10 -1.07721448, -0.64067605, -0.4206412 , -0.40750775]) 4 por 2 -2.15442897])

Introduo
A Biblioteca Padro do Python contm um vasto nmero de mdulos teis e parte de todas as instalaes de Python. importante conhece-la, uma vez que muitos problemas podem ser resolvidos rapidamente se voc estiver familiarizado com o grande nmero de coisas que estas bibliotecas podem fazer. Ns iremos explorar alguns dos mdulos mais usados desta biblioteca. Voc pode encontar detalhes completos para todos os mdulos da Biblioteca Padro do Python na seo 'Library Reference' da documentao que vem com sua instalao do Python. Vamos explorar alguns mdulos teis. Nota Se voc achar estes tpicos muito avanados, voc pode pular este captulo. No entanto, eu realmente recomendo que voc volte para estudar este captulo quando voc estiver familiarizado com a programao usando Python.

Mdulo sys
O mdulo sys contm funcionalidades especficas do sistema. Ns j vimos que a lista sys.argv contm os argumentos da linha de comando. Suponha que ns desejemos checar a verso do Python que est sendo usada para se assegurar que estamos usando a verso 3. O mdulo sys nos d tal funcionalidade.
>>> import sys >>> sys.version_info (3, 0, 0, 'beta', 2) >>> sys.version_info[0] >= 3 True

Como funciona: O mdulo sys tem a tupla version_info que nos d informaes sobre a verso do Python. O primeiro valor a verso principal. Ns podemos verificar a verso, por exemplo, para garantir que o programa s rode sob o Python 3.0:
#!/usr/bin/python # Filename: checarversao.py import sys, warnings if sys.version_info[0] < 3: warnings.warn("Necessrio Python 3.0 para rodar este programa", RuntimeWarning) else: print('Prosseguir normalmente')

Sada:
$ python2.5 checarversao.py checarversao.py:6: RuntimeWarning: Necessrio Python 3.0 para rodar este programa RuntimeWarning) $ python3 checarversao.py Prosseguir normalmente

Como funciona: Ns usamos um outro mdulo da biblioteca padro chamado warnings, que usado pra mostrar

avisos para o usurio final. Se a verso do Python no for 3.0 ou superior, ns mostramos o aviso correspondente.

Mdulo logging
E se voc desejar armazenar mensagens de depurao ou outras mensagens importantes, de forma que voc possa verificar se seu programa est rodando da forma que voc esperava? Como armazenar estas mensagens? Isso pode ser feito usando o mdulo logging.
#!/usr/bin/python # Filename: use_logging.py import os, platform, logging if platform.platform().startswith('Windows'): logging_file = os.path.join(os.getenv('DIRETRIOINICIAL'), os.getenv('CAMINHO'), 'test.log') else: logging_file = os.path.join(os.getenv('HOME'), 'test.log') logging.basicConfig( level=logging.DEBUG, format='%(asctime)s : %(levelname)s : %(message)s', filename = logging_file, filemode = 'w', ) logging.debug("Incio do programa") logging.info("Fazendo alguma coisa") logging.warning("Terminando agora")

Sada:
$python use_logging.py Logging to C:\Users\swaroop\test.log

Se ns verificarmos o contedo de test.log, veremos algomo como isto:


2008-09-03 13:18:16,233 : DEBUG : Incio do programa 2008-09-03 13:18:16,233 : INFO : Fazendo alguma coisa 2008-09-03 13:18:16,233 : WARNING : Terminando agora

Como funciona: Ns usamos trs mdulos da biblioteca padro - o mdulo os para interagir com o sistema operacional, o mdulo platform para informaes sobre a plataforma, i.e. o sistema operacional, e o mdulo logging para registrar informaes. Inicialmente, ns verificamos qual o sistema operacional que estamos usando, verificando a string retornada por platform.platform() (para mais informaes, veja import platform; help(platform) no interpretador Python). Se for o Windows, ns apontamos o diretrio inicial, o caminho e o nome do arquivo no qual queremos armazenar a informao. Juntando estas trs partes, ns teremos a localizao completa do arquivo. Para outras plataformas, ns precisamos conhecer apenas a pasta home do usurio e assim teremos a localizao completa do arquivo. Ns usamos a funo os.path.join() para juntar estas trs partes da localizao. O motivo de usar uma funo especial ao inves de apenas somar as strings, que esta funo se assegura de que a localizao completa esteja de acordo com o formato esperado pelo sistema operacional. Ns configuramos o mdulo logging para escrever todas as mensagens no arquivo especificado, num formato especfico.

Finalmente, ns podemos armazenar mensagens teis para depurao, informao, avisos ou mensagens crticas. Uma vez que o programa tenha rodado, ns podemos verificar este arquivo e, assim, saberemos o que aconteceu no programa, mesmo que nenhuma informao tenha sido mostrada para o usurio durante seu funcionamento.

Mdulos urllib e json


No seria divertido se ns pudssemos escrever nossos prprios programas de busca para internet? Vamos descobrir como faz-los. Isto pode ser feito usando-se alguns mdulos. Primeiro o mdulo urllib que podemos usar para obter qualquer pgina da internet. Poderemos usar o Yahoo! Search para pesquisar resultados e, por sorte, eles podem nos dar os resultados num formato chamado JSON, que podemos analisar facilmente graas ao mdulo embutido json da biblioteca padro. Nota Este programa ainda no funciona devido ao que parece ser um bug no Python 3.0 beta 2.
#!/usr/bin/python # Filename: yahoo_search.py import sys if sys.version_info[0] != 3: sys.exit('Este programa precisa do Python 3.0') import json import urllib, urllib.parse, urllib.request, urllib.response # Obtenha seu prprio APP ID em http://developer.yahoo.com/wsregapp/ YAHOO_APP_ID = 'jl22psvV34HELWhdfUJbfDQzlJ2B57KFS_qs4I8D0Wz5U5_yCI1Awv8.lBSfPhwr' SEARCH_BASE = 'http://search.yahooapis.com/WebSearchService/V1/webSearch' class YahooSearchError(Exception): pass # Obtido de http://developer.yahoo.com/python/python-json.html def search(query, results=20, start=1, **kwargs): kwargs.update({ 'appid': YAHOO_APP_ID, 'query': query, 'results': results, 'start': start, 'output': 'json' }) url = SEARCH_BASE + '?' + urllib.parse.urlencode(kwargs) result = json.load(urllib.request.urlopen(url)) if 'Error' in result: raise YahooSearchError(result['Error']) return result['ResultSet'] query = input('Pelo que voc quer procurar? ') for result in search(query)['Result']: print("{0} : {1}".format(result['Title'], result['Url']))

Como funciona: Ns podemos obter resultados de um determinado site, fornecendo o texto que se deseja procurar em um formato especfico. Ns devemos especificar diversas opes, que ns juntamos usando o

formato key1=value1&key2=value2, que usado pela funo urllib.parse.urlencode(). Ento, por exemplo, abra este link em seu navegador e voc vera 20 resultados, iniciando do primeiro, para a busca das palavras "byte of python". Este endereo nos d os resultados no formato JSON. Ns realizamos a conexo a este URL usando a funo urllib.request.urlopen() e passando o arquivo obtido para json.load() que ir ler seu contedo e simultneamente converte-li em um objeto Python. Ento ns usamos um loop nestes resultados para mostr-los ao usurio final.

O Mdulo da Semana
H muito mais para ser explorado na biblioteca padro, tal como depurao, uso de opes em linha de comando, expresses comuns e muito mais. A melhor forma de se aprofundar na biblioteca padro ler os excelentes artigos 'Python Module of the Week' de Doug Hellmann.

Sumrio
Ns vimos algumas das funcionalidades de alguns mdulos da Biblioteca Padro do Python. recomendvel que voc navegue pela documentao da Biblioteca Padro do Python para ter uma ideia de tudo que os mdulos so capazes de fazer. A seguir, ns veremos vrios aspectos sobre Python que faro nosso tour mais completo.

Introduo
At agora ns cobrimos a maior parte dos diversos aspectos que ns usaremos. Neste captulo, ns abordaremos algumas funcionalidades adicionais que tornaro o nosso conhecimento de Python mais completo.

Passando Tuplas Adiante


Algumas vezes voc gostaria de poder retornar com dois valores diferentes de uma funo? Voc pode. Tudo que precisa fazer usar uma tupla. >>> def obtenha_detalhes_erro(): ... return (2, 'detalhes do segundo erro') ... >>> errnum, errstr = obtenha_detalhes_erro() >>> errnum 2 >>> errstr 'detalhes do segundo erro' Note que o uso de a,b = <alguma expressao> interpreta o resulatado da expresso como uma tupla com dois valores. Se quiser interpretar o resultado como (a, <todo o resto>), ento voc precisa acrescentar um asterisco, como se fossem parmetros de uma funo:

>>> a, *b = [1, 2, 3, 4] >>> a 1 >>> b [2, 3, 4] Isso tambm significa que o modo mais rpido de trocar duas varaveis entre si em Python : >>> a = 5; b = 8 >>> a, b = b, a >>> a, b (8, 5)

Mtodos Especiais
Existem certos mtodos tais como __init__ e __del__ que possuem significado especial em classes. Os mtodos especiais so empregados para emular certos comportamentos dos tipos 'built-in'. Por exemplo, se voc quiser usar a operao de indexao x[indice] para a sua classe (exatamente como voc faria para listas e tuplas), ento tudo o que voc deve fazer implementar o mtodo __getitem__() e est feito. Se voc refletir a respeito, isto o que Python faz no caso da prpria classe das listas! Alguns mtodos especiais teis esto listados na tabela que segue. Se voc quiser conhecer mais a respeito de todos os mtodos especiais, veja o manual. Alguns Mtodos Especiais Nome Explicao __init__(self, ...) Este mtodo chamado imediatamente antes que o novo objeto criado esteja pronto para utilizao. __del__(self) Chamado imediatamente antes que o objeto seja destrudo. __str__(self) Chamado quando ns usamos a funo print ou quando str() usado. __lt__(self, other) Chamado quando o operador 'menor do que' (<) usado. Similarmente, existem mtodos especiais para todos os operadores (+, >, etc.) __getitem__(self, key) Chamado quando a operao de indexao x[key] usada.

__len__(self) Chamado quando a funo 'built-in' len() utilizada para um objeto sequncia.

Blocos de Um nico Comando


Ns j vimos que cada bloco de comandos posto separadamente do resto pelo seu prprio nvel de indentao. Bem, existem algumas excees. Se o seu bloco de comandos contm apenas um nico comando, ento voc poder especific-lo na mesma linha de, digamos, um comando condicional ou em lao. O seguinte exemplo dever tornar isso mais claro: >>> flag = True >>> if flag: print 'Sim' ... Sim Observe que o comando nico empregado no local e na mesma linha e no como um bloco separado. Embora voc possa fazer uso disso para tornar menor o seu programa, eu aconselho a evitar este procedimento em curto-circuito, exceto no caso de verficao de erro, uma vez que ficar muito mais fcil acrescentar um comando a mais se voc estiver usando a indentao apropriada.

Formas Lambda
Uma forma lambda empregada para criar novos objetos funes e retorn-los em tempo de execuo ('runtime'). 1. !/usr/bin/python 2. Nome do arquivo: lambda.py def cria_repetidor(n):
return lambda s: s * n

dobro = cria_repetidor(2) print(dobro('palavra')) print(dobro(5)) Sada:


$ python lambda.py palavrapalavra 10

Como Funciona: Aqui ns desenvolvemos uma funo cria_repetidor para fabricar novos objetos funes em tempo de execuo e retorn-los. Um comando lambda utilizado para criar o objeto funo. Essencialmente lambda recebe um parmetro seguido de apenas uma nica expresso, a qual se torna o corpo da funo e o valor dessa expresso retornado pela nova funo. Note que mesmo um comando print (Python 2.x) no pode ser usado no interior de uma forma lambda, apenas expresses. A SER FEITO

Podemos realizar uma list.sort() fornecendo uma funo de comparao criada usando lambda?

pontos = [ { 'x' : 2, 'y' : 3 }, { 'x' : 4, 'y' : 1 } ] 1. pontos.sort(lambda a, b : cmp(a['x'], b['x']))

List Comprehension
'List comprehensions' so empregadas para obter-se uma nova lista de uma lista existente. Suponha que voc tenha uma lista de nmeros e deseje obter uma nova lista com todos os nmeros multiplicados por dois apenas quando o nmero por sua vez for maior do que 2. 'List comprehensions' so ideais para tais situaes. 1. !/usr/bin/python 2. Nome do arquivo: list_comprehension.py listaum = [2, 3, 4] listadois = [2*i for i in listaum if i > 2] print(listadois) Sada: [2, 6, 8] Como Funciona: Aqui ns obtemos uma nova lista atravs da especificao da manipulao a ser efetuada quando alguma condio for satisfeita (if i > 2). Note que a lista original permanece inalterada. A vantagem de usar 'list comprehensions' que reduz a quantidade de cdigo padro ('boilerplate') requerido quando ns usamos laos para processar cada elemento de uma lista e adicion-lo em uma nova lista.

Recebendo Tuplas e Dicionrios em Funes


Existe um modo especial de atribuir parmetros a uma funo como uma tupla ou dicionrio, usando os prefixos * e ** respectivamente. Isso muito til quando se considera um nmero varivel de argumentos na funo. >>> def powersum(power, *args): ... Retorna a soma de cada argumento elevada potncia especificada. ... total = 0 ... for i in args: ... total += pow(i, power) ... return total ... >>> powersum(2, 3, 4) 25 >>> powersum(2, 10) 100 Uma vez que temos um prefixo * na varivel args, todos os argumentos extra passados funo so atribudos a args como uma tupla. Se ao invs disso, tivesse sido usado um prefixo **, os parmetros extra seriam considerados como pares chave/valor de um dicionrio.

Os Comandos Exec E Eval


A funo exec empregada para executar comandos em Python que esto armazenados em uma string ou arquivo, ao contrrio do que se estivessem no prprio programa. Por exemplo, ns podemos gerar uma string contendo comandos em Python em tempo de execuo e ento executlos utilizando a funo exec: >>> exec('print("Hello World"')) Hello World De modo anlogo, a funo eval utilizada para avaliar expresses vlidas em Python que esto armazenadas em uma string. Um exemplo simples mostrado a seguir. >>> eval('2*3') 6

O Comando Assert
O comando assert empregado para assegurar-se de que alguma coisa verdadeira. Por exemplo, se voc est bem certo que ter pelo menos um elemento em uma lista que voc est usando e quer verificar esse fato e levantar ('raise') um erro se isso no for verdade, ento o comando assert ideal para essa situao. Quando um comando assert falha, um AssertionError levantado. >>> mylist = ['item'] >>> assert len(mylist) >= 1 >>> mylist.pop() 'item' >>> mylist [] >>> assert len(mylist) >= 1 Traceback (most recent call last):
File "<stdin>", line 1, in <module>

AssertionError O comando assert deve ser usado com cautela. Na maior parte dos casos, melhor capturar excees, seja manipulando o problema, ou emitindo uma mensagem de erro para o usurio e saindo do programa.

A Funo Repr
A funo repr utilizada para obter-se uma representao por meio de uma string cannica do objeto. A parte interessante que voc ter eval(repr(objeto)) == objeto em quase todos os casos. >>> i = [] >>> i.append('item') >>> repr(i) "['item']" >>> eval(repr(i)) ['item'] >>> eval(repr(i)) == i True Basicamente, a funo repr empregada para obter-se uma representao imprimvel do objeto. Voc pode controlar o que a sua classe retorna sob a funo repr, definindo o mtodo __repr__ em

sua classe.

Resumo
Ns abordamos algumas funcionalidades adicionais de Python neste captulo e mesmo assim no cobrimos todas elas. Porm, a essa etapa, ns apresentamos a maior parte do que voc ir empregar na prtica. Isso suficiente para que voc possa iniciar com quaisquer programas que for produzir. A seguir, ns discutiremos como explorar Python ainda mais.

Segurana em Sistemas de Login: Proteo Contra SQL Injection


Dando continuao ao artigo sobre Segurana em Sistemas de login, hoje mostrarei como se defender de ataques por SQL Injection. Foco MySQL e PostgreSQL, os principais SGBDs gratuitos da atualidade. Caso no tenha visto a primeira parte do artigo, leia-a aqui: Segurana em SIstemas de Login: Senhas e Cookies

Sumrio
1. Introduo 2. Magic Quotes 3. Solues Especificas para cada SGBD 3.1. MySQL 3.2. PostgreSQL 3.3. Exemplos de cdigos para MySQL e PostgreSQL 4. Apenas Isso No Basta 5. Concluso

1. Introduo
Neste segundo artigo sobre segurana em sistemas de login, abordarei formas de proteo contra SQL Injection. Existem muitas discusses na Internet, em listas de discusso e fruns, sobre qual seria a funo perfeita para impedir ataque por SQL Injection SQL Injection. Alguns programadores at criam funes que removem, por segurana, palavras-chave da linguagem SQL, como SELECT, DROP, DELETE. Isso pode at resolver, mas no podemos danificar a informao; se permitirmos que o usurio escreva informaes em nosso site, devemos permitir-lhe escrever SELECT, DROP e DELETE tambm. Imagine, por exemplo, um frum sobre programao: como poderamos postar cdigos SQL se o frum removesse as palavras SELECT, DELETE etc? Logo, no podemos remover essas palavras. A soluoo muito simples! Sim, simples, mesmo. Muitos querem complicar toa, porm muito simples: escapar caracteres especiais. Esses caracteres especiais podem variar conforme o SGBD que se est utilizando. Normalmente so aspas simples e duplas, as quais delimitam strings em um comando SQL. Vamos a um exemplo. Considere a SQL abaixo:
$sql = "SELECT id, nome, sobrenome FROM autores WHERE nome = '" . $nome . "' AND sobrenome = '" . $sobrenome . "'";

Supondo que $nome contenha jos, e $sobrenome, silva, a SQL ficar assim:
SELECT id, nome, sobrenome FROM autores WHERE nome = 'jo'se' AND sobrenome = 'silva';

Isso gera um erro de sintaxe, sem comprometer o banco de dados. Porm, se mantivermos $sobrenome e definirmos $nome com o valor jo; DROP TABLE autores ; , teremos:
SELECT id, nome, sobrenome FROM autores WHERE nome = 'jo'; DROP TABLE autores ;

--'AND sobrenome = 'silva';

Dessa forma, selecionam-se os registros com nome igual a jo, remove-se a tabela autores e considera-se AND sobrenome = silva; como comentrio. Isso caracteriza um ataque por SQL Injection.

2. Magic Quotes
Face aos possveis grandes danos que SQL Injection pode causar, o PHP possui um mecanismo nativo automtico para escapar caracteres especiais: o magic quotes. Porm, esse um mecanismo genrico, que no pode ser aplicado a todos os SGBDs. Logo, no o utilize! O prprio Manual do PHP no recomenda seu uso:
There is no reason to use magic quotes because they are no longer a supported part of PHP. However, they did exist and did help a few beginners blissfully and unknowingly write better (more secure) code. But, when dealing with code that relies upon this behavior it's better to update the code instead of turning magic quotes on. So why did this feature exist? Simple, to help prevent SQL Injection. Today developers are better aware of security and end up using database specific escaping mechanisms and/or prepared statements instead of relying upon features like magical quotes.

Fonte: http://br3.php.net/manual/en/security.magicquotes.why.php Como citado no trecho, prefervel adaptar seus cdigos a fim de torn-los seguros e no vulnerveis a SQL Injection a habilitar o magic quotes. Portanto mantenha a diretiva magic_quotes_gpc, do , em off! D preferncia a funes especficas para cada SGBD. Leia o captulo sobre Magic Quotes, do }Manual do PHP, no link abaixo: http://br3.php.net/manual/en/security.magicquotes.php

3. Solues Especificas para cada SGBD 3.1. MySQL


Vamos ao exemplo mais comum: MySQL: existe uma funo especfica do PHP para escapar caracteres especiais do MySQL: mysql_real_escape_string. Ela deve ser usada com magic_quotes_gpc em off. Caso seu servidor mantenha essa diretiva ativa, desabilite-a por meio de htaccess ou, caso isso no seja possvel, certifique-se de usar stripslashes antes de aplicar essa funo. Veja o exemplo abaixo:
if ( get_magic_quotes_gpc() ) { $name = stripslashes( $name ); } $name = mysql_real_escape_string( $name ); mysql_query( "SELECT * FROM users WHERE name=$name" );

Esse trecho de cdigo e outras dicas sobre preveno de SQL Injection com MySQL podem ser vistas no link abaixo, do prprio Manual do MySQL: http://dev.mysql.com/tech-resources/articles/guide-to-php-security.html

3.2. PostgreSQL
O escape de caracteres no PostgreSQL no feito com barra invertida; feito com aspas simples. Ou seja, addslashes no funcionaria aqui.

O PHP tambm tem uma funo especfica para escape de caracteres especiais para PostgreSQL: pg_escape_string. Mais informaes sobre preveno de SQL Injection em PostgreSQL podem ser vistas no link abaixo, do Wiki do PostgreSQL: http://wiki.postgresql.org/wiki/Sql_injection

3.3. Exemplos de cdigos para MySQL e PostgreSQL


mysql_connect( 'localhost', 'usuario', 'senha' ); $str = "There's no place like 127.0.0.1, the \"localhost\""; echo "String: " . $str . "<br />"; echo "MySQL: " . mysql_real_escape_string( $str ) . "<br />"; echo "Postgre: " . pg_escape_string( $str ) . "<br />";

* Para usar mysql_real_escape_string, necessrio uma conexo MySQL ativa.\ Sada:


String: There's no place like 127.0.0.1, the "localhost" MySQL: There\'s no place like 127.0.0.1, the \"localhost\" Postgre: There''s no place like 127.0.0.1, the "localhost"

4. Apenas Isso No Basta


Apenas escapar caracteres no suficiente, uma vez que no existem apenas strings. Tambm temos dados numricos, como inteiros, floats e outros tipos de ponto flutuante, que no so envolvidos por aspas em consultas SQL. Considere a seguinte SQL:
$sql = "SELECT id, nome, sobrenome FROM autores WHERE id=" . $id;

Se $id tiver o valor 0; DROP TABLE autores; , a SQL final ser:


SELECT id, nome, sobrenome FROM autores WHERE id=0; DROP TABLE autores; --;

Isso removeria a tabela autores. A soluo , novamente, muito simples: basta fazer casting, ou coero, convertendo o parmetro para um tipo numrico. No exemplo acima, bastaria isto:
$id = (int) $id;

O mesmo vale para float, double e os demais tipos de dados.

5. Concluso
SQL Injection um problema muito grave, que muitos programadores iniciantes deixam passar despercebido, principalmente por falta de conhecimento. Apesar disso, sua preveno muito simples. Basta entender o funcionamento do ataque para saber como se defender dele.

Vous aimerez peut-être aussi