防止使用浏览器url直接访问图像

2023-12-11

我有一个名为 - 的文件夹Images。该文件夹包含用户个人资料图片。现在,用户只需将图像 URL 复制到浏览器即可随时查看自己的图像。这样他还可以看到其他用户的个人资料照片。我想要实现的是 - 用户应该只能通过我网站上的 PHP 页面看到他的个人资料图片。如果用户直接输入图片URL,则不应该显示。

我尝试使用 .htaccess 来实现这一点。这是我在 .htaccess 文件中的内容:

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?mysite.com/
RewriteRule \.(gif|jpg)$ http://www.mysite.com/errorpost.jpg [R,L]

我是 .htaccess 的新手。如果有办法实现这一点,请帮忙。

提前致谢。


我也有同样的问题。目前我找到了2种方法:

1)base64_encode() + ajax + js/jquery

  • 将由 base64_encode() 编码的每个图像存储在 www 文件夹之外的二进制文件或数据库中。
  • 使用ajax 来获取该数据。它应该返回“data:image/jpeg;base64,$enc_imgbinary”
  • 使用js/jquery将'img'属性的'src'替换为返回结果

pros

  • 无法通过直接链接访问图像

cons

  • 我没有找到类似的视频解决方案。
  • 图像应事先(或首次使用)进行编码,以尽量减少服务器 CPU 的使用。
  • 编码图像占用磁盘空间约 30% => 1.3 倍磁盘空间
  • 如果你想在服务器上保留原始图像=> 2.3x磁盘空间。
  • ~30% 的数据将通过网络发送

2) 长随机名称(+符号链接)

A) 使用长随机名称将图像存储在 www 文件夹中
B) 将图像存储在 www 文件夹之外,并带有指向 www 文件夹的符号链接。 (www 之外的图像也可以作为桌面图像备份)

notes:

  • 文件夹还必须包含随机符号
  • 使用 '。'在任何文件夹或文件名之前 => 以防万一,防止在未配置的 apache 上显示文件夹内容
  • 配置 apache 在情况 B) 中遵循符号链接(将 Flow 符号链接添加到 httpd.conf)
  • 配置 apache 以阻止文件夹内容列出(从 httpd.conf 中删除索引)
  • 图像层次结构示例:

    • www
      • .media_jmdue7jed
        • .user1_hash_!sdfsewewfsdfsds
          • .album1_name_!jfie8e7y77667fef
            • .photo1_name_!kjio9i890v8fsd978fyreshf
            • .photo2_name_!09098dfuujdsif87s7ysdffd
            • ...
          • .album2_name_!ghhyuflp!huidfjh
            • .photo1_name_!feojihudhufuuhfrufhi8484
            • .photo2_name_!2344gfdgfdgdfefedw232sdg
            • ...
        • .user1_hash_!j333re89dsfdsf
          • ...

pros:

  • 也可用于视频
  • 您仍然可以通过使用长随机名称创建指向 www 文件夹的符号链接,将具有原始名称的原始图像保留在 www 文件夹之外。甚至每个用户都不同。
  • 图像可以在您的服务器外部使用(在论坛中,快速发送直接链接给您的朋友或类似的人)

cons

  • 符号链接必须预先创建(或即时创建)
  • Image can be accessed with direct link
    • 然而几乎不可能猜到它
    • 您还可以定期更改符号链接随机名称或更改图像版权(我猜 google+ 会这样做)
  • map original-name → long-random-name should be stored in db (or sidecard/meta file)
    • (如果通过编码/解码或组合原始名称+长随机名称将原始名称保留在长随机名称中,则可以绕过)

=======================================

我已经实现了案例 1),它对我来说效果很好,但是我没有找到类似的 HTML5 视频解决方案。

情况2)似乎更灵活。但是我仍然不确定安全性。 如果有人发现安全漏洞,请告诉我。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

