Có nhiều cách khác để làm điều đó. Nó phụ thuộc vào người bạn nghĩ sẽ đến sau chuỗi kết nối của bạn và loại quyền truy cập và cấp độ kỹ năng mà họ sẽ có. Chuỗi kết nối nằm ở đó, ở đâu đó, bất kể bạn cố giấu nó bằng cách nào.
Biết rằng chuỗi kết nối có thể bị tấn công, tôi luôn cho rằng nó sẽ bị tấn công và thực hiện các biện pháp phòng ngừa ở đầu bên kia.
Chúng tôi thực hiện một số việc ở phía cuối máy chủ DB để đảm bảo rằng ngay cả khi chuỗi kết nối được tổng hợp, dữ liệu vẫn an toàn.
- Người dùng được liên kết với chuỗi kết nối hầu như không có quyền trên máy chủ. Các quyền duy nhất mà họ có là THỰC HIỆN và KIỂM SOÁT trên SCHEMA có chứa các Quy trình được lưu trữ.
- Quyền truy cập duy nhất mà giao diện người dùng có là thông qua các thủ tục được lưu trữ. Chúng tôi không bao giờ cho phép giao diện người dùng gửi chuỗi SQL.
- Dữ liệu được lưu giữ trong một lược đồ riêng biệt hơn so với các dữ liệu thực thi, trong lược đồ DATA mà người dùng liên kết với chuỗi kết nối KHÔNG có quyền, họ không thể nhìn, ngửi hoặc chạm vào nó.
- Các thủ tục được lưu trữ ủy quyền quyền cho người dùng không đăng nhập có đủ quyền để thực thi quy trình. (VỚI THỰC HIỆN LÀ 'Người dùng không đăng nhập')
Đây là tất cả những gì chúng ta có thể làm. Chúng tôi không tìm ra cách nào để ngăn chuỗi kết nối bị lộ ở đâu đó.
Trả lời cho câu hỏi mà Alex hỏi bên dưới. (quá dài cho một nhận xét)
Ghi chú. Điều sau là dành cho MS SQL Server, nó có thể áp dụng cho các hệ thống DBMS khác nhưng tôi không thể bảo đảm cho bất kỳ hệ thống nào khác.
Cơ sở dữ liệu chứa lược đồ, lược đồ chứa các đối tượng cơ sở dữ liệu như bảng, dạng xem, thủ tục được lưu trữ. Ví dụ:schmea cho phép bạn loại bỏ các đối tượng cơ sở dữ liệu, nếu bạn có một nhóm các bảng mà bất kỳ ai cũng được phép xem, thì chúng có thể đưa vào một lược đồ COMMON, nếu bạn có thông tin về bảng lương mà bạn cần bảo mật, bạn có thể đặt đó vào một lược đồ PAYROLL. Sau đó, bạn có thể đặt các biện pháp bảo mật khác nhau trên SCHEMA dựa trên loại đối tượng bên trong chúng. Về mặt đồ họa, chúng trông giống như các thư mục trên ổ cứng và bên dưới chúng là tất cả các đối tượng cơ sở dữ liệu mà chúng chứa. Khi bạn kích hoạt máy chủ của mình, có một số giản đồ được tạo tự động. Cái mà bạn quen thuộc nhất sẽ là DBO schmea. Bạn có thể không biết điều đó nếu quản trị viên của bạn đã thiết lập nó làm giản đồ mặc định của bạn.
Những gì chúng tôi làm là đặt tất cả dữ liệu vào một DATA schmea, điều này có nghĩa là chỉ cho phép các bảng. Vì vậy, nếu chúng ta có một cơ sở dữ liệu bảng lương thì các bảng dữ liệu sẽ đi vào một lược đồ được gọi là dataPayroll.
Thủ tục được lưu trữ là một khối hoặc các khối mã SQL mà máy chủ Cơ sở dữ liệu có thể chạy khi được gọi. Nó có thể trả về một Bảng dữ liệu hoặc một giá trị duy nhất. Hãy coi nó như một phương thức trong C #.
Các thủ tục đã lưu trữ có các tham số đầu vào và trả về được sử dụng trong mã SQL. Các thủ tục được lưu trữ được phân cực là một biện pháp bảo vệ mạnh mẽ chống lại các cuộc tấn công SQL Injection.
Protocal của chúng tôi nói rằng các Thủ tục và Chế độ xem được Lưu trữ đều được lưu trữ trong một lược đồ đứng trước 'prog'. Vì vậy, trong trường hợp của cơ sở dữ liệu bảng lương, tất cả các đối tượng không phải là dữ liệu đều nằm trong lược đồ progPayroll.
Người dùng được xác định bởi chuỗi Kết nối khi đó chỉ có quyền Kiểm soát và Thực thi trên Lược đồ ‘prog’. Điều này cho phép họ gọi Thủ tục được lưu trữ. Người dùng được xác định bởi chuỗi Kết nối bị từ chối tất cả các quyền khác. Người dùng này cũng bị từ chối TẤT CẢ quyền ở mọi nơi khác. Trong thủ tục Đã lưu trữ, quyền truy cập dữ liệu được ủy quyền cho người dùng KHÔNG ĐĂNG NHẬP có quyền truy xuất dữ liệu từ lược đồ ‘dữ liệu’ bằng lệnh EXECUTE AS.
KHÔNG có sql trong giao diện người dùng. Tất cả những gì mà các lập trình viên front end biết là tên của các thủ tục được lưu trữ là gì, các tham số cũng như kiểu trả về và giá trị.
Bằng cách này, ngay cả khi kẻ tấn công cố gắng loại bỏ chuỗi kết nối khỏi chương trình của bạn, chúng vẫn còn rất nhiều việc phải làm để có thể thực hiện bất kỳ điều gì với cơ sở dữ liệu của bạn vì người dùng mà chúng có thể chỉ thực hiện một Thủ tục được lưu trữ.
Nếu bạn không biết bất kỳ thứ nào trong số này là gì thì bạn thực sự cần nhờ một lập trình viên DB thiết lập hệ thống cho bạn.