php - 图片保护目录

标签 php image .htaccess security

试图弄清楚如何保护目录中的图像 - 我发现了这个 post这很有帮助,但不是所有的方式。

我按照帖子说明进行操作并且似乎有效,唯一的问题是如果用户知道图像目录,那么他们可以直接请求图像并查看或下载它。

非常感谢任何帮助。

代码如下:

image.php

<?php
if (!isset($_GET['onlyHappensFromHTACCESS'])) {
   $_GET['f'] = "protectedImages/" . $_GET['f'];
    $type = getFileType($_GET['f']);
    if (acceptableType($type)) {
        if (goodTiming()) {
            header("Content-type: $type");
         echo file_get_contents($_GET['f']);
            exit;
        }
    }
    header('HTTP/1.1 403 Forbidden');
    exit;
}
function getFileType($file) {
  if (function_exists("mime_content_type"))
    return mime_content_type($file);
  else if (function_exists("finfo_open")) {
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $type = finfo_file($finfo, $file);
    finfo_close($finfo);
    return $type;
  }
  else {
    $types = array(
      'jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'png' => 'image/png',
      'gif' => 'image/gif', 'bmp' => 'image/bmp'
    );
    $ext = substr($file, strrpos($file, '.') + 1);
    if (key_exists($ext, $types)) return $types[$ext];
    return "unknown";
  }
}
function acceptableType($type) {
    $array = array("image/jpeg", "image/jpg", "image/png", "image/png");
    if (in_array($type, $array))
        return true;
    return false;
}
function goodTiming() {
    $n = time();
    session_start();
    if ($n - $_SESSION['lastcheck'] > 2 )
        return false;
    return true;
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
  <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
  <title>Image Denied</title>
  <style type="text/css" media="screen">
    body {
        background-color: #ccc;
        font-family: Helvetica, Arial;
    }
    #wrapper {
        margin: 30px auto;
        background-color: #ffffff;
        -moz-border-radius: 15px;
        -webkit-border-radius: 15px;
        border-radius: 15px;
        width: 800px;
        padding: 20px;
    }
  </style>
</head>
<div id="wrapper">
  <h3>Access Denied!</h3>
  You have tried to access an image, but due to security reasons, you cannot view the image.
  If you wish to use the image you requested, please contact me.
</div>
</html>

index.php

<?php session_start(); $_SESSION['lastcheck'] = time(); ?>
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>Home</title>
<style type="text/css">
        .image {
            overflow: hidden;
            position: relative;
            float: left;
        }
        .image .cover, .image .cover img {
            position: absolute;
            top: 0px;
            left: 0px;
            width: 100%;
            height: 100%;
        }
    </style>

  </head>
  <body>
        <div class="image">
        <img src="image.php?f=cake.png" alt="Image" />
        <div class="cover"><img src="imageCover.gif" alt=""  /></div>
    </div>
 </body>
</html>  

主文件夹中的 htaccess

RewriteEngine on
RewriteCond %{HTTP_REFERER} ^$
RewriteCond %{SCRIPT_FILENAME} image\.php
RewriteRule (.*) image.php?onlyHappensFromHTACCESS=denied [QSA,L]

protectedImages 文件夹中的 htaccess

#Prevent directory listing
Options -Indexes
#Prevent images from being viewed
<Files *>
  deny from all
</Files>

最佳答案

为您的图像文件夹创建一个 .htaccess 文件

deny from all

关于php - 图片保护目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30585886/

相关文章:

c++ - 在图像上应用蒙版以裁剪前景会产生不完整的输出

php - 以 seo 友好的方式重写 htaccess 中的复杂 url

.htaccess - 如何将子域重定向到不同的域?

php - 如何将 "error codes"添加到结果中?

php - 是否可以在 mysql 中提取建表语法?

java - Java 中的平台独立图像

css - 是否可以使用htaccess压缩较少的CSS文件? (以及如何?)

php - 数据库插入不起作用并且没有给出任何错误

.net - 以编程方式创建子域

java - 从另一个类 onCreate 方法和 onActivityResult android 调用共享按钮图像