我拥有一个网站,任何用户都可以上传他们日常生活的照片。为简单起见,我们假设所有图像都位于以下路径中:
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
如果他们不跟踪该人,我该如何隐藏图像的真实路径或阻止用户查看该图像?
答案 0 :(得分:0)
有两种通用方法:
简单的一个:在存储图像时,在文件名中添加一个“类似密码”的字符串(例如15631_wCz3YiBZ5A2.png
),这样就不会有人猜出一个名字。现有文件。
干净的:通过PHP文件提供静态文件,或检查当前用户是否允许查看文件。这是更多的工作,并在服务器上增加了更多的负载,但它更安全,更灵活。这看起来像这样:
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,则无论他是否登录都无关紧要。
因此,这是一个很好的解决方案:
.htaccess
文件来完成此操作: <强> 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);
?>
我测试了这个,它适用于我。如果您需要什么,请告诉我。