Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Fabyo

Anti SQL Injection

Recommended Posts

galera basedo nessa questao de SQl injectioneu to fazendo assim <?php // Teste 1... $_POST["usuario"] = "walace"; $_POST["senha"] = "Senha"; $_con = @mysql_connect("localhost","root",""); mysql_select_db("test",$_con); function anti_ataque($_sql) { if(get_magic_quotes_gpc()) { $_sql = stripslashes($_sql); } return mysql_real_escape_string($_sql); } echo "Teste 1...<br/>"; $_sql = "SELECT * FROM Usuario WHERE "; $_sql.= "userLogin = '" . anti_ataque($_POST["usuario"]) . "' AND "; $_sql.= "userPassw = '" . anti_ataque($_POST["senha"]) . "'"; $_res = mysql_query($_sql,$_con); if(mysql_num_rows($_res)>0) { $_r = mysql_fetch_assoc($_res); echo "Bem vindo {$_r["userName"]}"; } else { echo "Usuário ou Senha Inválido...Tente novamente"; } echo "<br/><br/>Teste 2 com o ataque...<br/>"; // Teste 2... $_POST["usuario"] = "jose_silva"; $_POST["senha"] = "' OR '1'='1"; $_sql = "SELECT * FROM Usuario WHERE "; $_sql.= "userLogin = '" . anti_ataque($_POST["usuario"]) . "' AND "; $_sql.= "userPassw = '" . anti_ataque($_POST["senha"]) . "'"; $_res = mysql_query($_sql,$_con); if(mysql_num_rows($_res)>0) { $_r = mysql_fetch_assoc($_res); echo "Bem vindo {$_r["userName"]}"; } else { echo "Usuário ou Senha Inválido...Tente novamente"; } ?>um abraçose houve falha me avise no msn baseado nos comentarios desse post kakaroto

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá...

Não tenho muita noção de PHP, mas preciso de uma função de anti_sql_injection, pra proteger os dados que estao e que futuramente serao incluídos num banco de dados... mas necessariamente preciso usar esse tipo de função me conectando em algum servidor? ou nao? Porque estou quebrando a cabeça e nao consigo faze-la funcionar...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alguém testou efetivamente os scripts deste tópico? Poderíamos a partir de um script elaborar e melhora-lo até que fique perfeito...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei se alguém cito isso em alguma resposta ao tópico, mas olhando essa função, uma coisa é óbvia, se alguém colocar esta função em um textarea ou algo do tipo, e o usuário digitar um texto em inglês e conter palavras como: SELECT, WHERE, FROM, o resultado vai ser apenas a destruição do texto, então acho que é bom usar com cautela, contudo, parabéns Fabyo.

 

PS: Uma boa pratica é o uso das funções addslashes(); e stripslashes(); assim quando usar o stripslashes(); o sql injection não vai passar de strings xD e texto com aspas vai ser imprimido como devido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal lembrem-se esse topico eu criei em 2005 hoje estamos em 2009, 4 anos se passaram e muita coisa mudou desde então

 

eu ja nao uso essa função e nem recomendo ela.

 

como ja citei antes o melhor meio de evitar sql injection, é fazer consultas sql passando os dados por referencia

 

um exemplo:

 

<?php
/* Execute a prepared statement by binding PHP variables */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();
?>

 

outro exemplo:

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}

$city = "Amersfoort";

/* create a prepared statement */
if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) {

/* bind parameters for markers */
$stmt->bind_param("s", $city);

/* execute query */
$stmt->execute();

/* bind result variables */
$stmt->bind_result($district);

/* fetch value */
$stmt->fetch();

printf("%s is in district %s\n", $city, $district);

/* close statement */
$stmt->close();
}
$mysqli->close();
?>

 

como podem ver os dados são passados por parametro desse jeito nao tem como ser executado sql injection

 

outras maneiras de se evitar sql injection é usar addslashes(), mysql_escape_string()

 

nunca removam qualquer tipo de palavra de uma consulta, como ja foi falado se fosse um forum essa função ja teria problema.

 

mas achei interessante esse assunto é muito abordado, e mesmo o topico sendo de 2005 ainda é muito discultido esse assunto, então pessoal continuem se preocupando com segurança mas tentem evitar ataques sql de uma forma correta

 

t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hum.. muitos estão dizendo pelo fórum que é questão apenas de addslashes()

Mas se esquecem de Cross Site Script, Ataque DDoS e DoS, e ataques de erro de código.

Eu estou fazem alguns meses tentando montar o "script perfeito" que tenha estas funções todas.

Estou reunindo em um script o addslashes(), strip_tags, htmlentities() (IFs E ELSEs), e outros truques a mais =D.

