Chúng ta vẫn nên sử dụng QUOTENAME để bảo vệ khỏi các cuộc tấn công tiêm chích?


9

Tôi đã xem xét một thủ tục lưu trữ cũ ngày hôm nay và nhận thấy nó đang sử dụng quotenametrên các tham số đầu vào. Sau khi thực hiện một số hoạt động đào để tìm ra chính xác điều gì tôi đã xem qua trang web này . Bây giờ tôi đã hiểu những gì nó làm và làm thế nào để sử dụng nó nhưng trang web nói rằng nó được sử dụng như một sự giảm thiểu từ các cuộc tấn công SQL Injection. Khi tôi sử dụng để phát triển các ứng dụng truy vấn trực tiếp cơ sở dữ liệu, sử dụng asp.net, tôi sẽ sử dụng các tham số ADO.Net để chuyển đầu vào của người dùng dưới dạng giá trị bằng chữ và không bao giờ thực sự lo lắng về việc bảo vệ nó trong các thủ tục được lưu trữ của mình.

Bây giờ tôi đang viết một thủ tục được lưu trữ sẽ được sử dụng bởi các ứng dụng mà tôi không viết nên tôi cần phải thử và bảo vệ khỏi các cuộc tấn công tiêm chích ở cấp thủ tục, là quotenamecách tốt nhất để làm điều này hoặc có chức năng mới hơn / tốt hơn phương pháp?

Mã đã đưa tôi vào mẫu suy nghĩ này ( @parm1là một tham số đầu vào của người dùng):

'SELECT project [Project], project_desc [Description], 
        customer [Customer], cpnyid [Company]
FROM PJPROJ (nolock)
where project like ' + quotename(@parm1,'''') + '

Câu trả lời:


17

Có, mọi thứ không thay đổi nhiều trong lĩnh vực này, bạn nên sử dụng quotenamecho bất kỳ tên đối tượng máy chủ SQL nào được sử dụng trong SQL động (đặc biệt nếu chúng được cung cấp bên ngoài vào mã của bạn). Cũng như giảm thiểu tiêm SQL, điều này cũng có nghĩa là mã của bạn sẽ hoạt động chính xác cho các tên định danh không chuẩn.

Hàm chỉ thích hợp cho tên đối tượng (ví dụ: bảng, cột, tên cơ sở dữ liệu).

Bạn nên thử và tham số hóa mọi thứ khác và sử dụng sp_executesql, chuyển các tham số thay vì nối các tham số đó vào chuỗi truy vấn.

Bài viết dứt khoát về chủ đề này vẫn là Lời nguyền và phước lành của SQL động


Biên tập. Bây giờ bạn đã cung cấp mã tôi thấy nó đang truyền tham số thứ hai 'để thêm các trích dẫn bên ngoài và thoát khỏi bất kỳ dấu ngoặc đơn nào bằng cách nhân đôi chúng lên trước khi đưa chúng vào chuỗi. Đây không phải là một cách sử dụng tốt của tên. Nó sẽ thất bại (trả về null) nếu chuỗi lớn hơn 128 ký tự.

Ngoài ra, nó vẫn có thể để lại các khả năng tiêm SQL nếu chuỗi chứa U + 02BC thay vì dấu nháy đơn tiêu chuẩn và sau đó chuỗi được gán cho một varchar sau khi vệ sinh ( nơi nó có thể âm thầm được chuyển đổi thành dấu nháy đơn thông thường )

Cách chính xác để làm điều này là để tham số truy vấn. Và sau đó chuyển @parm1giá trị vàosys.sp_executesql

DECLARE @Sql NVARCHAR(MAX);

SET @Sql = '
SELECT project      [Project],
       project_desc [Description],
       customer     [Customer],
       cpnyid       [Company]
FROM   PJPROJ (nolock)
WHERE  project LIKE @parm1 
';

EXEC sys.sp_executesql
  @Sql,
  N'@parm1 varchar(100)',
  @parm1 = 'foobar%'; 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.