Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Por que sempre preferimos usar parâmetros em instruções SQL?


O uso de parâmetros ajuda a evitar ataques de injeção de SQL quando o banco de dados é usado em conjunto com uma interface de programa, como um programa de desktop ou site.

No seu exemplo, um usuário pode executar diretamente o código SQL em seu banco de dados criando instruções em txtSalary .

Por exemplo, se eles escrevessem 0 OR 1=1 , o SQL executado seria
 SELECT empSalary from employee where salary = 0 or 1=1

pelo qual todos os empSalaries seriam retornados.

Além disso, um usuário pode executar comandos muito piores em seu banco de dados, incluindo excluí-lo. Se ele escrevesse 0; Drop Table employee :
SELECT empSalary from employee where salary = 0; Drop Table employee

A tabela employee então seria deletado.

No seu caso, parece que você está usando .NET. Usar parâmetros é tão fácil quanto:
string sql = "SELECT empSalary from employee where salary = @salary";

using (SqlConnection connection = new SqlConnection(/* connection info */))
using (SqlCommand command = new SqlCommand(sql, connection))
{
    var salaryParam = new SqlParameter("salary", SqlDbType.Money);
    salaryParam.Value = txtMoney.Text;

    command.Parameters.Add(salaryParam);
    var results = command.ExecuteReader();
}
Dim sql As String = "SELECT empSalary from employee where salary = @salary"
Using connection As New SqlConnection("connectionString")
    Using command As New SqlCommand(sql, connection)
        Dim salaryParam = New SqlParameter("salary", SqlDbType.Money)
        salaryParam.Value = txtMoney.Text

        command.Parameters.Add(salaryParam)

        Dim results = command.ExecuteReader()
    End Using
End Using

Editar 25/04/2016:

De acordo com o comentário de George Stocker, alterei o código de exemplo para não usar AddWithValue . Além disso, geralmente é recomendado que você envolva IDisposable s em using declarações.