Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Pourquoi préférons-nous toujours utiliser des paramètres dans les instructions SQL ?

L'utilisation de paramètres aide à prévenir les attaques par injection SQL lorsque la base de données est utilisée conjointement avec une interface de programme telle qu'un programme de bureau ou un site Web.

Dans votre exemple, un utilisateur peut directement exécuter du code SQL sur votre base de données en créant des instructions dans txtSalary .

Par exemple, s'ils devaient écrire 0 OR 1=1 , le SQL exécuté serait

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

par lequel tous les empSalaries seraient retournés.

De plus, un utilisateur pourrait exécuter des commandes bien pires sur votre base de données, y compris la supprimer S'il écrivait 0; Drop Table employee :

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

La table employee serait alors supprimé.

Dans votre cas, il semble que vous utilisiez .NET. L'utilisation des paramètres est aussi simple que :

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

Modifier 2016-4-25 :

Selon le commentaire de George Stocker, j'ai changé l'exemple de code pour ne pas utiliser AddWithValue . De plus, il est généralement recommandé d'envelopper IDisposable s dans using déclarations.