Chúng tôi đang làm việc trên một ứng dụng web, trong đó (trong số các tính năng khác) người dùng của chúng tôi có thể tải lên các tệp của họ. Tuy nhiên, chúng tôi không thể lưu trữ các tệp này trên VPS của mình vì dung lượng lưu trữ bị hạn chế, vì vậy chúng tôi đã quyết định sử dụng S3.
Vấn đề chính là chúng tôi phải đảm bảo người dùng chỉ có thể truy cập dữ liệu của riêng họ. Vì vậy, chúng tôi giữ danh sách các tệp trong cơ sở dữ liệu của chúng tôi và danh sách người dùng có quyền truy cập vào chúng. Máy chủ của chúng tôi có thể dễ dàng quyết định xem người dùng có quyền truy cập vào tệp hay không. Nhưng làm thế nào để thực sự phục vụ các tập tin cho người dùng?
Có một số khả năng tôi đã xem xét, tuy nhiên không có khả năng nào trong số chúng thực sự là tốt nhất.
1. Tạo (hết hạn) các url đã ký với PHP
Đây là một cách tiếp cận thực sự đơn giản, nó cũng nhanh nhưng kết quả là các url rất rất xấu xí và dài.
2. URL bị che khuất
Điều này có nghĩa là, chúng tôi giữ các tệp công khai để đọc trên S3, nhưng tất cả các tệp được lưu trữ trong các thư mục có tên khó đoán như : 24fa0b8ef0ebb6e99c64be8092d3ede20000
. Tuy nhiên, có lẽ đây không phải là cách an toàn nhất để đi. Ngay cả khi bạn không bao giờ có thể đoán tên thư mục, sau khi bạn biết nó (vì bạn thực sự có quyền truy cập vào nó), bạn có thể chia sẻ liên kết đó với bất kỳ ai (với bất kỳ người nào không được ủy quyền).
3. Tải tập tin qua máy chủ của chúng tôi
Điều này có nghĩa là các tệp không được S3 phục vụ trực tiếp, nhưng trước tiên máy chủ của chúng tôi sẽ đọc nó một cách an toàn và phục vụ nó. Chúng tôi thực sự không muốn điều này :)
4. Kiểm tra người giới thiệu
Các bị xáo trộn URL giải pháp có thể được cải thiện bằng "đảm bảo" yêu cầu đến từ máy chủ của chúng tôi (bạn có thể thiết lập S3 để kiểm tra tham chiếu). Tuy nhiên đây sẽ là một giải pháp rất không đáng tin cậy, bởi vì không phải tất cả các trình duyệt đều gửi dữ liệu giới thiệu và nó cũng có thể bị làm giả.
Cách tốt để phục vụ các tệp từ Amazon S3 an toàn cho các khách hàng khác nhau là gì?