在服务器上安全存储PDF文件

4
我正在部署一個網站,用戶可以從中購買PDF文件。現在我正在尋找一種存儲PDF的方法,以便只有在付款完成後才能下載。我已經找到了一種方法,可以將PDF存儲到MySQL數據庫中,在需要時生成路徑。
還有其他方法可以實現這一點,並且PDF文件的鏈接應該是動態和加密的,以便不能預測其他書籍的鏈接。我使用的服務器端語言是PHP。

将它们存储在网站根目录之外,并使用 PHP 文件提供服务。 - user557846
@Dagon...谢谢回复。您能否提供给我有关所述概念的教程链接? - nikhil
1
可能是为PDF创建安全文件托管服务器的重复问题。 - user557846
通过htaccess拒绝直接访问文件夹 - Joop Eggen
3个回答

3
  1. 你需要将文件存储在网站根目录之外的某个地方,就像 Dagon 所提到的那样。当文件上传后,使用move_uploaded_file将其移动。你可以随意命名文件(在操作系统限制内),并将真实名称保存在数据库中。
  2. 然后,当用户支付书款时,将用户已付款的书籍添加到数据库中的一个表格中。
  3. 向用户提供他已经购买的所有书籍的列表,例如:/download/filename.pdf
  4. 如果你使用 Apache(或其他 Web 服务器的等效物),请添加 mod_rewrite,其中 /download/.* 被重定向到 download.php 或控制器。
  5. 在下载页面上,检查用户是否已登录并且有权访问文件。如果没有,将重定向到该书籍的购买页面。
  6. 如果下载正常,请设置 header 以获取所需的 http 状态:Content-Length、Content-Type、Date、Status(200),可能还包括 Content-Encoding。
  7. 使用 readfile 将文件输出给最终用户。

谢谢回复。现在我有一个问题,如何上传根目录之外的文件...我想通过使用PHP脚本编写的浏览器界面上传文件,而不是使用上传客户端(如FileZilla)。 - nikhil
1
@nikhil回答了你的问题。 - OIS

2
有没有其他方法来实现动态加密链接到pdf文件,以便其他书籍的链接无法预测?
以下是最佳方式:
  1. 付款后生成文件的密钥。
  2. 创建一个页面,类似于www.site.com/download.php?key=key(在这里,您不需要拥有书籍的id,因为通过密钥,您可以在数据库中检查客户购买的是哪本书)。
  3. 在download.php内部读取密钥,查询数据库以找到与密钥相关联的文件。
  4. 读取文件并将其发送给客户。如果密钥有效,则会将php头作为内容类型发送为pdf,并且(php代码)以二进制形式读取文件并将其发送到消息正文中。
希望此代码能够帮助您。
<?php
// We'll be outputting a PDF
header('Content-type: application/pdf');

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

// The PDF source is in original.pdf
readfile('original.pdf');
?>

2
我会:
  • 拒绝任何对文件的访问--即使用.htaccess文件(这样,没有人可以访问该文件)

  • 编写一个PHP脚本:

    • 接收文件标识符(例如文件名或某个可以对应文件的标识符)
    • 验证用户身份(使用登录/密码字段),如果用户有效并且有权访问文件(如果不同的用户不能访问同一组文件),则从PHP脚本中读取文件内容并将其发送给用户。

优点在于您的PHP脚本可以访问数据库--这意味着它可以允许用户登录、注销,可以使用会话等功能。

以下是另一位堆栈用户提供的答案,适用于此问题:Creating a Secure File Hosting Server for PDFs


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接