Clicky

Hospedado por Limestone Networks

Jump to content
  • Sign Up

Sign in to follow this  
WebRodrigo

[Tutorial] Evite Injeções Sql

Recommended Posts

Abaixo segue um Código que parace seguro até que o conheça e faça valer o contrário.

<?php

include("conexao.php");

$login = "admin";

$senha = "********";

$busca = "SELECT * FROM tabelaLogin WHERE login = '$login' OR 1 and senha = '$senha'";

$busca = "SELECT * FROM tabelaLogin WHERE login = 'admin' OR 1 and senha = '********'";

// ateh aqui pode se observar que esta tudo ok

// o autenticacao vai acontecer normalmente pois foi fornecido o login e a senha de forma correta

//-------------------------------------------------------------------------------------------------------------------------

// mais digamos que eu nao tenha a senha e use o login = "admin" entao eu ja tenho 50 porcento de chance e

// agora soh falta advinhar a senha certo ?

// R: ERRADO se o site esta vuneravel a Injecao SQL eu praticamente ja tenho 100 porcento.

$login = "admin";

$senha = "' or '1=1";

$busca = "SELECT * FROM tabelaLogin WHERE login = '$login' OR 1 and senha = '$senha'";

$busca = "SELECT * FROM tabelaLogin WHERE login = 'admin' OR 1 and senha = '' or '1=1'";

// por Logica o que se pode observar eh admin E nada OU 1 = true

// V E F OU V = V

// a busca vai retorna verdadeiro o seja Logado como ADMIN

// isso para facil porque ja tem o login = admin, na verdade login nem eh necessario

$login = "' or '1=1";

$senha = "' or '1=1";

$busca = "SELECT * FROM tabelaLogin WHERE login = '$login' OR 1 and senha = '$senha'";

$busca = "SELECT * FROM tabelaLogin WHERE login = '' or '1=1' OR 1 and senha = '' or '1=1'";

// por logica denovo nada OU 1 E nada OU 1 = true

// F OU V E F OU V = V

// denovo Logado sem a necessidade de nenhum dado de acesso

//-------------------------------------------------------------------------------------------------------------------------

Uma forma bastante que ajuda eh limitar no formulario o tamanho dos campos Login e Senha

Outra maneira que realmente funciona eh filtrar todos dados retirando aspas simples, duplas, espacos em branco

barras e tudo que nao seja digito e numero antes de inseri-los em uma busca sql.

// retira os codigos html do login e retira as aspa simples

$login = str_replace("'","",strip_tags($login));

// retira os codigos html da senha, retira as aspa simplese criptografa antes de compara-la no banco de dandos

$senha = crypt(str_replace("'","",strip_tags($senha)));

//Agora sim pode se dizer que o codigo esta um pouco seguro

Feito pela PhpBrasil


"Pra que entrar na marinha se você pode ser um pirata" Steve Jobs

Share this post


Link to post
Share on other sites

Bacana tuas dicas Rodrigo,

Injection é um problema muito sério que está ocorrendo hoje, como XSS também que é um técnica de injeção de cros-site-scripting.

Criar um sistema que seja resistente a essas técnicas não é uma tarefa fácil, não é somente usando


strip_tags()

mysql_real_escape_string()

...

.

Eu quando prestando consultoria em desenvolvimento utilizo ou aconcelho a utilização de um Framework, seja PHP, Python, Ruby e mais, os frameworks já vem praparados pra essas situações, precisando apenas ligar/desligar.

Como a maioria aqui desenvolve PHP segue uma dica de framework http://codeigniter.com/ tem uma curva de aprendizado muito curta e oferece recursos fantásticos.

Fica a dica.....


Blaster Web Consultoria em Informática Ltda - CNPJ: 13.398.886/0001-15

Jarbas - Gerente Comercial - jarbas@blasterweb.com.br

Aguarde novidades na Blaster Web.

Share this post


Link to post
Share on other sites

Todas essas funções acabam modificando o que é inserido, francamente, usar str_replace ou strip_tags é um absurdo. O código abaixo preserva totalmente o que é inserido.


function anti_sql_injection($str) {

	if (!is_numeric($str)) {

		$str = get_magic_quotes_gpc() ? stripslashes($str) : $str;

		$str = function_exists('mysql_real_escape_string') ? mysql_real_escape_string($str) : mysql_escape_string($str);

	}

	return $str;

}

ai é só chamar a função, exemplo

$form_nome = anti_sql_injection($_POST['nome']);

E se o valor for em números

$form_cpf = (INT)$_POST['cpf'];



Tsundere

Share this post


Link to post
Share on other sites

É uma ótima dica, más o mod_security faz este serviço para mim :-)


Huge Networks - Especialistas em DDoS Mitigation - AS264409
● Infraestrutura DDoS Mitigation 280+ Gbps. DDoS Mitigation remoto / local. Proteção DDoS via Proxy, GRE ou cross connect.

Share this post


Link to post
Share on other sites

Apenas mysql_real_escape_string()

então eh soh fazer isso:

$senha = mysql_real_scape_string($senha);

$usuario = mysql_real_scape_string($usuario);

?

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.



×
×
  • Create New...