sql >> Databasteknik >  >> RDS >> Sqlserver

Varför föredrar vi alltid att använda parametrar i SQL-satser?

Att använda parametrar hjälper till att förhindra SQL Injection-attacker när databasen används tillsammans med ett programgränssnitt som ett skrivbordsprogram eller en webbplats.

I ditt exempel kan en användare köra SQL-kod direkt på din databas genom att skapa satser i txtSalary .

Till exempel, om de skulle skriva 0 OR 1=1 , skulle den exekverade SQL vara

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

varigenom alla löner skulle returneras.

Vidare kan en användare utföra mycket sämre kommandon mot din databas, inklusive att radera den om de skrev 0; Drop Table employee :

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

Tabellen employee skulle då raderas.

I ditt fall ser det ut som att du använder .NET. Att använda parametrar är lika enkelt som:

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

Edit 2016-4-25:

Enligt George Stockers kommentar ändrade jag exempelkoden till att inte använda AddWithValue . Det rekommenderas också generellt att du lindar IDisposable s i using uttalanden.



  1. PostgreSQL 11:Patchgranskare för partitionering av patchar

  2. Använder samma kolumn flera gånger i WHERE-satsen

  3. Kan inte ansluta till MySQL 4.1+ med gammal autentisering

  4. SQL Server SHOWPLAN_ALL