【问题标题】:Stop files being accessed directly停止直接访问文件
【发布时间】:2013-02-01 12:14:21
【问题描述】:
我想知道,我已经为 wordpress 制作了一个 php 插件,它要求作为图像存储。如果您登录,您会看到分配给您的文件。然后你点击下载,它就会下载它们。
问题是,如果您知道 URL,则无论如何都可以下载图像。如果用户知道图像的唯一 URL,如何轻松阻止用户下载图像,而只允许具有登录权限的人查看。
我的想法是:
- 某种检查引用 URL 的 HTACCESS hack
- 一种 KEY 系统,仅在提供密钥的情况下才允许下载文件。
任何信息或想法都会非常有用,谢谢。
【问题讨论】:
标签:
php
wordpress
security
download
【解决方案1】:
如果您使图像对全世界都无法读取(例如 www 目录之外的目录,或者只是用 .htaccess 阻止它(无需进行推荐检查),您可以确保没有人可以访问您的图像。
然后通过检查凭据的文件(例如getImage.php?imageid=xxxx)提供您的图像,如果确定则读取图像(您的 php 进程可以读取图像,例如使用file_get_contents())然后提供它。
(使用正确的标题,你会没事的:header("content-type: image/your_image_type");)
【解决方案2】:
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?mydomain.com/.*$ [NC]
RewriteRule \.(gif|jpg|js|css)$ - [F]
请务必将“mydomain.com”替换为您自己的。当指定文件类型的热链接发生时,上面的代码会创建一个失败的请求。如果是图像,则会显示损坏的图像。
【解决方案3】:
要保护文件,您可以执行以下两项操作之一
- 将文件放在安全区域(在您的公共可访问文件夹之外)。将其名称存储在数据库中,当某人单击下载时,您会选择该文件并让他们下载。
- 切勿将文件 URL 公开。当有人想要下载图像时,他们将单击下载,您可以使用时间戳在当时生成一个唯一的文件名,并使用别名文件名传输下载。显然,该文件实际上不会存在于服务器上。您只是拿起原始文件并更改其名称,因此当有人收到它时,他们将无法猜测其路径。但是,如果由于某种原因路径公开,那么他们可以访问该文件。
选项 1 主要用于人们存储文档签名等时
如果您无权访问共享托管环境等中的此类文件夹,则可以使用选项 2。