Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

SQL SERVER – Salah Satu Trik Menangani SQL Dinamis untuk Menghindari Serangan Injeksi SQL?

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MYSQL mengimpor data dari csv menggunakan LOAD DATA INFILE

  2. Menginstal Percona XtraDB Cluster di CentOS 7

  3. 1064 kesalahan dalam CREATE TABLE ... TYPE=MYISAM

  4. Permintaan lambat saat menggunakan ORDER BY

  5. MySQL, Dapatkan peringkat pengguna