防止使用浏览器url直接访问图像 的相关文章

  • 如何使用 php 从字符串中提取日期

    我需要从字符串中提取日期 下面是我的代码和字符串 str Updated status to Masters Software Engineering Enrolled Documents to Send on 03 06 2014 14
  • 为什么我的浮点数大于 1 时在 MYSQL 中存储为 .9999?

    我将进程时间作为 float 4 4 存储在 MySQL 数据库中 start time microtime TRUE things happen in my script end time microtime TRUE process t
  • laravel cron 使用错误

    Laravel 错误 cron 使用 usr bin php home sitevk artisan 计划 运行 1 gt gt dev null 2 gt 1 应用 控制台 内核 use Illuminate Console Schedu
  • Composer 无法下载文件

    我正在尝试在命令行上使用作曲家 php composer phar update php composer phar install php composer phar self update php composer phar selfu
  • 安装 OCI8:如何纠正“使用未定义常量 OCI_COMMIT_ON_SUCCESS”错误?

    我正在尝试在 RedHat 服务器 RHEL7 上为我的 Apache 服务器安装 OCI8 此时 当我尝试使用 Symphony 连接到我的服务器时 出现以下错误 异常 ErrorException 使用未定义的常量 OCI COMMIT
  • 正则表达式捕获和替换可以与 Apache DirectoryMatch 指令一起使用吗?

    有谁知道是否可以在 Apache 的 DirectoryMatch 指令中使用正则表达式捕获 我想做类似以下的事情
  • Laravel:使用 Faker 播种多个独特的列

    介绍 怎么样 伙计们 我有一个关于模型工厂和多个独特列的问题 背景 我有一个名为 Image 的模型 该模型将语言支持存储在单独的模型中 图片文字 图片文字 has an image id栏 语言栏和文本栏 图片文字有一个约束MySQL那个
  • Apache 反向代理的基本身份验证问题

    我想为在 Ubuntu 服务器 12 04 1 上运行的 Apache 反向代理站点添加基本身份验证 网络应用程序是Jenkins http jenkins ci org运行在 Java EE 容器上 我在中添加了以下配置httpd con
  • 使用 Java 的 Apache Http 摘要身份验证

    我目前正在开发一个 Java 项目 但无法使 http 摘要身份验证正常工作 我尝试使用 Apache 网站 但没有帮助 我有一个需要 HTTP 摘要身份验证的网站 DefaultHttpClient httpclient new Defa
  • 将具有值的产品属性添加到 Woocommerce 中的产品

    我正在使用此代码添加自定义属性 attributes array array name gt Size options gt array S L XL XXL position gt 1 visible gt 1 variation gt
  • AFNetworking 上传图片

    我看过一些例子 但我认为我的问题可能出在 PHP 中 我正在尝试使用 AFNetworking 将图像从 iPhone 上传到服务器 这是我的 obj c 代码 IBAction uploadButtonClicked id sender
  • 如何在php中根据url从mysql获取数据?

    我在 mysql 数据库中有一个页表 其中包含 page name title content author 字段 我想用 php 来获取它http www domain com index php page page name http
  • Apache 虚拟主机始终重定向到 /dashboard

    我遇到的问题似乎是一个常见问题 但我找到的任何解决方案似乎都不适合我的情况 我正在尝试设置一个虚拟主机 以便我可以通过 mytestdomain local 访问我的 Laravel 安装的公共文件 但是当我在 google chrome
  • PHP 的 mb_internal_encoding 实际上是做什么的?

    根据 PHP 网站 http www php net manual en function mb internal encoding php它这样做 coding 是用于 HTTP 输入的字符编码名称 字符编码转换 HTTP输出字符编码 转
  • Microsoft VS Code:当我尝试启动程序时,出现错误“spawn php ENOENT”

    我正在尝试在 Microsoft VS Code 上运行 PHP 代码 当我单击启动时 唯一发生的事情是调试控制台中出现错误 生成 php ENOENT 为了解决这个问题 我将 XDebug 的 dll 文件放入 ext 文件夹中 我将 p
  • Laravel 意外错误“类用户包含 3 个抽象方法...”

    在 Laravel 上编写我的身份验证应用程序时 我遇到了一个以前从未见过的错误 我已经集思广益了近一个小时来解决这个问题的原因 但仍然找不到解决方案 Error User 类包含 3 个抽象方法 因此必须声明为抽象方法或实现其余方法 Il
  • Monolog,如何将 PHP 数组记录到控制台?

    我正在使用浏览器处理程序将消息记录到 JS 控制台 require once vendor autoload php use Monolog Logger use Monolog Handler BrowserConsoleHandler
  • 使用 PHP 将 SVG 图像转换为 PNG

    我正在开发一个网络项目 该项目涉及动态生成的美国地图 根据一组数据为不同的州着色 这个 SVG 文件为我提供了一张很好的美国空白地图 并且很容易更改每个州的颜色 困难在于 IE 浏览器不支持 SVG 因此为了让我使用 svg 提供的便捷语法
  • 简单的颜色变化

    我正在创建一个用户界面 用户可以在其中更改页面的颜色值 我想要的是获取分配给其背景颜色的值并将其变亮一定程度 我只是想获得一条亮点线 而不必每次都制作新图像 示例 用户将背景颜色设置为 ECECEC 现在我希望某个元素边框变成 F4F4F4
  • preg_match 所有以@开头的单词?

    我对正则表达式不太确定 所以我不得不问你 如何用 PHP 判断字符串中是否包含以 开头的单词 例如我有一个像 This is for codeworxx 这样的字符串 我很抱歉 但我没有任何起点 希望你能帮忙 谢谢 萨沙 好的 谢谢你的结果

