Olá a todos. Gostaria, primeiramente, de informar sobre uma promoção que criei com a finalidade de nos conhecermos no iMasters interCon 2007, fazermos networking e discutirmos assuntos relevantes para nossa coluna.
Se você se inscrever no iMasters InterCon 2007 até o dia 22 de outubro, irá concorrer a um pacote “Leandro Vieira” com 3 cursos (incluindo o lançamento Curso Interativo Adobe Dreamweaver CS3); e se você indicar mais 4 amigos vai concorrer a R$ 100,00 em compras na TI Shop no dia evento. Confira mais detalhes sobre a promoção no meu blog sobre desenvolvimento web.
Hoje falaremos a respeito do posicionamento do Dreamweaver com relação a SQL Injection. Primeiramente, o que é SQL Injection?
SQL Injection é uma técnica que explora vulnerabilidades de segurança em banco de dados de uma aplicação. Uma vez que os aplicativos web aceitam parâmetros informados pelos usuários e tais parâmetros não são filtrados corretamente, dessa forma torna-se possível a inserção de instruções SQL inesperadas.
Agora que você sabe do que se trata SQL Injection, vamos analisar como o Dreamweaver se posiciona frente a esse importante assunto.
Se as instruções SQL maliciosas são informadas pelos usuários mal intencionados; nós, desenvolvedores, abrimos espaços para que eles (usuários) informem tais instruções em diversas situações corriqueiras no desenvolvimento web. Por exemplo, quando o usuário se cadastra; atualiza algum dado; efetua o login; faz uma busca; e diversas outras situações.
Como necessitamos que os usuários se interagem com nossos aplicativos, abrir esses tipos de espaços são inevitáveis, e portanto não temos escolhas, se não abri-los. Porém, precisamos nos precaver quanto a segurança dos recursos desenvolvidos, e o Dreamweaver nesse sentido está precavido.
Quando criamos no Dreamweaver um Recordset que possui opções de filtro; ou quando utilizamos algum outro recurso em que há interação com o usuário, por exemplo: Insert Record, Update Record, Delete Record, Log In User, entre outros. O Dreamweaver utiliza uma função própria chamada GetSQLValueString que filtra os dados informados pelo usuário de acordo com seu tipo.
Observe uma situação em que a referida função é utilizada:
$query_rsNoticias = sprintf("SELECT * FROM rs_com_varios_filtros WHERE strNotText LIKE %s", GetSQLValueString("%" . $colname_rsNoticias . "%", "text"));
O exemplo acima é parte de código de um Recordset que possui a opção de filtro, onde os registros que farão parte do Recordset serão filtrados por um termo informado pelo usuário. Esse termo antes de ser agregado à instrução SQL é passado à função GetSQLValueString que por sua vez o retorna de forma apropriada e segura de ser utilizado.
Observe o código da função GetSQLValueString.
if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
{
$theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
$theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);
switch ($theType) {
case "text":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "long":
case "int":
$theValue = ($theValue != "") ? intval($theValue) : "NULL";
break;
case "double":
$theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
break;
case "date":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "defined":
$theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
break;
}
return $theValue;
}
}
A função demonstrada acima aceita quatro parâmetros, embora os dois últimos dificilmente são utilizados. Por tanto, manteremos o foco nos dois primeiros que recebem o valor e o tipo de tal valor, respectivamente.
O primeiro tratamento que a função GetSQLValueString faz é com relação ao valor informado a ela, independente do seu tipo, onde ela executa os seguintes processos:
$theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
Se a configuração atual de “magic quotes gpc” estiver defina como 1 (true, verdadeiro) a função stripslashes será utilizada sobre o valor informado, desfazendo o efeito de addslashes. Caso contrário, nada será feito ao valor. Em seguida:
$theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);
Será utilizada a função mysql_real_escape_string, se ela estiver disponível, caso contrário a função mysql_escape_string. Ambas funções tem o intuito de preparar uma STRING (neste contexto, o valor informado à função) para ser utilizado em uma instrução SQL.
Após esses dois processos, o segundo tratamento que a função GetSQLValueString fará com o valor informado a ela, será segundo o seu tipo – informado através do segundo parâmetro da função. Os tipos aceitos pela função são os seguintes: text; long; int; double; date e defined.
Os tipos text, double e date irão englobar o valor em aspas simples. Por exemplo: Lorem virá a ser ‘Lorem’. O tipo double ainda utiliza a função doubleval que retorna o valor float do termo. Por exemplo: 01.09Setembro virá a ser ‘1.09’.
Já o tipo long e int irão retornar o valor inteiro do valor informado através da função intval.
Todos esses tipos são informados automaticamente pelo Dreamweaver, embora você os define através de sua interface para configurar os recursos desejados, sem a necessidade de alterar manualmente o código.
Abaixo, listo algumas funções citadas no decorrer deste artigo, para que você as conheça melhor, se desejar.
Mais sobre SQL Injection (em inglês).
Espero que tenham gostado do assunto, e fique mais atento quanto a seguranças dos seus aplicativos. Um abraço a todos e até o próximo.