Belajar .NET - Secure Coding Practices
Series/Belajar .NET/Episode 13
Episode 13 of 23

Belajar .NET - Secure Coding Practices

Episode ini mengubah cara kalian menulis kode yang aman: input validation, output encoding, pencegahan SQL injection, XSS, dan CSRF, pengamanan data sensitif, serta best practices keamanan yang diterapkan sejak hari pertama pengembangan.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

Episode 12 mengamankan transportasi dan identitas; episode 13 mengamankan kode itu sendiri. Secure coding adalah disiplin menulis kode yang kebal terhadap pola serangan umum — bukan fitur yang ditambahkan di akhir, melainkan kebiasaan yang melekat di setiap baris.

Kalian akan belajar validasi input, encoding output, pencegahan injection, XSS, dan CSRF, pengelolaan data sensitif, serta praktik produksi yang diterapkan tim keamanan profesional. Banyak dari praktik ini sudah disediakan framework — tugas kalian adalah tidak menonaktifkannya.

Input Validation dan Output Encoding

Validasi di Boundary

Aturan emas: jangan pernah percaya input. Validasi di setiap batas sistem — API, file impor, dan form. Gunakan DataAnnotations yang sudah terpasang:

Validasi model binding
public class RegisterRequest
{
    [Required, EmailAddress]
    public string Email { get; set; }
 
    [Required, MinLength(8)]
    public string Password { get; set; }
}

[EmailAddress] dan [MinLength(8)] memvalidasi input saat model binding. Dengan [ApiController], model yang tidak valid otomatis menghasilkan respons 400 — kalian tidak perlu menulis pemeriksaan manual.

Output Encoding

Output yang mengandung input pengguna harus di-encoding agar tidak menjadi markup. Di Razor (Blazor dan MVC), encoding dilakukan otomatis:

Encoding di Razor
@{
    var nama = HttpUtility.HtmlEncode(userInput);
}
<p>Halo, @nama</p>

HttpUtility.HtmlEncode(userInput) mengubah karakter berbahaya menjadi entitas HTML yang aman. Aturan sederhana: context menentukan encoding — HTML di Razor, SQL di query, URL di header. Encode sesuai konteks tempat data dikeluarkan.

Mencegah Injection, XSS, dan CSRF

SQL Injection

SQL injection terjadi saat input digabungkan langsung ke string SQL. Selalu parameterize:

Query terparameterisasi
var hasil = await _db.Produk
    .FromSqlRaw("SELECT * FROM Produk WHERE Nama = {0}", nama)
    .ToListAsync();

Placeholder {0} mengirim nama sebagai parameter, bukan bagian dari query — database memperlakukannya sebagai data murni. Jangan pernah menggabungkan variabel langsung ke string SQL, misalnya seperti contoh berbahaya berikut:

Pola yang berbahaya
var sql = $"SELECT * FROM Produk WHERE Nama = '{nama}'";

Pola di atas rentan SQL injection karena nilai pengguna ditempel langsung ke query. Sebagai gantinya, selalu kirim nilai sebagai parameter, seperti yang dilakukan FromSqlRaw dengan placeholder. Prinsip yang sama berlaku untuk raw ADO.NET: gunakan SqlParameter.

XSS dan CSRF

XSS (Cross-Site Scripting) terjadi saat script disuntikkan ke halaman. Pencegahannya adalah output encoding, yang sudah otomatis di Razor. CSRF (Cross-Site Request Forgery) memaksa pengguna mengirim request tak dikehendaki. Framework menyediakan anti-forgery token:

Aktifkan anti-forgery
builder.Services.AddAntiforgery(options =>
{
    options.HeaderName = "X-CSRF-TOKEN";
});

AddAntiforgery menyediakan token yang diverifikasi untuk permintaan yang mengubah state. Token dikirim lewat header X-CSRF-TOKEN dan divalidasi middleware — memastikan request benar-benar berasal dari pengguna yang disetujui.

Mencegah Kebocoran Data Sensitif

Jangan Log Rahasia

Kebocoran paling umum bukan karena peretasan, tetapi karena log dan response menampilkan data sensitif. Perhatikan titik-titik berikut:

  • Jangan log header Authorization atau body request penuh.
  • Jangan mengembalikan password atau token dalam respons API.
  • Cegah sensitive data muncul di stack trace yang diteruskan ke klien.
  • Gunakan DTO untuk membatasi field yang diekspos.
Menyembunyikan data sensitif
public record UserDto(int Id, string Nama, string Email);
 
var dto = userList.Select(u => new UserDto(u.Id, u.Nama, u.Email));

Memetakan entitas ke DTO memastikan hanya field yang diperlukan yang dikirim ke klien — entitas dengan property internal tidak pernah bocor secara tidak sengaja.

Secure Storage dengan Data Protection API

Melindungi Data Saat Rest

Data Protection API dari episode 12 juga dipakai untuk menyimpan rahasia di database:

Menyimpan data terenkripsi
var protectedToken = protector.Protect(accessToken);
 
await _db.ApiTokens.AddAsync(new ApiToken
{
    UserId = userId,
    TokenEnkripsi = protectedToken
});

Simpan hasil Protect alih-alih token asli. Kunci enkripsi dikelola runtime dan bisa dipersistensikan ke key ring. Untuk password, gunakan algoritma hashing khusus password seperti PBKDF2 atau bcrypt melalui ASP.NET Core Identity — jangan memakai enkripsi reversible.

Best Practices Produksi

Checklist Sebelum Rilis

Beberapa praktik yang wajib diperiksa sebelum production:

  • Setel ASPNETCORE_ENVIRONMENT=Production dan nonaktifkan developer exception page.
  • Aktifkan HTTPS dan HSTS; cek sertifikat valid.
  • Terapkan rate limiting untuk mencegah brute force.
  • Audit dependency dengan dotnet list package --vulnerable.
  • Enkripsi rahasia di config; jangan pernah commit.
Scan dependency rentan
dotnet list package --vulnerable

dotnet list package --vulnerable memeriksa paket NuGet terhadap database kerentanan yang diketahui. Jalankan sebagai bagian rutin CI agar dependency yang bermasalah tertangkap sebelum rilis.

Tip

Keamanan adalah proses, bukan produk. Rutin scan, code review, dan update dependency adalah bagian dari siklus hidup setiap aplikasi .NET.

Ringkasan Praktik Secure Coding

  • Validasi semua input di boundary dengan DataAnnotations.
  • Encode output sesuai konteksnya: HTML, SQL, atau URL.
  • Parameterize semua query database.
  • Aktifkan anti-forgery untuk request yang mengubah state.
  • Ekspos hanya field yang diperlukan lewat DTO.
  • Enkripsi rahasia saat penyimpanan; hash password dengan algoritma khusus.

Penutup

Inti yang harus dibawa pulang:

  • Jangan percaya input; validasi di setiap batas sistem.
  • Output di-encode sesuai konteks untuk mencegah XSS.
  • Parameterization mencegah SQL injection.
  • Anti-forgery token melindungi dari CSRF.
  • DTO membatasi field yang diekspos dan mencegah kebocoran.
  • Data Protection API dan hashing password menjaga data saat rest.
  • Jalankan audit dependency secara rutin di CI.

Di episode 14 selanjutnya kita akan membahas asynchronous programming dan concurrency — pola task-based dengan async/await, Task dan ValueTask, cancellation tokens, parallel programming dengan Parallel.For dan Channels, serta thread safety dan synchronization primitives.

Belajar .NET - Secure Coding Practices | Belajar .NET