O SQL Injection é uma técnica usada por Hackers, que permite manipular as instruções SQL que executamos nas nossas aplicações, de forma a ganhar acesso, ou até executar operações directamente na base de dados, operações essas, que permitem por exemplo, eliminar registos ou até tabelas. Ora isto é evitável, e portanto devemos ter em atenção estes pormenores, para que mais tarde não tenhamos de sofrer as consequências.
Em baixo temos um exemplo de uma função desprotegida contra SQL Injection:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | //Função para adicionar utilizador, desprotegida contra SQL injection public static void AddUser(string connectionString, string user) { using (SqlConnection connection = new SqlConnection(connectionString)) { //Cria um comando em que o valor de "user" é concatenado na query string query = "INSERT INTO Users(username) VALUES('" + user + "')"; SqlCommand command = new SqlCommand(query, connection); try { //Executa o commando connection.Open(); Int32 linhasInseridas = command.ExecuteNonQuery(); Console.WriteLine("{0} linha(s) inserida(s)", linhasInseridas); } catch (Exception ex) { Console.WriteLine(ex.Message); } } } |
Esta função está desprotegida porque é feita a concatenação dos valores directamente na query, e se tentarmos adicionar o utilizador Sourceware’ com o método anterior, o que obtemos é o erro da imagem seguinte, o que significa que este método está desprotegido contra SQL Injection.
Em .NET, a forma mais fácil e eficaz de resolver o problema do SQL Injection é usando queries parametrizadas. Assim em vez de concatenar os valores directamente na query, estes são passados como parâmetros, e não nos precisamos de preocupar com o que o utilizador introduziu, porque o “escape” é feito automaticamente.
Assim sendo, podemos criar um método como o seguinte:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | //Função para adicionar utilizador, protegida contra SQL injection public static void AddUserBetter(string connectionString, string user) { using (SqlConnection connection = new SqlConnection(connectionString)) { //Cria uma query parametrizada que usa o parâmetro @user string query = "INSERT INTO Users(username) VALUES(@user)"; SqlCommand command = new SqlCommand(query, connection); //O valor de user é passado como parâmetro command.Parameters.AddWithValue("@user", user); try { //Executa o commando connection.Open(); Int32 linhasInseridas = command.ExecuteNonQuery(); Console.WriteLine("{0} linha(s) inserida(s)", linhasInseridas); } catch (Exception ex) { Console.WriteLine(ex.Message); } } } |
E como podemos verificar, introduzindo Sourceware’, como na execução anterior, já conseguimos inserir o registo sem problemas.

Portanto já sabem, usar sempre queries parametrizada para dados introduzidos pelo utilizador, é a regra de ouro para que não tenham problemas com SQL Injection.
Download do Exemplo em C#(Visual Studio 2008)
Não existem artigos relacionados.

