将 pdf 文件安全地存储在服务器上

Posted

技术标签:

【中文标题】将 pdf 文件安全地存储在服务器上【英文标题】:storing pdf files on server securely 【发布时间】:2013-10-04 15:34:10 【问题描述】:

我正在部署一个用户可以从中购买 pdf 的网站。现在我正在寻找存储pdfs 的方法,以便只有在付款完成后才能下载它。 我遇到了一种方法,我可以将 pdf 存储到 mysql 数据库中,并在所需凭据满足时生成它的路径。

有没有其他方法可以做到这一点,并且指向 pdf 文件的链接应该是动态的和加密的,以便无法预测到其他书籍的其他链接。

我使用的服务器端语言是php

【问题讨论】:

将它们存储在 Web 根目录之外并使用 php 文件提供服务 @Dagon...thnx 回复..你能给我提供给定概念教程的链接 Creating a Secure File Hosting Server for PDFs的可能重复 Deny direct access to a folder by htaccess 【参考方案1】:

我愿意:

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

开发一个 PHP 脚本:

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

优点是您的 PHP 脚本可以访问数据库——这意味着它可以允许用户登录、注销,它可以使用会话,...

这是来自堆栈用户的另一个适合此问题的答案:Creating a Secure File Hosting Server for PDFs

【讨论】:

【参考方案2】:
    您需要将文件存储在您的网站根目录之外的某个位置,如 Dagon 所述。上传文件时使用move_uploaded_file 移动它。您可以将文件命名为您想要的任何名称(在操作系统限制内)并将真实名称保留在数据库中。 然后,当用户支付了图书费用后,将用户支付的图书费用添加到数据库中的表中。 为用户提供他已支付的所有书籍的列表,例如:/download/filename.pdf 如果您使用 Apache(或其他 Web 服务器的等效项),其中 /download/.* 被重定向到 download.php 或控制器,请添加 mod_rewrite。 在下载页面上,检查用户是否已登录并有权访问该文件。如果没有,请重定向到该书的购买页面。 如果下载正常,请将 header 设置为 http status,您需要:Content-Length、Content-Type、Date、Status (200),可能还有 Content-Encoding。 使用readfile 将文件输出给最终用户。

【讨论】:

感谢回复..现在我有一个问题,如何在根目录之外上传文件....我想从浏览器界面上传文件,这些文件将使用 php 编写脚本,而不是像上传客户端一样文件... @nikhil 回答了你的问题【参考方案3】:

有没有其他方法可以做到这一点,并且指向 pdf 文件的链接应该是动态的和加密的,以便无法预测到其他书籍的其他链接。

    最好的办法,是付款后生成文件的密钥。 创建一个像这样的页面 www.site.com/download.php?key=key (这里你不需要有书的 id,因为 你可以通过 key 在数据库上查看什么是客户购买的书。 在download.php里面读取key,查询数据库找到哪个文件和key链接了 读取文件,并将其发送给客户。也就是说,如果密钥有效,您将把 php 标头作为内容类型发送为 pdf,并且(php 代码)以二进制形式读取文件并将其发送到消息正文中。

希望this code 有所帮助

<?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');
?>

【讨论】:

以上是关于将 pdf 文件安全地存储在服务器上的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHP 安全地将 JSON 数据写入文件

如何安全地存储加密密钥?

安全地将私有 PHP 文件存储在公共目录之上并使用 require_once 加载它们吗?

Python多处理安全地写入文件

安全地存储数据

Firebase 安全规则混乱