Apache 如何拒绝访问其他用户上载的图像?

Apache 如何拒绝访问其他用户上载的图像?,apache,file-access,Apache,File Access,在转换图像的web应用程序中,我想拒绝直接访问其他用户的图像,我已在我的主.htaccess文件中添加了以下代码: RewriteCond %{HTTP_COOKIE} !PHPSESSID=(.+) [OR,NC] RewriteCond %{HTTP_COOKIE}:%{REQUEST_URI} ^PHPSESSID=(.*?);:(?!.*?/usuarios/\1).* [NC] RewriteRule ^.*?/usuarios/.+?\.(gif|jpe?g|png|wbmp)$ -

在转换图像的web应用程序中,我想拒绝直接访问其他用户的图像,我已在我的主
.htaccess
文件中添加了以下代码:

RewriteCond %{HTTP_COOKIE} !PHPSESSID=(.+) [OR,NC]
RewriteCond %{HTTP_COOKIE}:%{REQUEST_URI} ^PHPSESSID=(.*?);:(?!.*?/usuarios/\1).* [NC]
RewriteRule ^.*?/usuarios/.+?\.(gif|jpe?g|png|wbmp)$ - [R=403,L]
因此,由于用户有自己的文件夹来上传和转换图像,此规则将检查您是否正在查找与您的
id\u会话匹配的图像,如果不匹配,将抛出403响应

它似乎工作正常,但如果任何用户附加一个图像并用其他用户的图像更改
scr
(假设他知道路径),它将显示该图像

我该如何预防它?


您可以在

处进行检查,正如@David Houde所说的,这样的逻辑应该在应用程序中实现,例如以下方式:

  • 用户上传的图像将存储在web之外 站点根目录,因此无法使用URL直接访问它们

  • 您需要设置您的网站来处理虚拟URL(最简单的 这里是一个重写规则,在内部将请求URL作为 一些PHP(或任何)脚本的参数)

  • 然后,在脚本中,您将有充分的自由来检查 请求符合您的策略

  • 如果请求是合法的,您的脚本将能够打开 请求的映像文件并将其内容作为web服务器应答发送


  • 我更愿意看到这种逻辑在应用程序代码中实现,而不是在web服务器中实现。我的意思是,它可以工作,因为会话不需要是持久的(单次使用站点),但我认为在实际应用程序中实现它会更容易、更可移植。它也实现了,但它不能避免更改您自己的
    img
    标记和对图像的访问。但是我需要使用
    img
    标记来显示图像。如果它在文档根目录之外,我怎么做?@ManoloSalsas请阅读第2点#3.和#4,不仅仅是#1。@ManoloSalsas:IMG标签指的是一个URL,但是在这个方案中URL是一个虚拟的:
    /uploads/myuser/mypict.jpg
    不会直接映射到图像,但是重写规则会将这个URL作为参数传递给
    /uploads.php?URL=myuser/mypict.jpg
    脚本,这个脚本将能够访问和发送web根目录之外的文件内容(web服务器根目录不适用于脚本的文件处理功能)。好的,我们需要知道您使用的语言,以便给出一个示例。这个问题可能更适合StackOverflow。com@DavidHoude-我正在使用PHP。