繁体   English   中英

保护图像不被复制

[英]protect images from being copied

我正在寻找可靠的解决方案来保护图像不被复制。我的客户(摄影师)希望避免客户在不购买的情况下复制她的照片。

我正在考虑混合这些技术:


PHP自制过期

图像是从从图像文件读取的 php 脚本加载的,在请求中我捆绑了请求时间戳和文件名。 如果时间戳非常接近实际时间戳(两个时间戳都是在同一台服务器上生成的,因此没有时间配置问题),则在页面生成时创建请求。 例如:在生成的 html 中,我有一些 img 标签,例如:

因此,当用户想要从源代码复制图像源时,image.php 脚本将不会响应,因为页面生成和图像请求之间存在延迟......

无缓存

如果我发送无缓存 header,我想浏览器不会在客户端计算机上缓存/存储文件?


现在这是基本想法..用户没有原始文件名,因此无法直接访问它们..使用此解决方案,我什至可以即时为它们加水印或调整它们的大小

用户仍然可以打印屏幕它们,有两种类型的打印屏幕,将它们放在剪贴板中的,以及保存文件的。

是否有解决方案,我正在考虑某种 javascript 侧 onkeydown 并检测打印屏幕触摸,或在 mac 组合上使用 shift+alt+cmd+[1-4] 并在采取任何操作之前清除图像..这可能吗,或多或少可靠,如何?

我的另一个部分想法是在间隔或某些操作时清除剪贴板,但这对人们来说很烦人,不适用于桌面保存的屏幕截图,并且可能不适用于所有浏览器。

还有其他想法吗?

那么 go 从这里到哪里? 这是一个实际的问题,我知道人们毕竟可以为他们的屏幕拍照或使用 hdmi 电缆来捕捉设备。但说真的,这有点矫枉过正,没有人会为这样的照片这样做,我们不是在谈论绝密机密文件...

可以捕获显示的任何内容。 所有解决方案都来自服务器端:添加水印,或使用低分辨率的小图像进行显示。

一般的经验法则是:如果可以通过浏览器访问,则用户已经拥有对它的完全访问权限,并且如果他们愿意,可以使用它。 示例选项:

选项1:

防止通过 JavaScript 右键单击。

当用户:

  • 禁用 JavaScript 并刷新页面。
  • 使用截图工具。
  • 手动检查您的 HTML 并找到 img src。

选项 2:

将图像作为 div 的背景图像。

当用户:

  • 使用截图工具。
  • 手动检查您的 HTML/CSS 并找到 img src。

选项 3:

使用水印和/或低分辨率图像。

可能是这里最好的方法。 如果您的客户是想要保护他/她的作品的摄影师,那么显示低分辨率图像并提供购买高分辨率版本的选项/链接可能是最好的做法。 添加水印也可能会阻止访问者免费拍摄图像,因为没有人愿意构图中间有摄影师标志的照片。

  1. 摄影师大多在做高质量的照片,所以为什么不在 web 网站上展示低质量的图片并在上面写上“演示”之类的东西。
  2. 使用 flash 防止用户复制它们。
  3. 将您的图像编码为 base64 并使用 canvas 或 svg 显示它们。

没有100%的保护。。

客户总是可以从图像中制作例如屏幕截图。 或者可以使用浏览器的代码检查器获取到图像的链接。

添加水印是最好的解决方案。

所以这是我的实现:

首先在 php 中的页面生成期间调用图像时:

$reqinfo['id'] = $data[id];
$reqinfo['maxsize'] = 320;
$reqinfo['timestamp'] = time();
$reqinfo['base'] = false;

$encoded = base64_encode(openssl_encrypt(serialize($reqinfo), 'AES-128-CBC', 'martine',0,'fgrgfvcfghtfdrfg'));

echo'<div class="imagecontainer"><img src="photo.php?info='.$encoded.'" /></div>'; 

