【问题标题】:How to hide true image path (or revoke access to)?如何隐藏真实的图像路径(或撤销访问)?
【发布时间】:2014-12-01 06:48:33
【问题描述】:

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

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

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

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

如果用户没有关注该人,我如何隐藏图像的真实路径或阻止用户查看该图像?

【问题讨论】:

  • 别想用javascript做这个,你需要像uLogin这样的服务器端解决方案。
  • 您必须通过服务器端脚本提供这些图像,该脚本将检查权限。
  • 可以使用 PHP,还是您需要使用特定的语言?
  • @EnzoMac PHP 非常好。
  • 好的,我贴了一些代码。看看这是否有效。

标签: javascript php jquery html url


【解决方案1】:

一般有两种方法:

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

  2. 干净的:通过 PHP 文件或检查当前用户是否被允许查看文件的东西来提供静态文件。它的工作量更大,给服务器带来了更多的负载,但它更安全、更灵活。这可能如下所示:

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

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

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

【讨论】:

  • 你有第二种方法的例子吗?
  • 是的,添加了一个简单的例子。
  • 好的,但是如果用户转到直接图像路径,我将如何调用该 PHP 脚本和 userMaySeeImage? htaccess 重定向?
  • 图像甚至不会“公开”可用,即存储在文档根目录之外或受保护的文件夹中(htpasswd 或 chmod/chown,因此公共用户不得访问它)。
【解决方案2】:

如果您使用.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 文件中。这是代码(我们称这个代码文件为“controller.php”):

<?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);

?>

我已经对此进行了测试,它对我来说一切正常。如果您需要什么,请告诉我。

【讨论】:

    【解决方案3】:

    这是一张图片。它可以被复制,有人可以截屏,所以你不需要更多的安全措施,而不是让它们无法被发现。一旦有人知道给定图像的 url,在登录时,他是否登录都没有关系。

    因此,这是一个不错的解决方案:

    1. 使用 lxg 在另一个答案中建议的难以猜测的文件名。
    2. 将服务器配置为不允许列出文件。在 Apache 和其他兼容的系统上,这可以通过包含以下行的 .htaccess 文件来完成:

    Options -Indexes

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

    现在无法查看文件列表,您的文件命名如下: 3210983j11kjdhasda980132132.jpg 所以不可能猜到他们的名字。

    这不是严格的安全性,但它很简单,并且对于非常基本的隐私来说足够好。

    【讨论】:

      【解决方案4】:

      这样做,它会通过读取图像并创建一个新图像来掩盖 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);
      

      【讨论】:

      • 为什么使用imagecreatefromjpegimagejpeg,而不是file_get_contents?另外,为什么要通过外部 URL 而不是通过文件系统路径加载图像?
      • @lxg file_get_content 也可以使用,但由于安全原因,主机提供商通常不允许使用。我没有特别的原因使用外部 URL,我是在做一个例子。
      • file_get_contents 本身并没有被阻止,但对远程资源的访问有时会被阻止。否则,您还必须阻止 require,这将使几乎所有 PHP 应用程序都无法运行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-22
      • 1970-01-01
      • 2017-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多