使用浏览器URL阻止直接访问图像

时间:2012-12-01 11:30:43

标签: php apache .htaccess hotlinking

我有一个名为 - 图像的文件夹。此文件夹包含用户个人资料图片现在,用户可以通过随时将图像URL复制到浏览器来查看他的图像。通过这种方式,他还可以看到其他用户的个人资料照片。我想要实现的是 - 用户应该只能通过我网站上的PHP页面查看他的个人资料照片。如果用户直接放置图像URL,则不应显示该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的新手。如果有办法实现这一目标,请提供帮助。

提前致谢。

1 个答案:

答案 0 :(得分:1)

我有同样的问题。目前我发现了两种方式:

1)base64_encode()+ ajax + js / jquery

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

优点

  • 无法使用直接链接访问图片

缺点

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

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

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

注释:

  • 文件夹还必须包含随机符号
  • 使用'。'在任何文件夹或文件名之前=>以防万一,以防止在未配置的apache上显示文件夹内容
  • 在案例B)中将apache配置为folow符号链接(将FlowSymlinks添加到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
          • ...

专业人士:

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

缺点

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

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

我已经实施了案例1)并且它对我很有用,但我没有找到类似的HTML5视频解决方案。

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