Tuesday, June 24, 2014

Menggunakan ADO.NET Parameter

Seringkali saya menjumpai developer menggunakan string concatenation seperti ini untuk melakukan query ke database.

conn.Open();
using(var cmd = conn.CreateCommand())
{
  cmd.CommandText = "select * from employee where kode='" + txtUserName.Text + "'";
  var reader = cmd.ExecuteReader();
  if(reader.Read()) 
  {
     //bla bla bla
  }
}
Code di atas (untuk kondisi tertentu) memang dapat dijalankan dengan baik, dan saya akui kadang sayapun melakukan hal tersebut (karena kepepet deadline).

Sebenarnya code di atas punya celah keamanan yang kurang baik, yaitu sangat rentan dengan serangan SQL Injection.  Selain itu code di atas tidak dapat menerima input pada txtUserName.Text yang mengandung single quote.

Saya tidak akan membahas lebih detail tentang SQL Injection di sini, melainkan saya mengajukan solusi untuk menghindari penggunaan string concatenation seperti contoh di atas, yaitu dengan menggunakan ADO.NET Parameter.

 

Keuntungan penggunaan ADO.NET Parameter ini adalah:

1. Code yang kita tulis terbebas dari celah keamanan SQL Injection

2. Input parameter dapat berupa teks yang mengandung single quote (‘) maupun double quote(“).

 

Cara penggunaan ADO.NET Parameter, adalah dengan menggunakan collection property Parameters dari object Command.

Berikut contoh di atas yang ditulis ulang dengan menggunakan ADO.NET Parameter:

 


conn.Open();
using(var cmd = conn.CreateCommand())
{
  cmd.CommandText = "select * from employee where kode=@kodeuser";
  cmd.Parameters.AddWithValue("@kodeuser", txtUserName.Text);
  var reader = cmd.ExecuteReader();
  if(reader.Read())
  {
    // bla bla bla
  }
}

Perhatikan penggunaan method AddWithValue pada contoh di atas:


  1. Parameter pertama dari method tersebut adalah nama parameter yang digunakan di dalam query SQL, dan parameter kedua adalah value yang ingin diberikan ke dalam query.

  2. Setiap parameter di dalam query menggunakan prefix @

Kita dapat memberikan lebih dari 1 parameter dalam sebuah query, asalkan semua nama parameter diawali dengan simbol @.