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:
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:
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)

