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

Làm cách nào để chuyển tên bảng vào proc được lưu trữ?

Trước hết, bạn nên KHÔNG BAO GIỜ thực hiện các tổ hợp lệnh SQL trên ứng dụng khách như thế này, đó là SQL Injection là gì. (Tốt cho một công cụ quản trị không có priv của riêng nó, nhưng không tốt cho một ứng dụng sử dụng chung).

Thứ hai, có, một lệnh gọi được tham số hóa tới một thủ tục Đã lưu trữ vừa sạch hơn vừa an toàn hơn.

Tuy nhiên , vì bạn sẽ cần sử dụng SQL động để thực hiện việc này, bạn vẫn không muốn đưa chuỗi đã truyền vào văn bản của truy vấn được thực thi. Thay vào đó, bạn muốn sử dụng chuỗi đã truyền để tra cứu tên của thực tế bảng mà người dùng nên được phép truy vấn theo cách này.

Đây là một ví dụ đơn giản dễ hiểu:

CREATE PROC spCountAnyTableRows( @PassedTableName as NVarchar(255) ) AS
-- Counts the number of rows from any non-system Table, *SAFELY*
BEGIN
    DECLARE @ActualTableName AS NVarchar(255)

    SELECT @ActualTableName = QUOTENAME( TABLE_NAME )
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME = @PassedTableName

    DECLARE @sql AS NVARCHAR(MAX)
    SELECT @sql = 'SELECT COUNT(*) FROM ' + @ActualTableName + ';'

    EXEC(@SQL)
END

Một số đã hỏi khá lý do tại sao điều này lại an toàn hơn. Hy vọng rằng, Bobby Tables nhỏ có thể làm rõ hơn điều này:0

Câu trả lời cho các câu hỏi khác:

  1. Riêng QUOTENAME không được đảm bảo an toàn. MS khuyến khích chúng tôi sử dụng nó, nhưng họ không đưa ra đảm bảo rằng nó không thể bị tin tặc báo cáo. FYI, An ninh thực sự là tất cả về sự đảm bảo. Tra cứu bảng với QUOTENAME, là một câu chuyện khác, không thể phá vỡ được.

  2. QUOTENAME không hoàn toàn cần thiết cho ví dụ này, bản dịch Tra cứu trên INFORMATION_SCHEMA thường là đủ. QUOTENAME có mặt ở đây bởi vì nó là một hình thức tốt để bảo mật bao gồm một giải pháp hoàn chỉnh và chính xác. QUOTENAME ở đây thực sự đang bảo vệ chống lại một vấn đề tiềm ẩn khác biệt, nhưng tương tự, được gọi là tiêm tiềm ẩn .

Tôi nên lưu ý rằng bạn có thể làm điều tương tự với Tên cột động và INFORMATION_SCHEMA.COLUMNS bàn.

Thay vào đó, bạn cũng có thể bỏ qua nhu cầu về các thủ tục được lưu trữ bằng cách sử dụng truy vấn SQL được tham số hóa (xem tại đây:https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlcommand.parameters?view=netframework-4.8). Nhưng tôi nghĩ rằng các thủ tục được lưu trữ cung cấp một phương tiện bảo mật dễ quản lý hơn và ít lỗi hơn cho những trường hợp như thế này.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Có thể xảy ra va chạm GUID không?

  2. Cách kích hoạt XP của SQL Server Agent bằng T-SQL

  3. DAY () Ví dụ trong SQL Server (T-SQL)

  4. Cách sys.dm_exec_describe_first_result_set_for_object hoạt động trong SQL Server

  5. Thêm một bước công việc vào một công việc tác nhân SQL Server hiện tại (T-SQL)