如何隐藏真实的图像路径(或撤销访问权限)?

时间:2014-10-06 22:32:39

标签: javascript php jquery html url

我拥有一个网站,任何用户都可以上传他们日常生活的照片。为简单起见,我们假设所有图像都位于以下路径中:

www.example.com/assets/img/<USER_ID>/<PHOTO_ID>.png

问题是,这允许任何人查看任何人的照片,这不是我想要的。例如,以下是一些人可以访问并查看任何用户的照片(甚至运行脚本以从网站上获取所有照片):

www.example.com/assets/img/501/15631.png
www.example.com/assets/img/1375/78974.png
www.example.com/assets/img/2/52.png

如果他们不跟踪该人,我该如何隐藏图像的真实路径或阻止用户查看该图像?

4 个答案:

答案 0 :(得分:0)

有两种通用方法:

  1. 简单的一个:在存储图像时,在文件名中添加一个“类似密码”的字符串(例如15631_wCz3YiBZ5A2.png),这样就不会有人猜出一个名字。现有文件。

  2. 干净的:通过PHP文件提供静态文件,或检查当前用户是否允许查看文件。这是更多的工作,并在服务器上增加了更多的负载,但它更安全,更灵活。这看起来像这样:

  3. if (userMaySeeImage($imageId))
    {
        header('Content-Type: image/jpeg');
        echo file_get_contents($imagePath);
        exit;
    }
    else
    {
        die('Nice try, buddy.');
    }
    

    这当然只是一个通用的例子,因为我对您的用户身份验证/授权机制一无所知,也没有关于存储图像引用的方式。

    在示例中,userMaySeeImage是可以确定用户是否可以访问图像的函数或方法,$imageId是图像的唯一标识符,$imagePath是绝对的图像的路径。

答案 1 :(得分:0)

这样做,它会通过读取图像并创建一个新图像来屏蔽URL。

header('Content-Type: image/jpeg');
$imgPath="http://upload.wikimedia.org/wikipedia/commons/thumb/a/aa/Sun920607.jpg/50px-Sun920607.jpg";
$image = imagecreatefromjpeg($imgPath);
imagejpeg($image);

答案 2 :(得分:0)

这是一张图片。它可以被复制,有人可以做截图,所以你不需要更多的安全性,而不是让它们无法发现。一旦有人在登录时获知给定图像的URL,则无论他是否登录都无关紧要。

因此,这是一个很好的解决方案:

  1. 使用难以猜测的文件名,如lxg建议的其他anwer。
  2. 将服务器配置为不允许列出文件。在Apache和其他兼容的情况下,可以使用包含以下行的 .htaccess 文件来完成此操作:
  3. <强> Options -Indexes

    将该文件放入要禁用列表的目录中。当客户端将url输入目录时 www.example.com/assets/img 他没有列出文件和子目录,而是收到错误 403 Forbidden

    现在无法查看文件列表,您的文件名称如下: 3210983j11kjdhasda980132132.jpg因此无法猜出他们的名字。

    这不是严密的安全性,但它很简单,而且非常适合非常基本的隐私。

答案 3 :(得分:0)

如果您使用.htaccess保护,我会这样做:

创建.htaccess受保护目录以容纳用户的图片。然后,当用户想要关注某人时,他们将不得不重新输入他们的密码(许多地方这样做是为了增加安全性)。当他们跟随某人时,你可以使用这样一个表格:

 <form name="signup" action="controller.php" method="POST" id="signup">
    <input name="user" placeholder="Username"></input><br>
    <input name="pass" placeholder="Password"></input><br>                              
    <input type="submit" id="submit" value="Submit" style="border:none; background:MidnightBlue; color:white;" name="submit">
 </form>

然后,您需要获取密码并将其放入.htpasswd文件中。这是代码(让我们调用这个代码文件&#34; controller.php&#34;):

<?php

$username = $_POST['user'];
$password = $_POST['pass'];


$encrypted_password = crypt($password, base64_encode($password));

$data= $username . ':' . $encrypted_password . "\n";

$file = "user-directory/.htpasswd";       
$ret = file_put_contents($file, $data, FILE_APPEND | LOCK_EX);

?>

我测试了这个,它适用于我。如果您需要什么,请告诉我。