sql >> Databáze >  >> RDS >> Sqlserver

Proč vždy preferujeme použití parametrů v příkazech SQL?

Použití parametrů pomáhá předcházet útokům SQL Injection když se databáze používá ve spojení s rozhraním programu, jako je počítačový program nebo webová stránka.

Ve vašem příkladu může uživatel přímo spouštět kód SQL ve vaší databázi vytvořením příkazů v txtSalary .

Pokud by například napsali 0 OR 1=1 , provedené SQL by bylo

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

čímž by byly vráceny všechny pracovní platy.

Dále by uživatel mohl provádět mnohem horší příkazy proti vaší databázi, včetně její smazání, pokud by napsal 0; Drop Table employee :

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

Tabulka employee bude poté smazáno.

Ve vašem případě to vypadá, že používáte .NET. Použití parametrů je stejně snadné jako:

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

Upravit 25. 4. 2016:

Podle komentáře George Stockera jsem změnil ukázkový kód tak, aby nepoužíval AddWithValue . Obecně se také doporučuje zabalit IDisposable s v using prohlášení.



  1. Spuštění PostgreSQL pouze v paměti

  2. Migrace vašeho klastru Cassandra

  3. Co je to vlastní runtime obrázek v Javě 9?

  4. Jak mohu zahrnout hodnoty null do MIN nebo MAX?