Testo o meu script regularmente com Programas renomados como o Acunetix, e Plugins, mas vocês acham que se eu faço de um modo eles não encontram outra vulnerabilidade? Hum... é claro que acham!

 

Portanto, sigam um conselho de alguem iniciando em php:

 

"Está fácil de mais? DESCONFIE!"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hum.. muitos estão dizendo pelo fórum que é questão apenas de addslashes()

Mas se esquecem de Cross Site Script, Ataque DDoS e DoS, e ataques de erro de código.

Eu estou fazem alguns meses tentando montar o "script perfeito" que tenha estas funções todas.

Estou reunindo em um script o addslashes(), strip_tags, htmlentities() (IFs E ELSEs), e outros truques a mais =D.

Testo o meu script regularmente com Programas renomados como o Acunetix, e Plugins, mas vocês acham que se eu faço de um modo eles não encontram outra vulnerabilidade? Hum... é claro que acham!

 

Portanto, sigam um conselho de alguem iniciando em php:

 

"Está fácil de mais? DESCONFIE!"

Se está a procura ou tentando fazer o script "perfeito" vai morrer tentando rsrsrs

Compartilhar este post


Link para o post
Compartilhar em outros sites

vejo que hoje em dia os servidores ja vem com um anti inject parece ne?

 

coloquei um site no ar, tentei fazer um inject simples, e ele colocou uma barra na frente sozinho..

 

ainda eh necessario fazer isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

#54

não..

 

coloquei um site no ar, tentei fazer um inject simples, e ele colocou uma barra na frente sozinho..

provavelmente um server muito mal configurado ou com algum motivo específico para fazer o addslash automaticamente, pois, por padrão, as versões atuais do PHP vem desativado, se não me engano desde a versão 4.3 onde foi anunciado como "deprecated" e que seria removida futuramente.

 

http://php.net/manual/en/security.magicquotes.php

 

veja mais

http://php.net/manual/en/security.magicquotes.disabling.php

http://www.php.net/manual/en/info.configuration.php#ini.magic-quotes-gpc

http://www.php.net/manual/en/security.database.sql-injection.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caros amigos,

 

só o código abaixo é suficiente para prevenir o SQL Injection? Sou inciante.

 

function anti_injection($txt)
{
$txt = get_magic_quotes_gpc() == 0 ? addslashes($txt) : $txt;
return preg_replace("@(--|\#|\*|;|=)@s", "", $txt);	
}

 

 

Obrigado pela atenção recebida.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caro Alaerte,

 

eu já li mas sou iniciante, para mim basta mas preciso da opinião de vocês que são entendidos de PHP.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo. Hoje em dia temos ferramentas que por si só já previnem o SQL Injection, como por exemplo o uso do PDO ou MySQLi. Consiste em classes nativas que são mais seguras e previnem o ataque contra sql. Por exemplo no MySQLi temos o PREPARE que serve para "preparar" uma consulta para prevenção de ataques, leia esse artigo do amigo.

 

http://blog.thiagobelem.net/usando-o-mysqli-orientado-a-objetos/

 

Bom, até aqui falamos da segurança na própria consulta, agora, em seu filtro de dados na página de login, basta você evitar que a injeção entre, deste modo a sua função já ajuda. Uma boa prática ainda, é utilizar o

 

mysqli_real_escape_string()

Entretanto, seu sistema dificilmente terá uma segurança 100% mais toda ajuda é bem vinda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

estou tendo o mesmo problema. Alguem vem inserindo registros sistematicamente. Ja dei uma estudada no sql Injection...mas não entendi a logica disto.

 

Vi o seu exemplo acima, a sua funcao anti_injection, mas não entendi muito bem isto...

 

Onde eu coloco este codigo? Mas mesmo que eu coloque este codigo no meu script que faz inserção de dados, como iria evitar a inserção de dados não autorizados. Pois pelo que andei pesquisando sobre sql Injection, seu eu tenho uma url assim:

 

http.www.meusite.com.br/

 

basta ele inserir um script no final desta url, ficando assim:

 

http.www.meusite.com.br/inserir_dados.php

 

ai ele de alguma forma consegue inserir os dados.

 

Então pergunto: como sua funcao anti sql funcionaria??

 

Eu andei testando este tipo de coisa, inventei um script para inserir dados, ou fazer alguma outra ação, e inseri este script no final da url. Mas nada aconteceu. Esperava até aparecer uma mensagem do tipo PAGINA INEXISTENTE, pois como pode executar algum script simplesmente inserindo um script no final da url, se o script não está no provedor???

 

to cheio de dúvidas...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.