将上传文件的访问权限仅限于Web应用程序中的原始作者

时间:2016-02-21 03:43:36

标签: php web

Ex:用户登录网站并上传个人资料照片。我想限制访问权限只允许上传图片的用户有权访问。

因此,如果第二个人以某种方式获取到图片的URL,他或她仍然无法访问它,因为他或他没有正确的权限(https://example.com/profile_pic_mike_1)。现在我拥有它,以便用户可以上传个人资料图片,但是任何有URL的人都能够在浏览器中输入并查看图片。我不想那样。

这是一个充满乐趣的项目,欢迎所有建议。

3 个答案:

答案 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_htmlprofile_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);