这已经在镜像容器 class 上的 css 和 javascript 中实施了一些限制。 我发送图像 ID(或名称)的最大宽度或高度以及请求时间戳,所有这些都在发送到 photo.php 的请求字符串中加密,如果图像可以绕过所有内容并像普通图像一样被调用,则基础是正确的。

照片.php

<?
//request info
$reqinfo = unserialize(openssl_decrypt(base64_decode($_GET[info]), 'AES-128-CBC', 'martine',0,'fgrgfvcfghtfdrfg'));

//image expired
if(time() - $reqinfo[timestamp] > 10){ exit(); }

//public image
if($reqinfo[base] == true){ readfile('img/'.$reqinfo[id].'.jpg'); exit(); }

//header cache
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
header('Content-type: image/jpeg');

//check cache existance and send out
if(file_exists( 'img/'.$reqinfo[id].'_'.$reqinfo[maxsize].'.jpg')) { readfile('img/'.$reqinfo[id].'_'.$reqinfo[maxsize].'.jpg'); exit(); }

//source Image
$image_path = 'img/'.$reqinfo[id].'.jpg';
list($original_width, $original_height)= getimagesize($image_path); 
$srcImage = imagecreatefromjpeg( $image_path );
$ratio = $original_height/$original_width;


//create destination image holder
$destination_width = $reqinfo['maxsize'];
if($destination_width < 1) $destination_width = 1;
if($destination_width > $original_width)$destination_width = $original_width;
$destination_height = round($destination_width*$ratio);
if ($destination_height > $reqinfo['maxsize'])
{
    $destination_height = $reqinfo['maxsize'];
    $destination_width = round($destination_height/$ratio);
}
$targetImage = imagecreatetruecolor( $destination_width, $destination_height );
imagealphablending($targetImage,true);

//resample copy logo
imagecopyresampled( $targetImage, $srcImage, 
0, 0, 
0, 0, 
$destination_width, $destination_height, 
$original_width, $original_height );


// watermark
$watermark = imagecreatefrompng('watermark.png');
imagesettile($targetImage, $watermark);
imagefilledrectangle($targetImage, 0, 0, $destination_width, $destination_height, IMG_COLOR_TILED);




//output
imagejpeg(  $targetImage, 'img/'.$reqinfo[id].'_'.$reqinfo[maxsize].'.jpg' );
imagejpeg(  $targetImage );
imagedestroy( $targetImage );


?>

'martine' 是一个简单的密码短语 img 显然是一个非公共路径

希望这或多或少清楚,基本上是这个(按顺序):

  • 解密 $reqinfo 数组
  • 检查 imagerequest 是否新鲜,如果用户复制 url 并加载到另一个框架中,则不会加载任何图像。
  • 检查图像是否可以绕过调整大小和水印并发送到浏览器
  • 检查是否存在缓存版本以加快进程
  • 重新创建调整大小的版本
  • 添加水印
  • 保存服务器缓存版本
  • 发出“一次性”图像

希望这可以帮助某人...

我尝试了各种技术: 1 是将图像分成多个图像——考虑将图像分成 16 个不同的 PNG。 每个图像都显示一个 4x4 像素或 10x10 像素的彩色像素块,其中 15 个 10x10 块是完全透明的。 当您将这些图像完全叠加在一起时,将显示完整的图像。 当然,您可以只使用 2 张图像,或者任意数量。 这绝对会阻止某人下载图像。

其次,我尝试了一种类似的技术,但是,随机隐藏和显示图像,其中大多数在任何时候都显示......这样如果有人屏幕捕捉到它,它只会是图像的一部分。 由于“视觉持久性”,如果帧速率足够高,您应该能够正常看到图像。但目前,它确实不能很好地工作。

最后,您可以将这些技术与 CSS 滤镜和更改的彩色图像相结合——想想,旋转源图像上的色调,然后使用滤镜将其旋转回来。 您可以疯狂地使用各种滤镜和混合混合模式来制作无法下载的完美显示图像,并且在不反转技术的情况下看起来像原始图像。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM