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: Injetando Dados a partir de Inputs’, aconselhamos que você dê uma olhada, pois para o entendimento deste post abaixo, será necessário ter uma noção do que é o SQL Injection. Gostaria de olhar agora ? Clique aqui!
Como proteger-se do famoso SQL Injection
Como todos já viram no post anterior o SQL Injection é o nome dado a manipulação de dados SQL através de objetos input.
A partir de agora você vai aprender a se defender deste deface dentro e fora do nosso querido Scriptcase.
Defesa através 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”.
Esta é responsável por cuidar da segurança de nossos campos 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 = ‘{user}’ AND pswd = ‘{pass}’”);
A imagem acima mostra detalhes do que já havíamos visto no post anterior, mas observe agora a imagem de baixo e veja como a macro funciona dentro do nosso select:
sc_select(rs, “SELECT * FROM sec_users WHERE login = “.sc_sql_injection({user}).” AND pswd = “.sc_sql_injection({pass}));
Então, antes sem a utilização da macro “sc_sql_injection” nosso código ficava aberto a interpretações, agora com a utilização da macro de forma correta, o Scriptcase percebeu rapidamente que estava sendo injetado um valor anormal e colocou uma barra invertida antes do valor do campo 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.
Lógicamente 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.
Para saber mais sobre a forma de utilização desta macro acesse: http://www.scriptcase.com.br/docs/pt_br/v81/manual_mp.htm#macros-scriptcase/macros-scriptcase
Como se proteger fora do Scriptcase, no PHP puro
Para que se esteja livre da utilização da SQL Injection, certas providências devem ser tomadas. Algumas das ações serão realizadas no servidor de banco de dados, 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 aspa 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:
Entendendo o código:
<?php
# Aqui instaciamos a classe mysqli, passando como parâmetro o servidor, usuario, 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 estra 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”, “variavéis 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 – variaveis inteiras
# d – variaveis double
# s – variaveis string
# b – variaveis 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 muitos outros que investem milhões em segurança de dados e são realmente eficientes no que diz respeito ao assunto, conseguem se livrar do ataques de hackers imaginem nós programadores comuns. Mas é claro que sempre podemos dificultar as coisas.
Então é isso pessoal, espero que tenham gostado do post. Aconselho que para melhor entendimento deêm uma lida na documentação das funções e alternativas citadas acima.
Fontes: http://imasters.com.br, http://www.devmedia.com.br, https://mathmesquita.me, http://php.net/
Você pode gostar também…