Các lập trình viên chia sẻ những giải pháp thay thế an toàn hơn cho giao diện truy vấn SQL thô sau khi câu chuyện kinh hoàng lan truyền

Nhóm Cộng đồng BigGo
Các lập trình viên chia sẻ những giải pháp thay thế an toàn hơn cho giao diện truy vấn SQL thô sau khi câu chuyện kinh hoàng lan truyền

Một câu chuyện cảnh báo về cách một công cụ báo cáo đơn giản phát triển thành một dịch vụ SQL Injection nguy hiểm đã khơi dậy cuộc thảo luận sôi nổi trong cộng đồng lập trình viên về những cách an toàn hơn để cung cấp quyền truy cập trực tiếp vào cơ sở dữ liệu cho người dùng. Câu chuyện này, ghi lại quá trình biến đổi kéo dài một thập kỷ từ một trình tạo báo cáo cơ bản thành một hộp văn bản SQL mở, đã gây tiếng vang với nhiều người từng gặp phải những tình huống tương tự trong sự nghiệp của họ.

Ứng dụng ban đầu bắt đầu khá vô hại - một trang báo cáo điển hình nơi người dùng có thể nhập khoảng thời gian và từ khóa để tạo nhật ký lỗi thiết bị. Nhưng qua nhiều năm yêu cầu tính năng và các bản sửa lỗi nhanh, nó dần dần biến thành thứ gì đó nguy hiểm hơn nhiều: một giao diện web nơi người dùng có thể gõ trực tiếp các truy vấn SQL thô vào cơ sở dữ liệu.

Bảo mật cấp cơ sở dữ liệu: Nền tảng

Giải pháp được đề xuất phổ biến nhất tập trung vào quyền hạn cơ sở dữ liệu thích hợp thay vì các hạn chế cấp ứng dụng. Nhiều lập trình viên nhấn mạnh rằng các cơ sở dữ liệu hiện đại có hệ thống quản lý người dùng mạnh mẽ có thể hạn chế quyền truy cập chỉ đối với các thao tác chỉ đọc. Bằng cách tạo các người dùng cơ sở dữ liệu chuyên dụng chỉ có quyền SELECT trên các bảng hoặc view cụ thể, các tổ chức có thể loại bỏ hoàn toàn rủi ro sửa đổi dữ liệu.

Cách tiếp cận này đáng tin cậy hơn nhiều so với việc lọc dựa trên chuỗi, cố gắng chặn các từ khóa nguy hiểm như INSERT, UPDATE, hoặc DELETE. Những bộ lọc như vậy có thể dễ dàng bị vượt qua và không tính đến sự phức tạp của SQL hiện đại, bao gồm các stored procedure và function có thể có quyền hạn cao hơn.

Ngôn ngữ truy vấn có cấu trúc: Giải pháp trung gian

Một số lập trình viên đã chia sẻ kinh nghiệm với các ngôn ngữ truy vấn tùy chỉnh cung cấp tính linh hoạt mà không có những nguy hiểm của SQL thô. Những ngôn ngữ chuyên dụng này cho phép người dùng biểu đạt các truy vấn phức tạp bằng cú pháp đơn giản hóa được dịch thành SQL an toàn ở phía sau. Ví dụ, một truy vấn như name*~john emp_id>3000 có thể được phân tích và chuyển đổi thành SQL thích hợp với các kiểm tra an toàn tích hợp.

Cách tiếp cận này mang lại điều tốt nhất của cả hai thế giới - người dùng có kinh nghiệm có được tính linh hoạt họ cần, trong khi hệ thống vẫn duy trì quyền kiểm soát đối với những thao tác thực sự được thực hiện. Một số người chỉ ra các ví dụ hiện có như JQL ( Jira Query Language ) của Jira như những triển khai thành công của khái niệm này.

Công cụ chuyên dụng và môi trường riêng biệt

Thay vì xây dựng giao diện SQL tùy chỉnh, nhiều người đề xuất sử dụng các công cụ đã được thiết lập như DBeaver , Redash , hoặc các ứng dụng quản lý cơ sở dữ liệu tương tự. Những công cụ này được thiết kế đặc biệt cho việc truy vấn cơ sở dữ liệu và đi kèm với các tính năng bảo mật thích hợp, làm nổi bật cú pháp và quản lý người dùng được tích hợp sẵn.

Tại thời điểm này, sẽ dễ dàng hơn khi cung cấp cho người dùng quyền truy cập trực tiếp vào DBeaver hoặc Bigquery . Đồng thời hạn chế quyền truy cập của họ vào một số view nhất định với dữ liệu đã chuẩn bị để tránh các truy vấn tốn kém.

Một cách tiếp cận phổ biến khác liên quan đến việc tạo các môi trường phân tích riêng biệt với ảnh chụp cơ sở dữ liệu. Điều này cho phép các nhà phân tích chạy bất kỳ truy vấn nào họ muốn mà không gây rủi ro cho hệ thống sản xuất, mặc dù nó đòi hỏi cơ sở hạ tầng bổ sung và các quy trình đồng bộ hóa dữ liệu.

Phân tích và xác thực nâng cao

Đối với các tổ chức phải cung cấp quyền truy cập SQL thô, một số lập trình viên khuyên dùng các trình phân tích SQL thích hợp để xác thực truy vấn trước khi thực thi. Những công cụ này có thể phân tích cây cú pháp trừu tượng của truy vấn để đảm bảo chỉ các thao tác an toàn được thực hiện, cung cấp sự bảo vệ đáng tin cậy hơn nhiều so với việc khớp chuỗi đơn giản.

Tuy nhiên, cách tiếp cận này đòi hỏi chuyên môn kỹ thuật đáng kể và bảo trì liên tục khi các tiêu chuẩn SQL phát triển. Nó cũng không hoàn hảo - ngay cả các câu lệnh SELECT có thể gây ra vấn đề thông qua các join tốn kém hoặc các lời gọi function có tác dụng phụ.

Bài học cho phát triển hiện đại

Cuộc thảo luận tiết lộ một mô hình phổ biến trong phát triển phần mềm: những bản sửa lỗi nhanh có ý tốt tích lũy theo thời gian thành các lỗ hổng bảo mật nghiêm trọng. Câu chuyện gốc đóng vai trò như một lời nhắc nhở rằng mỗi sự thỏa hiệp nhỏ trong thiết kế hệ thống có thể dẫn đến những vấn đề lớn hơn nhiều về sau.

Sự đồng thuận giữa các lập trình viên có kinh nghiệm là rõ ràng: nếu người dùng cần quyền truy cập trực tiếp vào cơ sở dữ liệu, nó nên được cung cấp thông qua các công cụ thích hợp với các biện pháp bảo mật phù hợp, không phải thông qua các giao diện web tùy chỉnh với các cơ chế bảo vệ tạm thời.SQL Injection as a Service (SIAAS): Một thuật ngữ hài hước mô tả các ứng dụng web vô tình cho phép người dùng thực thi các truy vấn SQL tùy ý, về cơ bản cung cấp quyền truy cập tương tự như một cuộc tấn công SQL injection. Abstract Syntax Tree (AST): Biểu diễn cây của cấu trúc mã nguồn, được sử dụng bởi các trình phân tích để hiểu và xác thực ý nghĩa của mã trước khi thực thi.

Tham khảo: SQL Injection as a Feature