Ir para conteúdo

POWERED BY:

Arquivado

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

cdfree

SQL Injection

Recommended Posts

 

Use a função mysql_real_escape_string

 

Nem todo sql injetction usa ' ou ", além do que as funções mysql_* já foram depreciadas, ou seja, vão sumir no futuro...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Simples: prepared statements

 

 

Interessante isso! Dei uma lida sobre, fiquei curioso.

 

Estou sériamente pensando em como aplicar isso a um framework que estou desenvolvendo. Basicamente o que entendi é que a consulta terá um "template padrão" e apenas as variáveis que entrarão no banco de dados são indicadas. Procede? :innocent:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Interessante isso! Dei uma lida sobre, fiquei curioso.

 

Estou sériamente pensando em como aplicar isso a um framework que estou desenvolvendo. Basicamente o que entendi é que a consulta terá um "template padrão" e apenas as variáveis que entrarão no banco de dados são indicadas. Procede? :innocent:

Vou explicar isso de uma forma "semi didática" (semi, porque não é exatamente assim na realidade). Quando você faz um sql injection você joga na query um comando qualquer. Quando isso chega no MySQL, primeiro ele pega o que você mandou e analisa se a sintaxe está correta, se estiver ele começa a ver exatamente o que você quer na query (select, insert, updata, where...etc). Quando você manda um prepared statement o que for jogado na query não será analisado pelo MySQL, se entrar um drop table lá pelo meio ele não vai "processar" o drop table, ele vai ignorar isto enquanto comando existente no sistema.

 

Uma analogia simples seria a seguinte:

 

<?php
$variavel = 'iMasters';
 
echo '$variavel'; //Imprime: $variavel -> Isso seria o equivalente ao prepared statements
 
echo $variavel; //Imprime: iMasters
?>

 

Como eu disse, na realidade não é assim internamente, mas apenas para exemplificar acho que quebra um galho.

Compartilhar este post


Link para o post
Compartilhar em outros sites

mysql_real_escape_string não é eficiente e não usem mysql_*, a partir do PHP 5.5 elas já lançam erro.

 

PDO + Prepared Statements e não tem erro:

<?php
$pdo = new PDO(/* dados de conexão*/);

$stmt = $pdo->prepare("INSERT INTO users (name, email, age) VALUES (:name, :email, :age)");
$stmt->bindParam(':name', $_POST['name'], PDO::PARAM_STR);
$stmt->bindParam(':email', $_POST['email'], PDO::PARAM_STR);
$stmt->bindParam(':age', $_POST['age'], PDO::PARAM_INT);
$stmt->execute();

 

É evidente que isso só protege SQL injection, ainda é necessário validar e proteger-se contra XSS e outros tipos de ataque.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O BOM E SIMPLES E EFICIENTE É USAR UM MÉTODO DE PROIBIÇÃO DE ALGUNS CARACTERES ESPECIAIS E EXTENSÕES VIA GET E POST COMO

 

( ) - [ ] * ' " .TXT .HTACCESS ... ENTRE OUTROS.

 

UM BOM PROGRAMADOR DESCONFIA DE TUDO E DE TODOS EM SEU CÓDIGO PONHA REGRAS RÍGIDAS QUANTO A CONEXÃO

SERVER USUÁRIO , TENHA UM BOM TRABALHO :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

O BOM E SIMPLES E EFICIENTE É USAR UM MÉTODO DE PROIBIÇÃO DE ALGUNS CARACTERES ESPECIAIS E EXTENSÕES VIA GET E POST COMO

 

( ) - [ ] * ' " .TXT .HTACCESS ... ENTRE OUTROS.

 

UM BOM PROGRAMADOR DESCONFIA DE TUDO E DE TODOS EM SEU CÓDIGO PONHA REGRAS RÍGIDAS QUANTO A CONEXÃO

SERVER USUÁRIO , TENHA UM BOM TRABALHO :)

 

Um bom programador com certeza não faz essa gambiarras ai...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Proibição de caracteres é totalmente errado e atrapalha o usuário. Imagine que eu vá fazer um sistema para usuários postarem código e eu, visando evitar injeção de JavaScript, proibo a tag script, mas o usuário então não poderia postar a tag script no HTML que ele enviasse para ser publicado... FAIL.

 

O correto é escapar os caracteres para que não sejam interpretados pelo browser => htmlspecialchars.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A melhor forma de fazer segurança é manualmente, não com essas ferramentas mágicas que no fim falham.

 

A ferramenta está lá para ser usada, eu posso não ter o conhecimento necessário para fazer algo desse nivel, essa ferramenta esta no mercado a vários anos. Porque eu não deveria usa-la?

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.