首页 文章

保护图像不被复制

提问于
浏览
2

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

我在想混合这些技巧:


PHP自制过期

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

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

没有缓存

如果我发送无缓存标头, I suppose the browser doesn't caches/stores the file on the client computer?


现在这是基本的想法..用户没有原始文件名,所以不能直接访问它们 . 通过这个解决方案,我甚至可以在运行中为它们添加水印或调整它们的大小

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

是否有解决方案,我正在考虑某种javascript方面的onkeydown和检测printcreen触摸,或在mac cobination上移动alt cmd [1-4]并在采取任何行动之前将图像删空.. is this possible, more or less reliable and how?

我的另一个部分想法是在一个间隔或一些动作清除剪贴板,但这对人们来说是烦人的,不适用于桌面保存的屏幕捕获,也许不适用于所有浏览器 .

any other idea?

那么从哪里开始呢?这是一个实际的问题,我知道人们可以拍摄他们的屏幕照片或使用hdmi电缆捕捉设备..但严重的是,这是矫枉过正,没有人会这样做这些图片,我们不是在谈论绝密机密文件......

5 回答

  • 1

    所以这是我的实现:

    首先在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>';
    

    这已经在imagecontainer类的css和javascript中实现了一些限制 . 我发送图像ID(或名称)最大宽度或高度和请求时间戳,所有这些加密到发送到photo.php基地的请求字符串是真实的,如果图像可以绕过一切并被称为普通图像 .

    photo.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是否为新鲜,如果用户复制网址并加载到另一帧中,则不会加载图像 .

    • 检查图像是否可以绕过调整大小和水印并发送到浏览器

    • 检查是否存在缓存版本以加快进程

    • 重新创建调整大小的版本

    • 添加水印

    • 保存服务器缓存版本

    • 发出'disposable'图像

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

  • 0

    一般的经验法则是:如果可以使用浏览器访问它,则用户已经拥有对它的完全访问权限,并且可以在需要时进行访问 . 示例选项:

    选项1:

    防止通过JavaScript右键单击 .

    用户时无效:

    • 禁用JavaScript并刷新页面 .

    • 使用屏幕截图工具 .

    • 手动检查HTML并找到img src .

    选项2:

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

    用户时无效:

    • 使用屏幕截图工具 .

    • 手动检查HTML / CSS并找到img src .

    选项3:

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

    可能是这里最好的方法 . 如果您的客户是想要保护他/她的工作的摄影师,则显示低分辨率图像并提供购买高分辨率版本的选项/链接可能是最佳行动方案 . 添加水印还可以阻止访问者免费获取图像,因为没有人想要在中间构建具有摄影师徽标的图片 .

  • 0
    • 摄影师大多做高质量的图片,所以为什么不在网站上展示低质量的图片并在上面写上"Demo"什么的 .

    • 使用flash来防止用户复制它们 .

    • 将您的图像编码为base64并使用canvas或svg显示它们 .

  • 0

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

  • 1

    没有100%的保护..

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

    添加水印是最佳解决方案 .

相关问题