Sou de Porto Alegre

Rio Grande do Sul, Brasil

Me envie um e-mail

contato@camilamoreira.com.br

Estou disponível de

Seg. à Sex. das 9hs às 17hs

SQL Injection: Como se defender ?

SQL Injection é o nome dado a manipulação de dados SQL através de objetos input. Mas como se defender dele dentro e fora do Scriptcase?

SQL Injection: Como se defender ?

SQL Injection é o nome dado a manipulação de dados SQL através de objetos input. Mas como se defender  dele dentro e fora do Scriptcase? Veja agora!

Primeiramente se você ainda não leu o post sobre ‘SQL Injection: O que é e como funciona?’, aconselhamos que você dê uma olhada, pois para o entendimento deste post será necessário ter uma noção do que é o SQL Injection.

Defenda-se do SQL Injection dentro do Scriptcase

Poucas pessoas conhecem, mas o scriptcase possui uma lista de macros que permitem ao usuário manipular eventos, botões das aplicações, controle de segurança, efetuar operações com datas, etc… Entre todas estas macros poderemos encontrar a macro “sc_sql_injection”.
Ela é responsável por cuidar da segurança de nossos inputs contra o famoso sql injection.
Vamos agora entender como ela funciona.

Abaixo podemos observar como o select se comporta com relação aos dados inseridos no input, isto utilizando este select:

sc_select(rs, “SELECT * FROM sec_users WHERE login = “.sc_sql_injection({user}).” AND pswd = “.sc_sql_injection({pass}));

Sem a utilização da macro “sc_sql_injection” nosso código fica aberto a interpretações.

Agora com a utilização da macro de forma correta, o Scriptcase percebe rapidamente que esta sendo injetado um valor anormal e coloca uma barra invertida antes do valor do input login, desta forma a validação do select ficaria:

SQL gerado:

SELECT * FROM sec_users WHERE login = ‘\’ OR 1=1; — ‘ AND pswd = ”

Interpretação:

Me traga tudo da tabela sec_users onde o login é igual a \ ou 1 é igual a 1 e o restante comenta.

Logicamente não teremos nenhum login chamado “\”, portanto o injection da pessoa estará bloqueado. Por isso é sempre importante a utilização desta macro para buscar ou inserir informações no banco de dados.

Defenda-se do SQL Injection no PHP

Para que se esteja livre da utilização do SQL Injection, certas providências devem ser tomadas. Algumas das ações serão realizadas no servidor do banco de dados e outras devem ser garantidas pelo código fonte, ou seja, no nosso caso o PHP.

Podemos utilizar através do PHP a função addslashes(), que por sinal é a mesma função utilizada pela macro “sc_sql_injection”.

Esta função tem por objetivo inserir uma barra invertida antes de cada aspa simples e dupla encontrada na variável passada, este processo é conhecido como “escape”. Se a diretiva de configuração do PHP “magic_quotes_gpc” estiver ativada, o escape é realizado automaticamente sobre os dados de COOKIES e dados recebidos através dos métodos GET e POST.

Neste caso, não deve ser efetuado o tratamento com addslashes(). A função get_magic_quotes_gpc(), disponível nas versões do PHP a partir da 3.0.6, retorna a configuração atual da diretiva magic_quotes_gpc.

Veja o exemplo de como usar esta função:

Outra forma de se proteger também é através do MYSQLI no PHP. Se você ainda utiliza as funções da lib mysql(), “CORRA”, porque além de quase não ser mais utilizada, ela é totalmente vulnerável a invasões desse tipo. Nela, todas as queries são passadas manualmente. Mas é claro que eu não falaria para correr desta lib sem citar uma alternativa, a classe mysqli, esta usa parâmetros em “bind” para não haver nenhuma concatenação direta e nesse meio do “bind” a classe trata o input para nada funcionar como uma injeção.

Veja um pequeno exemplo de como utilizar:

Calma, eu sei que parece complicado, mas eu vou explicar linha a linha e garanto que você vai entender e passar a tomar mais cuidado na hora da criação do seu código. 

Lembrando que esses métodos que estou ensinando, são testados e aprovados, então vale a pena cuidar a forma que você desenvolve. Essa é uma dica valiosa e eu não deixaria de tentar seguir esta linha de raciocio  para pelo menos ter a conciência limpa de que você fez o seu melhor.

Bom, deixa  eu te explicar o código:

# Aqui instanciamos a classe mysqli, passando como parâmetro o servidor, usuário, senha e nome do banco de dados.
$mysqli = new mysqli(‘servidor’, ‘usuario’, ‘senha’, ‘database’ );

# Com a nossa classe já instanciada, vamos fazer a chamada do método prepare para “preparar” a query que receberá os valores.
# Onde tiver “?”(interrogação) serão os locais onde entraram os valores.
# Obs.: Não é necessário se preocupar com aspas no caso de strings.
$stmt = $mysqli->prepare(“SELECT name, email FROM sec_users WHERE login=? AND pswd=?”);

# Depois do nosso statement estar preparado com a string da query e as interrogações, nós iremos definir quais variáveis entraram
# em quais lugares e seus tipos através da função ->bind_param(“string de tipos”, “variáveis em ordem”).
$stmt->bind_param(‘ss’, $login, $senha);
# Onde tem ‘ss’ você deverá colocar as iniciais do tipo da variável.
# Ex.: $login e $senha são strings, então ‘ss’. Se fosse $valor e $senha, então ‘ds’.

# Os tipos permitidos são:
# i – variáveis inteiras
# d – variáveis double
# s – variáveis string
# b – variáveis que fornecem dados para um blob

# Após definirmos quais lugares as variáveis ocuparam, executaremos o statement.
if($stmt->execute()) {

# Outra função legal do statement é que podemos fazer algo parecido com o processo inverso do bind_param.
$stmt->bind_result($name, $email);

# A função bind_result, irá atribuir os valores obtidos nas queries, no nosso caso name e email, em variáveis que nós
# escolhemos os nomes, eu preferi manter o nome, mas poderia ter colocado $var1 e $var2, sendo que $var1 receberia o nome
# e $var2 o email.

# E agora pegamos todos os resultados imprimindo-os na tela com os nomes das variáveis que definimos no bind_result().
while($stmt->fetch()){
echo “Nome do usuário: $name \n Email do usuário: $email\n”;
}
}

Obviamente nunca estaremos 100% protegidos, pois se as maiores empresas como Facebook, Google e muitas outras que investem milhões em segurança de dados e são realmente eficientes no que diz respeito ao assunto, não conseguem se livrar dos ataques de hackers, imaginem nós programadores comuns. Entretanto, sempre podemos dificultar as coisas.

Para entender melhor, assista o vídeo abaixo.

Então é isso pessoal, espero que tenham gostado do post. Aconselho que para melhor entendimento deem uma lida na documentação das funções e alternativas citadas acima.

Fonts: www.imasters.com.br, www.devmedia.com.br, www.php.net, www.scriptcaseblog.com.br
Share on facebook
Share on email
Share on whatsapp
Share on twitter

Você deve estar logado para postar um comentário