SQL Server memiliki banyak hal untuk dipelajari dan saya selalu menganggapnya luar biasa. Percakapan saya dengan pelanggan sering kali muncul dengan pertanyaan keamanan terutama seputar SQL Injection. Banyak yang mengklaim SQL Injection adalah masalah SQL Server. Butuh beberapa waktu bagi saya untuk memberi tahu mereka bahwa tidak ada apa-apa tentang SQL Server dan SQL Injection. SQL Injection adalah hasil dari praktik pengkodean yang salah. Salah satu rekomendasi yang saya berikan adalah tentang tidak menggunakan Dynamic SQL. Mungkin ada beberapa situasi di mana Anda tidak dapat menghindarinya. Satu-satunya saran saya adalah, hindari jika memungkinkan. Di blog ini, saya akan mendemonstrasikan masalah SQL Injection karena SQL dinamis dan solusi yang mungkin Anda miliki.
Mari kita asumsikan bahwa kita memiliki halaman pencarian sederhana di mana pengguna dapat menggunakan pencarian kosong atau menyediakan filter di bidang apa pun. Kami telah menyediakan dua bidang untuk menggunakan "Nama Depan" dan "Nama Belakang". Pengguna mengetik sesuatu dan menekan pencarian. Berikut adalah kode prosedur tersimpan kami yang dijalankan di belakang layar.
USE AdventureWorks2014 GO CREATE PROCEDURE search_first_or_last @firstName NVARCHAR(50) ,@lastName NVARCHAR(50) AS BEGIN DECLARE @sql NVARCHAR(4000) SELECT @sql = ' SELECT FirstName ,MiddleName, LastName' + ' FROM Person.Person WHERE 1 = 1 ' IF @firstName IS NOT NULL SELECT @sql = @sql + ' AND FirstName LIKE ''' + @firstName + '''' IF @lastName IS NOT NULL SELECT @sql = @sql + ' AND LastName LIKE ''' + @lastName + '''' EXEC (@sql) END
Jika saya menggunakan string ini untuk mengeksekusi nama belakang ”;drop table t1–
EXEC search_first_or_last '%K%', ''';drop table t1--'
String dinamis akan menjadi
SELECT FirstName, MiddleName, LastName FROM Person. Person WHERE 1 = 1 AND FirstName LIKE '%K%' AND LastName LIKE '';DROP TABLE t1--'
Apakah Anda melihat masalahnya? Ya, pengguna dapat menghapus tabel t1 jika kode berjalan di bawah akun dengan hak istimewa tinggi.
Salah satu solusi dari masalah tersebut adalah dengan menggunakan sp_executesql. Ini adalah versi yang lebih baik menggunakan
CREATE PROCEDURE search_first_or_last @firstName NVARCHAR(50) ,@lastName NVARCHAR(50) AS BEGIN DECLARE @sql NVARCHAR(4000) SELECT @sql = ' SELECT FirstName , MiddleName, LastName' + ' FROM Person.Person WHERE 1 = 1 ' IF @firstName IS NOT NULL SELECT @sql = @sql + ' AND FirstName LIKE @firstName' IF @lastName IS NOT NULL SELECT @sql = @sql + ' AND LastName LIKE @lastName ' EXEC sp_executesql @sql ,N'@firstName nvarchar(50), @lastName nvarchar(50)' ,@firstName ,@lastName END
Semoga Anda dapat menggunakan ini dan mengimplementasikannya dalam proyek Anda. Apakah Anda menggunakan teknik sederhana ini dalam kode produksi Anda? Apakah Anda pernah menghadapi masalah serupa selama audit? Beri tahu saya tentang pembelajaran Anda.