Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

SQL SERVER - Một mẹo xử lý SQL động để tránh tấn công SQL Injection?

SQL Server có quá nhiều thứ để tìm hiểu và tôi luôn thấy nó thật tuyệt vời. Các cuộc trò chuyện của tôi với khách hàng thường đưa ra các câu hỏi bảo mật, đặc biệt là xung quanh SQL Injection. Nhiều người đã tuyên bố rằng SQL Injection là một sự cố của SQL Server. Phải mất khá nhiều thời gian để tôi cho họ biết không có gì về SQL Server và SQL Injection. SQL Injection là kết quả của việc thực hành mã hóa sai. Một trong những khuyến nghị tôi đưa ra là không sử dụng SQL động. Có thể có một số tình huống mà bạn không thể tránh được. Lời khuyên duy nhất của tôi là, hãy tránh nếu có thể. Trong blog này, tôi sẽ trình bày sự cố SQL Injection do SQL động và một giải pháp khả thi mà bạn có thể có.

Giả sử rằng chúng ta có một trang tìm kiếm đơn giản nơi người dùng có thể sử dụng tìm kiếm trống hoặc cung cấp bộ lọc trong bất kỳ trường nào. Chúng tôi đã cung cấp hai trường để sử dụng "Tên" và "Họ". Người dùng gõ một cái gì đó và nhấn tìm kiếm. Đây là mã quy trình được lưu trữ của chúng tôi sẽ kích hoạt sau hiện trường.

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

Nếu tôi sử dụng chuỗi này để thực thi trong họ ”; thả bảng t1–

EXEC search_first_or_last '%K%', ''';drop table t1--'

Chuỗi động sẽ là

SELECT FirstName, MiddleName, LastName FROM Person.
Person WHERE 1 = 1 AND FirstName LIKE '%K%' AND LastName LIKE '';DROP TABLE t1--'

Bạn có thấy vấn đề không? Có, người dùng có thể bỏ bảng t1 nếu mã đang chạy trong tài khoản đặc quyền cao.

Một trong những giải pháp của vấn đề là sử dụng sp_executesql. Đây là phiên bản tốt hơn bằng cách sử dụng

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

Hy vọng bạn có thể sử dụng và triển khai trong dự án của mình. Bạn có đang sử dụng những kỹ thuật đơn giản này trong mã sản xuất của mình không? Bạn đã bao giờ gặp phải những vấn đề tương tự trong quá trình kiểm toán chưa? Hãy cho tôi biết về kiến ​​thức của bạn.


  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 tương đương STUFF () trong SQL Server là gì?

  2. Tạo người dùng mới trong MySQL và cấp cho nó toàn quyền truy cập vào một cơ sở dữ liệu

  3. Cách bật SSL / TLS cho MySQL trong Ubuntu

  4. Cách lấy dữ liệu tuần trước trong MySQL

  5. MySQL truy xuất biến từ Thủ tục được lưu trữ trong PHP PDO