Database relasional menggunakan SQL (Structured Query Language) untuk manipulasi data. Jika input pengguna tidak divalidasi, maka akan rawan terkena SQL Injection (SQLi).
Konsep Dasar
Database: Kumpulan tabel, views, stored procedures.
Table: Baris (Row) dan Kolom (Column).
Primary Key: Identifier unik untuk tiap baris.
Foreign Key: Relasi penghubung ke Primary Key di tabel lain.
SQL Injection (SQLi)
Terjadi saat penyerang memasukkan (inject) kode SQL berbahaya melalui input form atau URL parameter yang tidak disanitasi. Tujuannya untuk mencuri data, merusak data, atau bypass autentikasi.
Contoh SQLi pada Form Login
SELECT * FROM users WHERE username = '' OR '1'='1'; --' AND password = '...';
Kondisi '1'='1' selalu bernilai benar (tautology), sehingga penyerang dapat login tanpa password yang sah. Karakter -- mengabaikan teks setelahnya.
Pencegahan SQL Injection
Parameterized statements / Prepared statements: Memisahkan logika kode SQL dengan input pengguna. Input diperlakukan sebagai data murni, bukan perintah yang dapat dieksekusi.
Input validation & sanitization.
Least-privilege principle: Hak akses database hanya secukupnya.
🛠️ Language-specific Defenses
Setiap bahasa pemrograman memiliki cara tersendiri untuk mengamankan komunikasi dengan database:
Bahasa / Framework
Teknik Pertahanan (Prepared Statements & ORM)
PHP
Menggunakan PDO (PHP Data Objects) atau ekstensi MySQLi. Jangan lupa gunakan fungsi mysqli_real_escape_string jika memakai raw SQL.
Python (Django/Flask)
Memanfaatkan ORM (Object-Relational Mapping) seperti Django ORM atau SQLAlchemy yang secara otomatis memproteksi kueri.
Java (Spring)
Menggunakan JPA (Hibernate) atau interface PreparedStatement pada JDBC. Jangan gunakan Statement biasa.
Node.js (Express)
Memakai ORM libraries seperti Sequelize atau TypeORM.
C# (.NET)
Memakai Entity Framework atau class SqlParameter untuk raw SQL.
✔️ Maintaining Database Correctness (ACID)
Setiap operasi pada database (seperti transaksi bank) harus menjunjung tinggi prinsip ACID agar data tidak korup/hilang jika terjadi error atau mati lampu.
Prinsip ACID
Atomicity:"All or nothing". Seluruh operasi dalam satu transaksi harus sukses semua. Jika salah satu gagal, maka semuanya dibatalkan (rollback). Tidak boleh ada pembaruan parsial.
Consistency: Memastikan database bertransisi dari satu "keadaan yang valid" ke "keadaan valid lainnya" tanpa merusak integritas/aturan struktur.
Isolation: Transaksi yang berjalan bersamaan tidak boleh saling mengganggu. Setiap transaksi harus seolah-olah berjalan sendirian (terisolasi).
Durability: Perubahan data bersifat permanen dan dijamin tetap ada setelah di-commit, bahkan jika terjadi kerusakan sistem (mati listrik/crash).
🚦 Managing Activity Concurrency
Konkurensi adalah kemampuan DBMS menangani banyak proses transaksi di waktu yang bersamaan. Namun, hal ini dapat menimbulkan anomali (masalah):
4 Anomali Konkurensi
Dirty Reads: Membaca data yang belum di-commit oleh transaksi lain (transaksi lain itu kemudian di-rollback). Akibatnya data menjadi tidak konsisten.
Non-repeatable reads: Transaksi membaca satu baris dua kali, tapi hasilnya berbeda karena transaksi lain diam-diam telah mengubah isi baris tersebut.
Phantom reads: Transaksi membaca sekumpulan baris dengan kondisi tertentu, namun transaksi lain menghapus atau menambah baris baru sehingga jumlah baris yang cocok berubah.
Lost updates: Dua transaksi menimpa data yang sama, dan salah satu pembaruan tertimpa (hilang) begitu saja tanpa terdeteksi.
Isolation Levels (Level Isolasi)
Solusi untuk mengatasi anomali di atas (dari yang paling renggang ke paling ketat):
Level Isolasi
Mencegah Anomali
Read uncommitted
Tidak mencegah apapun. (Paling cepat, tapi bahaya).
Read committed
Mencegah Dirty Read.
Repeatable Read
Mencegah Dirty Read & Non-repeatable read.
Serializable
Mencegah SEMUANYA. Mengunci tabel seolah berjalan satu per satu berurutan. (Aman, tapi paling lambat dan rawan Deadlock).
🔑 RBAC Security in DBMS
Role-Based Access Control (RBAC) adalah metode mengatur akses pengguna berdasarkan "Peran" (Role) mereka dalam perusahaan, bukan satu-satu per individu.
Inti Konsep: Mengelompokkan hak akses (privileges) ke dalam sebuah Role (contoh: Role "Manager"), lalu mengarahkan User ke Role tersebut.
Policy Administration: Administrator dapat membuat, mengubah, dan menghapus Roles dari satu tempat terpusat.
Dynamic Assignment: User bisa ditugaskan ke Role secara sementara (misal saat masuk "Project Team") lalu kembali ke Role awal setelah selesai.
Manfaat: Memastikan user hanya memiliki permission yang benar-benar dibutuhkan (Least Privilege) untuk meminimalisir dampak jika terjadi peretasan (breach).
🔒 Encryption in DBMS
Melindungi kerahasiaan (confidentiality) data dengan mengubahnya menjadi format acak/kriptografi yang tidak bisa dibaca tanpa kunci (key).
Data-at-rest encryption: Mengenkripsi data saat disimpan di dalam disk (storage/SSD). Dibuka/didekripsi hanya pada saat data tersebut diakses.
Data-in-transit encryption: Mengamankan data saat dikirim lewat jaringan (network) dari aplikasi ke database (contoh: SSL/TLS).
Key Management: Kunci enkripsi harus dipisah dan dikelola jauh dari file database itu sendiri. Termasuk kebijakan seperti melakukan rotasi kunci secara berkala untuk membatasi resiko jika kunci bocor.
📌 Poin-Poin Penting (WAJIB DIHAPAL)
✅ Ringkasan Kunci untuk UAS
Prepared Statements (Parameterized Queries): Cara paling ampuh untuk mencegah SQL Injection karena input user dianggap sebagai data murni, bukan kueri.
ACID - Atomicity: All-or-nothing. Tidak boleh ada partial updates.
ACID - Consistency: Merubah database dari state valid ke state valid lainnya.
ACID - Isolation: Transaksi tidak boleh membaca perubahan yang belum di-commit (mencegah Dirty Read).
ACID - Durability: Bertahan dari kerusakan sistem/listrik (crashes).
Phantom Read: Baris data bertambah/berkurang tiba-tiba (query klausa WHERE menghasilkan jumlah baris yang berbeda).
Lost Update: Update dari dua transaksi saling menimpa tanpa disadari.
RBAC (Role-Based Access Control): Mengelompokkan permission ke dalam role. (Policy Administration = Admin kelola dari pusat, Dynamic = sementara masuk tim proyek).
Encryption at rest: Data di disk terenkripsi. Key management wajib dipisah penyimpanannya dan di-rotasi secara rutin.
🧠 TIPS MENGHAFAL — Bab 1: Database Security
"ACID itu ASID" Atomicity = All-or-nothing (barengan semua, atau batal semua). Consistency = Valid to Valid (sesuai aturan). Isolation = Jangan ngintip yg belom jadi (cegah Dirty read). Durability = Tahan banting (Aman biarpun server mati/crash).
"SQLi = Si Param" → Obat sakit SQL Injection adalah "Parameterized Statements / Prepared Statements". Dia memisahkan kode dan input (dianggap sebagai data).
"Dirty, Non-Rep, Phantom, Lost" - Dirty Read = Baca data kotor (belum di commit). - Non-Repeatable = Data yang sama dibaca dua kali isinya berubah. - Phantom = Tiba-tiba ada baris hantu baru (jumlah nambah/kurang karena WHERE). - Lost Update = Ketiban (Saling nabrak update).
"RBAC = Grup Peran" → Bukannya ngatur user satu-satu (capek), tapi bikin GRUP/ROLE (Admin, User), terus usernya dimasukin ke Role itu. Policy Admin = Pusat kontrol. Dynamic = Pindah role sementara.
"Kunci Jangan Ditaro di Bawah Keset" → Key Management untuk Encryption: Kuncinya harus dipisah dari database, dan harus sering-sering dirotasi (diganti) biar aman.
📝 Contoh Soal & Jawaban
Contoh Soal 1
Manakah yang paling ampuh mencegah SQL Injection?
A. Mengganti semua database ke NoSQL
B. Enkripsi disk pada server database
C. Menggunakan Parameterized statements
D. Hash fungsi satu arah pada seluruh tabel
Jawaban: C — Parameterized statements mencegah input dianggap sebagai kode SQL.
Contoh Soal 2
Sebuah transaksi dibatalkan karena mati lampu, lalu saat dinyalakan tidak ada satupun perubahan yang masuk. Ini merupakan bukti dari sifat ACID apa?
A. Atomicity B. Consistency C. Isolation D. Durability
Jawaban: A — Atomicity menjamin all-or-nothing (tidak ada perubahan parsial jika terjadi kegagalan sebelum commit).
🎮 Latihan Soal Interaktif — Bab 1: Database Security
Kerjakan 20 soal berikut berdasarkan Quiz 8, lalu klik Submit untuk melihat hasilnya.