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

标签 php apache .htaccess hotlinking

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

我尝试使用 .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'

优点

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

缺点

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

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

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

注意事项:

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

    • 万维网
      • .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
          • ...

优点:

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

缺点

  • 必须事先(或即时)创建符号链接(symbolic link)
  • 图像可以通过直接链接访问
    • 然而这几乎是不可能猜到的
    • 您还可以定期更改符号链接(symbolic link)随机名称或更改图像权限(我希望 google+ 这样做)
  • map original-name → long-random-name 应存储在 db(或 sidecard/meta 文件)中
    • (如果您通过编码/解码或通过组合原始名称 + 长随机名称将原始名称保留在长随机名称中,则可以绕过)

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

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

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

关于php - 防止使用浏览器 url 直接访问图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13658988/

相关文章:

php - json 日期对象到 php 日期

php - vBulletin 等脚本如何在不使用 cron 作业的情况下启动定期维护作业?

apache - 在我的 GoDaddy CentOS 专用服务器上安装 Subversion 后,如何配置和访问我的 Subversion 存储库

php - 从具有不同 IP 的专用服务器发送电子邮件

php - nginx :allow folder access only from localhost

php - 连接表插入和更新分开

php - dompdf 一种删除最后一页页脚的方法?

apache - 如何在 Aptana Studio 3 中连接到远程服务器

javascript - $locationProvider.html5Mode 工作不完美

apache - .htaccess 上的 mod_rewrite 将主文件夹映射到子文件夹