Bảo vệ file upload của người dùng với ví dụ website bán tranh

Tram Ho

Ngày nay việc mọi người mua những sản phẩm điện tử trên mạng diễn ra rất thường xuyên như hình ảnh, âm thanh, phần mềm, … . Và tất nhiên không phải ai muốn mình upload lên cái gì thì người khác cũng có thể tự do download file đó mà không ràng buộc có gì. Ví dụ như các trang web mua bán hình ảnh, âm thanh, …

Ví dụ chúng ta có 1 website bán tranh chẳng hạn, với các yêu cầu cơ bản như sau:

  • Người dùng có thể upload ảnh lên để bán
  • Người dùng có thể mua ảnh từ người khác
  • Người dùng có thể xem lại và download ảnh mà họ đã đã mua

Chúng ta sẽ xây dựng database với mối quan hệ như sau:

Trong ví dụ này chúng ta sẽ dùng paperclip cho việc upload file:

sau đó chạy bundle install.

Chúng ta sẽ đi nhanh các phần khởi tạo migration, và model:

Migration

Đừng quên chạy lệnh rails db:migrate

Model

Upload Ảnh

Trước khi người dùng có thể bán thì tất nhiên họ phải tải ảnh lên

Danh sách ảnh đã upload của người dùng

Mua hàng

Chúng tra cần tạo bản ghi PurchasedImage mới

Purchases Link

Chúng ta muốn xem những giao dịch mua hàng nào đã được thực hiện bởi người dùng

Vậy là chúng ta đã dựng xong phần khung của website. Và giờ người dùng có thể truy cập vào những hình ảnh họ đã mua. Đã đến lúc chúng ta thêm chức năng tải xuống được kích hoạt bởi liên kết đó. Theo mặc định, Paperclip sẽ lưu trữ tệp đính kèm của bạn trong thư mục public/system trong cấu trúc tệp của ứng dụng. Điều đó có nghĩa là chỉ cần click vào link là tải xuống. Tất nhiên, chúng ta muốn bảo mật các file, để chúng chỉ có thể được tải xuống bởi những người có quyền truy cập vào chúng sau khi mua.

Bản mật và download

Với paperclip, khi khai báo file đính kèm ta làm như sau:

Đường dẫn mặc định để lưu file như sau: :rails_root/public/system/:class/:attachment/:id_partition/:style/:filename. Folder public chúng ta thường để những gì dùng chung và mọi người đều có thể dùng, tất nhiên là chúng ta không muốn vậy, vì vậy chúng ta cần config 1 xíu trong model:

Giờ thì chúng ta đã có địa chỉ mới để lưu file được upload

Serving the secure images

Nôn na là chúng ta sẽ hiển thị thumbnail thay vì ảnh full size

Downloading Purchases

Cuối cùng nhưng không kém quan trọng là download

Khá giống với hàm display phía trên ngoại trừ việc ảnh được tải xuống sẽ là full size như ban đầu nó được upload lên

Tài liệu tham khảo

https://chrisherring.co/posts/how-can-i-protect-a-user-s-file-uploads-in-rails

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo