Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Perché preferiamo sempre utilizzare i parametri nelle istruzioni SQL?

L'utilizzo dei parametri aiuta a prevenire attacchi SQL injection quando il database viene utilizzato insieme a un'interfaccia di programma come un programma desktop o un sito Web.

Nel tuo esempio, un utente può eseguire direttamente il codice SQL sul tuo database creando istruzioni in txtSalary .

Ad esempio, se dovessero scrivere 0 OR 1=1 , l'SQL eseguito sarebbe

 SELECT empSalary from employee where salary = 0 or 1=1

per cui tutti gli empSalaries sarebbero stati restituiti.

Inoltre, un utente potrebbe eseguire comandi molto peggiori sul tuo database, inclusa l'eliminazione Se hanno scritto 0; Drop Table employee :

SELECT empSalary from employee where salary = 0; Drop Table employee

La tabella employee verrebbe quindi eliminato.

Nel tuo caso, sembra che tu stia utilizzando .NET. Usare i parametri è facile come:

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

Modifica 25-04-2016:

Secondo il commento di George Stocker, ho modificato il codice di esempio per non utilizzare AddWithValue . Inoltre, in genere si consiglia di eseguire il wrapping di IDisposable s in using dichiarazioni.