Como evitar SQL Injection em .NET

Publicado por Hugo Pires / Sem Comentários

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.

SQL Injection

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.

sql injection desprotegido

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.
sql injection protegido

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.


Na categoria Programação

Não encontrou o que procura?

Comentar