Nơi tốt nhất để lưu trữ hóa đơn PDF có thể tải xuống là gì?


7

Thành phần của tôi sẽ tạo hóa đơn ở định dạng PDF sẽ có sẵn cho khách hàng tải xuống.

Đâu là nơi tốt nhất để lưu trữ những tập tin này?

/adminitrator/componentes/com_mycomponent/invoices

/componentes/com_mycomponent/invoices

/media/com_mycomponent/invoices

Làm cách nào tôi có thể ngăn người dùng trái phép chỉ tải trực tiếp các tệp này?

Làm cách nào tôi có thể ngăn khách hàng tải xuống hóa đơn của người khác?

Câu trả lời:


7

Tôi sẽ khuyên không nên sử dụng

administrator/components/com_mycomponent/invoices 

Điều này là do nó có thể gây ra vấn đề khi bạn sử dụng .htaccesstrên thư mục quản trị viên của mình. Ví dụ: với Công cụ quản trị Akeeba

Tôi thích sử dụng thư mục phương tiện là tốt.

Bạn cũng có thể phân phát các tệp được băm với tên gốc thích hợp của chúng như thế này:

<?php
header("Content-type:application/pdf"); 

// It will be called NICE_TITLE.pdf
header("Content-Disposition:attachment;filename='NICE_TITLE.pdf'");

// The PDF source is in HASHED_FILE.pdf
readfile("HASHED_FILE.pdf");
?>

6

Điều này có thể không trả lời trực tiếp câu hỏi của bạn, nhưng tôi muốn đưa ra quan điểm khác về câu hỏi này.

Tôi sẽ cố gắng tránh càng nhiều càng tốt việc lưu trữ tài liệu mà bạn có thể tạo. Lý do: bạn cần quyết định tên thư mục / tên tệp, cái mà sau này khó thay đổi. Nó có thể sử dụng quá nhiều không gian và có thể đặt ra các vấn đề bảo mật.

Tất nhiên điều này phụ thuộc vào cách ứng dụng của bạn hoạt động, nhưng lý tưởng nhất là tôi sẽ có dữ liệu hóa đơn trong các bảng cơ sở dữ liệu và tạo hóa đơn khi cần.

Theo quan điểm của tôi.


2
Tạo chúng một cách nhanh chóng << ý tưởng tuyệt vời
Lodder

Là một cân nhắc liên quan: nếu bạn lấy thông tin một cách linh hoạt có thể thay đổi (ví dụ: sử dụng tên người dùng), PDF 'tĩnh' cho phép bạn có bản ghi theo thời gian thay vì thực hiện các thay đổi. Hiện tại chúng tôi đang làm việc trên một hệ thống học tập điện tử và các chứng chỉ mà chúng tôi tạo ra phải có tên của họ tại thời điểm họ qua (vì vậy mọi người chỉ cần thay đổi tên của họ, sau đó tạo chứng chỉ mới cho người bạn của họ đã vượt qua) . Chỉ là một ý nghĩ.
mã hóa

@codinghands - Trong trường hợp đó, bạn sẽ liên kết tên của tệp PDF trong cơ sở dữ liệu với người dùng idthay vì tên. Sau khi tạo, bạn sẽ kết hợp idbảng trong bảng với bảng idtrong tên #__usersđể lấy tên người dùng hoặc tên đầy đủ của họ;) Nói chung tôi rất thích phương pháp này vì nó tiết kiệm một lượng không gian máy chủ
khủng khiếp

Nếu tên cần được in trên PDF, thì việc bạn liên kết PDF với DB không thành vấn đề - nếu tên thay đổi, thì chứng chỉ (nếu là động), trong trường hợp sử dụng mà tôi mô tả là xấu lần
mã hóa

Tên sẽ không thay đổi vì bạn sẽ mã cứng nó trong bảng hóa đơn vì lý do bạn đã đề cập. Hóa đơn không nên sử dụng các hiệp hội bảng cho thông tin đó.
Valentin Despa ngày

5

Chỉ cần nghĩ rằng tôi sẽ ném 2 xu của mình (một số điểm tốt trong việc băm tên tệp).

Gần đây tôi có một vấn đề tương tự. Thay vì lo lắng .htaccess, tôi chỉ lưu các tệp ở trên public_html, với một tham số thành phần chỉ định đường dẫn, sau đó sử dụng PHP readfileđể tìm nạp và xuất tệp PDF.

Không hoạt động với tất cả các máy chủ, nhưng đối với hầu hết các ứng dụng, nó có nỗ lực tương đối thấp và hoàn toàn ngăn chặn mọi liên kết nóng hoặc truy cập khác.


3

Không bao giờ lưu trữ bất kỳ tập tin người dùng tạo trong các thư mục thành phần. Cuối cùng, bạn có thể mất chúng trong quá trình cập nhật thành phần của mình (nếu không được thực hiện đúng cách) hoặc chắc chắn khi người dùng gỡ cài đặt nó.