随机推荐

  • 尝试更好地理解“using”语句

    我读过几篇关于 using 语句的文章 试图理解何时应该使用它 听起来大多数人认为应该尽可能多地使用它 因为它可以保证处理未使用的物品 问题是所有的例子总是显示这样的内容 using SqlCommand scmFetch new SqlC
  • 重构方法中的多个 if-else 条件

    我正在重构现有代码 它实际上工作得很好 但它有点混乱 有多个 if else 条件检查一个变量的值并将第二个变量的值更改为从固定枚举结构获取的更新值 else if var1 valueX if var2 MyEnum A var2 MyE
  • 如何将网页居中

    我想定位我的网页 以便在放大或缩小时 网页的尺寸从中心减小或增大 例如 当放大或缩小该网站时 布局会向中心移动并远离中心 我希望你明白 我认为你正在谈论 margin 0px auto 您所要做的就是将其添加到 CSS 的正文中 body
  • sqlite3 varchar 与“like”匹配但不与“=”匹配

    使用Rails 3 1和sqlite3进行开发 测试环境 在迁移中添加了一个新表 create table api keys do t t string api key t integer user id t timestamps end
  • Gradle 提供了与 Intellij 的依赖关系

    我正在尝试构建一个 Bukkit 插件 该插件还使用exp4j 最终结果需要将 exp4j 代码包含在发布的 jar 中 但是not包含 Bukkit 代码 我听从了建议这个答案复制依赖项并使用这个答案按规定申报 Bukkit 我的 bui
  • Django:允许管理员用户编辑站点范围的设置吗?

    我有一个 Django 站点 我想允许一些站点范围的设置 ADMIN EMAIL email address for an administrative user REMINDER TEXT email text for an email
  • 使用全局注入器的 Angular 7 组件继承

    我一直在使用中描述的方法MSDN 博客文章简化扩展组件 无需提供所有依赖项super 称呼 然而 这在 Angular 7 和 Typescript 3 中已经停止工作 所以发生的事情是 在引导之后 我尝试将注入器存储在服务中 然后尝试检索
  • 如何模拟已模拟对象的实例方法?

    我需要模拟以下内容 Class User def facebook returns an instance of a facebook gem end end 所以在我的用户测试中 要访问用户的 Facebook 信息 我需要调用user
  • 在参数中使用泛型集合

    假设您有 public interface A public class B implements A public class C void foo List a public class Test Declaration one Lis
  • 向电子邮件 MIME 添加 HTML 前缀会导致某些客户端显示空正文

    我正在尝试将 HTML 部分添加到电子邮件中 可以是任何类型的 MIME 可能是mixed or 选择 我们从 GMail 获取原始数据 目前我们的做法如下 email copy deepcopy original email if Con
  • tkinter 窗口中的grab_set

    我见过许多grab set 用于 tkinter 模态窗口的示例 但我无法让它适用于我的应用程序 我正在创建第二个窗口作为我的 设置 窗口 该窗口是从主应用程序的菜单中调用的 example import tkinter as tk cla
  • 根据给定的顺序对数据框进行排序[重复]

    这个问题在这里已经有答案了 可能是一个简单的问题 我有一个data frame 样本名称 因子水平以及因子水平的重复 df lt data frame name c DP A DP B PA A PA B PA C level c DP D
  • 如何在核心数据中存储图像

    我是 iOS 新手 我一直在尝试制作一个应用程序 将从相机捕获的图像存储到CoreData 我现在知道如何存储数据NSStrings NSDate和其他类型但难以存储图像 我读过很多文章说必须将其写入磁盘并写入文件 但我似乎无法理解 以下代
  • codeigniter 设置会话变量,但变量不起作用

    使用在 WAMP 上本地运行的 codeigniter 并处理会话 我尝试了默认会话处理程序 数据库会话 本机会话和现在的数据库会话 它们都会导致同样的问题 而我一生都无法弄清楚 问题是我正在尝试使用变量设置会话变量 我已经确认了该变量并已
  • 从 sqlite3 检索图像并在 Kivy 图像小部件中显示 - ValueError

    要求 我正在尝试从数据库检索图像并将该图像设置为 kivy 图像小部件 此操作会引发 ValueError 不确定原因 欢迎任何意见 数据库 Sqlite3 表名称 用户 列 用户 ID 用户名 用户图像 def populate fiel
  • 如何禁用 DIV 元素及其内部的所有内容[重复]

    这个问题在这里已经有答案了 我需要使用 Javascript 禁用 DIV 及其所有内容 我可以发誓做一个简单的 div 以前为我工作过 但由于某种原因它不再工作了 我不明白为什么 在 IE10 中 文本 Click Me 不会变灰 并且单
  • C++11 可变参数模板和逗号分隔表达式的等效性

    在可变参数模板中 运算符将参数包扩展为一系列逗号分隔的参数 以最简单的形式 我的问题是 为什么为多个逗号分隔的参数调用 some function 有效 而使用 运算符调用它却不起作用 我正在谈论这段代码 template
  • 为什么 Google Play 商店请求的权限不在我的清单中?

    我认为这可能与 ManifestMerger 有关 My AndroidManifest xml权限
  • 如何在所有驱动器的所有目录中搜索 .txt 文件?

    我使用此代码搜索所有驱动器中的所有目录以搜索所有 txt 文件 public List
  • 防止使用浏览器url直接访问图像

    我有一个名为 的文件夹Images 该文件夹包含用户个人资料图片 现在 用户只需将图像 URL 复制到浏览器即可随时查看自己的图像 这样他还可以看到其他用户的个人资料照片 我想要实现的是 用户应该只能通过我网站上的 PHP 页面看到他的个人