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

bra*_*ess 19 php mysql security webserver file

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

mar*_*cog 23

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

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


Ant*_*dge 9

讨论

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

通常,这可以通过使用查询来检索文件路径,然后在用户header()单击锚点时使用文件路径将内容发送给用户(使用等...)来实现(所有这些都没有用户看到)真正的服务器端文件路径)。

如果你不希望用户一个高价值的下载内容到用户共享的网址,那么你的应用程序必须以某种方式使完全依赖于用户的链接一个。可以做什么?我应该从哪里开始?

显然,您要确保用户A在会话期间已登录,然后他或她才能下载文件。什么是不那么明显的是如何防止一个登录用户使用从用户发送的URL一个(用户)下载A的数字内容。

使用$_SESSION存储的登录用户的ID(数字或字符串),使最终的查询部分(假设内容被绑定到用户购买或东西)将防止登录的用户从网上下载他们没有东西,但你仍然会导致资源命中来处理他们尚未购买的项目的 SQL 空集。这听起来是很好的第二步。

第一步呢?有什么可以阻止需要做一个查询开始?

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

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

现在,当登录用户B尝试使用登录用户A 的共享 URL 时,整个事情都会失败,因为用户A和用户B具有不同的会话(或者根本没有会话),因此令牌不同。换句话说,“我的链接和你的一样,但不同。” 锚点将与会话相关联,而不仅仅是与页面、用户或内容相关联。

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

概括

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

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


Jas*_*son 5

我想到了一些选择.

如果您使用的是Apache,则可以使用htaccess来保护目录.(第一个用Google搜索链接:http://www.javascriptkit.com/howto/htaccess3.shtml)

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

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


Ale*_*tau 5

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