Ex:用户登录网站并上传个人资料照片。我想限制访问权限只允许上传图片的用户有权访问。
因此,如果第二个人以某种方式获取到图片的URL,他或她仍然无法访问它,因为他或他没有正确的权限(https://example.com/profile_pic_mike_1)。现在我拥有它,以便用户可以上传个人资料图片,但是任何有URL的人都能够在浏览器中输入并查看图片。我不想那样。
这是一个充满乐趣的项目,欢迎所有建议。
答案 0 :(得分:1)
创建一个只有登录用户才能访问的脚本。让该脚本获取图像并在屏幕上显示。
您的用户访问以下网址:
example.com/image.php?name=image
然后 image.php 从磁盘/数据库中获取文件,并将其返回给用户。假设您正在使用jpeg图像(不包括错误检查)的快速示例:
<?php
if(!logged_in())
die('Unauthorized');
$filename = '/path/to/images/' . $_GET['name'];
$handle = fopen($filename, "rb");
$contents = fread($handle, filesize($filename));
fclose($handle);
header('content-type: ' . image_type_to_mime_type(IMAGETYPE_JPEG));
echo $contents;
其他图片mime类型可在此处找到:image_type_to_mime_type
答案 1 :(得分:0)
您可以编写一个PHP文件来检查用户是否已登录,或者用户是否具有访问该文件的权限。
我假设您的公共目录是public_html
。
对于图像存储,您需要将它们存储在公共目录(public_html)之外。
示例代码(例如image.php?file=profile_pic_mike_1
)。 image.php
位于public_html
,profile_pic_mike_1
位于公众无法访问的目录中。
<?php
// checking for $_SESSION, change accordingly to your method
session_start();
if(!$_SESSION['logged_in']){
session_destroy();
header("Location:index.php");
}
// $_GET['file'] will be profile_pic_mike_1
if(isset($_GET['file'])){
$file_dir = "../";
$file = $file_dir . $_GET["file"];
// get if user has the permission
// if yes, assign `true` to $permission ($permission = true;)
if (!file_exists($file)) {
echo "File not found.";
} else if (!$permission) {
echo "You do not have the permission to view this image.";
} else {
// You'll need to change the Content-type accordingly
header("Content-type: image/png");
readfile($file);
exit;
}
}
?>
图片的Content-type
列表:http://php.net/manual/en/function.image-type-to-mime-type.php。
您需要检查用户是否具有查看文件的权限,这是通过在MySQL数据库中保存权限来实现的。
答案 2 :(得分:-1)
你必须写出一些功能和肉体,但它会给你一个想法:
<?php
$username = get_username_from_url();
$user = get_logged_in_user();
if(!$user || ($username !== $user->name)) {
// access denied, send appropriate header and exit.
}
// keep your images outside your web root (not public).
// e.g. /path/to/app/data/uploads/unique_id.jpg
$avatar_path = get_avatar_file_path_by_user($user);
// send image file
header("Content-type: image/jpeg"); // or appropriate content type.
readfile($avatar_path);