Vị trí chính xác để lưu trữ các tệp như vậy thực sự là thư mục "hình ảnh". Đó là nơi người dùng có thể dễ dàng quản lý các tệp bằng trình quản lý phương tiện. Thư mục "phương tiện" sẽ là một lựa chọn khả thi khác, nhưng thực tế nó có ý nghĩa hơn để giữ các tài sản mở rộng như CSS, JS và tương tự.

Tuy nhiên, nếu các tệp chứa dữ liệu hợp lý không có sẵn cho bất kỳ ai, thì việc lưu trữ chúng trong bất kỳ thư mục này là một ý tưởng tồi. Ngay cả khi bạn băm chúng, bạn có thể chắc chắn rằng cuối cùng ai đó sẽ có thể đọc chúng.

Nếu nó cần được bảo mật, thì đừng lưu trữ tập tin và thay vào đó hãy tự động tạo nó theo yêu cầu. Hoặc lưu trữ bên ngoài webroot và truy cập nó bằng PHP. Không có cách nào an toàn khác.


You may end up loosing them during an update of your component>> Tôi không tin rằng các tệp được lưu trữ trong một thư mục sẽ bị xóa trừ khi bạn chỉ định rằng trong tập lệnh cập nhật. Đồng ý với việc gỡ cài đặt mặc dù
Lodder

1
Nó sẽ tự động xóa các thư mục trong một bản cập nhật nếu bạn đã chỉ định chúng trong XML tệp kê khai của bạn trong một bản phát hành và trong bản phát hành sau đó đã xóa nó.
Bakual

2

Sử dụng thư mục sau đây làm gốc cho tất cả các hóa đơn là hoàn toàn tốt:

administrator/components/com_mycomponent/invoices

Tuy nhiên, những gì tôi khuyên bạn nên làm là băm tên tệp sau khi hóa đơn được tạo. Thích như vậy:

administrator/components/com_mycomponent/invoices/HASHED_FILE.pdf

Hoặc, hoặc cho mỗi hóa đơn, hãy tạo một thư mục băm và lưu trữ tệp PDF trong đó, như vậy:

administrator/components/com_mycomponent/invoices/HASHED_DIR/file.pdf

Cập nhật:

Nếu phương pháp này được chọn, bạn có thể sử dụng tệp htaccess để ngăn truy cập trực tiếp và chỉ cho phép truy cập theo định hướng PHP vào các tệp PDF này.

Đối với tải xuống do PHP điều khiển, tôi sẽ đề nghị lưu trữ hàm băm trong tab cơ sở dữ liệu, cùng với ID người dùng. Khi yêu cầu được thực hiện để tải xuống tệp, sau đó bạn có thể khớp với ID bạn đã lưu với ID của người dùng đã đăng nhập hiện tại và dĩ nhiên, khớp với hàm băm được lưu trữ trong cơ sở dữ liệu.


@downvoter, bước lên, thể hiện bản thân và giải thích lý do tại sao bạn nghĩ những gì tôi đã viết là sai
Lodder

Vui lòng không lưu trữ các tệp do người dùng tạo trong các thư mục thành phần. Ngoài ra băm một mình sẽ không làm cho nó an toàn để truy cập. Nó chỉ khó hơn một chút. Nếu nó cần hạn chế truy cập, nó cần phải được hạn chế, không chỉ che giấu. Nó sẽ cho một cảm giác an toàn sai lầm.
Bakual

@Bakual - Bạn có thể sử dụng tệp htaccess để ngăn truy cập trực tiếp vào tệp và chỉ cho phép truy cập tệp qua PHP
Lodder

Nó vẫn sẽ là nơi sai lầm để lưu trữ chúng trong các thư mục thành phần. Sử dụng images, mediahoặc một thư mục bên ngoài webroot.
Bakual

2

Đối với tôi thư mục phương tiện của nó phù hợp nhất cho mục đích đó. Để hạn chế truy cập trực tiếp, chỉ cần tạo tệp .htaccess trong thư mục của bạn với nội dung bên dưới.

DENY FROM ALL

Bất kỳ lý do cho downvote? vui lòng bình luận nếu có gì sai với câu trả lời ..
Nagarjun

Bởi vì "bất kỳ nơi nào" là sai. Các tập tin không nên được lưu trữ trong các thư mục thành phần.
Bakual

Làm thế nào là sai? Có quy tắc nào nói lên điều đó không? Không nên lưu trữ các tệp trong các thư mục thành phần vì chúng sẽ bị ghi đè nếu các gói cập nhật có cùng tệp nếu không sẽ không có vấn đề gì với nó. Trừ khi bạn gỡ cài đặt thành phần, sẽ không có bất kỳ vấn đề nào với các thư mục thành phần. Và tôi nói rõ sở thích của tôi là thư mục phương tiện.
Nagarjun

Nó được giải thích trong "thực tiễn tốt nhất" ở đây: docs.j Joomla.org/Development_Best_Practices
Bakual

Chà .. tên của tài liệu giải thích những gì tôi muốn nói ở trên. Cảm ơn vì liên kết nào.
Nagarjun
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.