在Web服务器中存储文件的安全方法?

时间:2011-01-05 12:18:14

标签: php mysql security file webserver

我希望我的文件在我的网络服务器中是安全的。只有经过身份验证的用户才能访问这些文件。我想把数据库中的文件存储为“Long BLOB”,但它只支持最多2MB的数据。文件大小可能超过50MB。有没有其他更好的方法来保护文件?请帮助我。提前谢谢。

7 个答案:

答案 0 :(得分:23)

不要将它们存储在数据库中。将它们放入您的网络目录并使用.htaccess保护它们。

如果您想通过其他方式进行身份验证,请将文件存储在一个不可通过Web访问但可由用户运行的目录中运行。

答案 1 :(得分:5)

我想到了一些选择。

如果您使用的是Apache,可以使用htaccess来密码保护目录。 (第一个谷歌链接:http://www.javascriptkit.com/howto/htaccess3.shtml

或 将文件存储在Web服务器上方。 在php中创建一个脚本,允许授权用户访问它们。

如果您想通过FTP进行操作,并且您正在运行cpanel,则可以创建新的ftp帐户。检查yourdomain.com/cpanel以确定是否安装了它。

答案 2 :(得分:4)

在DB中存储文件是非常糟糕的做法。非常好的做法只存储有关文件的信息。名称,扩展名。文件保存在服务器上,如$ id。$ ext。这将是一个很好的架构。当用户下载文件时,他会在DB中获取名称文件。
对不起我的英文。

答案 3 :(得分:2)

讨论

如果您选择直接在文件系统上保留高价值可下载内容文件,最好的办法是将它们保留在 webroot 之外。 然后,您的应用程序必须解决为内容(PDF,Word Docs,歌曲等)创建URL(必要时的URL编码)的问题。

通常,这可以通过使用查询来检索文件路径,然后使用文件路径向用户发送内容(使用header()等)来实现,当他或她点击锚点时(所有这一切都没有用户看到真正的服务器端文件路径。)

如果您不希望用户 A 向用户 B 共享高价值可下载内容的网址,那么您的应用必须以某种方式将链接专门绑定到用户 A 即可。可以做些什么?我应该从哪里开始?

显然,您希望确保用户 A 在会话期间登录,然后才能下载文件。什么不那么明显是如何阻止登录用户 B 使用用户发送的网址 A (向用户 B )下载 A 数字内容。

使用$_SESSION存储登录用户的ID(数字或字符串)并进行最终查询的部分(假设内容与用户购买或其他内容相关联)将阻止登录用户 B 下载他们尚未购买的东西,但您仍然会因为未购买的商品处理SQL空集而遭受资源冲击。这听起来像是一个很好的第二步。

第一步怎么样?有什么东西可以阻止开始查询的需要吗?

好吧,让我们看看。在HTML表单中,可以在隐藏字段中使用XSRF令牌来验证提交的表单实际上来自接收POST / GET请求的Web服务器。一个标记用于整个表单。

给定一个用户特定要下载的页面(锚点),可以以查询字符串参数的形式将单个令牌(相同的令牌,但每页请求不同)嵌入到每个锚点的href属性中并在$_SESSION中存储此令牌的副本。

现在,当登录用户 B 尝试使用已登录的用户 A 共享网址时,由于用户 A ,整个操作失败并且用户 B 具有不同的会话(或者根本没有会话),因此具有不同的令牌。换句话说,“我的链接与你的相同,但不同。”锚点将与会话绑定,而不仅仅与页面,用户或内容绑定。

使用该系统,PHP可以确定内容请求是否有效而不涉及数据库(通过将提交的令牌与$_SESSION中的令牌进行比较)。此外,可以在$_SESSION中建立时间限制,以限制有效XSRF令牌的持续时间/生命周期。只需使用time()函数和基本数学。在这种情况下,60分钟可能是锚点的理想令牌生命周期。如果单击锚点的令牌已过期,请让用户再次登录。

摘要

如果您在文件系统上使用文件并将路径存储在数据库中,请确保您也执行以下操作(至少)。

  1. 将适当的文件权限应用于您的内容目录(在webroot之外)。
  2. 为上传的文件使用随机名称。
  3. 在保存上传文件之前检查重复的文件名。
  4. 只有登录用户才能下载高价值内容。
  5. 有一个有效的$_SESSION系统可以阻止会话固定。
  6. 通过使用散列XSRF令牌,使每个页面的高价值可下载内容的网址是唯一的。
  7. XSRF令牌涵盖终端有效期的更多场景。
  8. 根据登录用户的ID,而不是产品专用,对用户内容进行SQL查询。
  9. 过滤并验证所有用户输入。
  10. 将预准备语句与SQL查询一起使用。

答案 4 :(得分:1)

可下载文件可以存储在受htaccess保护的文件夹中。可以使用下面的脚本为可下载文件生成动态链接。

代表。安全的下载链接。 http://codecanyon.net/item/secure-download-links/309295

答案 5 :(得分:0)

最好的方法是将文件引用存储在数据库中。文件本身将存储在服务器文件系统中。这样做的复杂性是确保数据库文件引用与服务器文件系统中的现有文件之间存在引用完整性。某些数据库(如sql server 2008)具有维护文件引用完整性的功能。

除了在服务器中保护文件本身之外,还取决于可以将权限配置到文件所在的特定文件夹的操作系统。

答案 6 :(得分:0)

如果文件是纯静态的,您可以使用只读或WORM介质来存储数据文件,或者从“LiveCD”运行完整的Web服务器。它肯定不适合每个人的需求,但对于有限的情况,数据的完整性至关重要。