有没有办法阻止用户使用绝对路径查看私人图片?

时间:2014-04-14 15:16:04

标签: php mysql

想象一下这种情况

  1. 用户上传图片供所有人查看(图片为公开)
  2. 用户决定将图片设为私有
  3. 图片仅对他可见,因为图片在数据库中设置为私有。
  4. 这有一个问题:

    其他用户仍然可以从其绝对路径访问图片。 有什么方法可以阻止这种情况吗?

2 个答案:

答案 0 :(得分:3)

将图像存储在Web根目录之外,并有一个PHP脚本,用于确定当前用户是否有权访问它,如果是,则返回图像内容,否则返回403 Forbidden错误。


您可以将文件看起来,就像您正在为原始图片提供服务一样:

  

http://example.com/images/SunnyTrees.jpg

使用此.htaccess

RewriteEngine on
RewriteRule images/(.*) image.php?file=$1 [L]

然后您的image.php可以是:

<?php
$file = $_GET['file'];
// use $file to look up file information, eg. in the database
if( $it_exists && $has_permission_to_view) {
    readfile("/root/path/to/real/images/".$file);
    exit;
}
else header("HTTP/1.1 403 Forbidden");

答案 1 :(得分:0)

您可以将图像存储在具有由“uniqid”功能生成的复杂文件夹名称的绝对路径中,但会将其作为流式传输显示给用户。使用PHP脚本,您可以从绝对路径读取图像数据,并将其作为数据流传递给浏览器。如果你从一开始就这样做,没有人会知道绝对路径。然后,当用户将图像设为私有时,使用具有查看图像权限的PHP脚本进行检查,如果检查为真则将数据流传输给用户,如果不是,则不执行任何操作或流式传输“无图像”gif。

我几年前就已经这样做了,但是在这一刻我找不到我用过的功能。但这并不复杂。

参见例如:

http://www.php.net/manual/en/function.imagejpeg.php

http://www.php.net/manual/en/function.imagecreatefromstring.php