我正在寻找可靠的解决方案来保护图像不被复制.. 我的客户(摄影师)希望避免客户在没有购买的情况下复制她的照片。
我在考虑混合使用这些技术:
图像是从读取图像文件的php脚本加载的,在请求中我将请求时间戳和文件名捆绑在一起。如果时间戳非常接近实际时间戳(两个时间戳都在同一服务器上生成,因此没有时间配置发出),则会在页面生成时创建请求。例如:在生成的html中,我有一些img标签,如:
因此,当用户想要从源代码复制图像源时,image.php脚本将无法应答,因为页面生成和图像请求之间存在延迟...
如果我发送无缓存标头,我认为浏览器不会将文件缓存/存储在客户端计算机上?
现在这是基本的想法.. 用户没有原始文件名,因此无法直接访问它们。 有了这个解决方案,我甚至可以动态地为它们添加水印或调整它们的大小
用户仍然可以打印屏幕,有2种类型的打印屏幕,将它们放在剪贴板中,以及保存文件的那些。
是否有解决方案,我正在考虑某种javascript方面的onkeydown并检测出printcreen触摸,或者在mac cobination上移动+ alt + cmd + [1-4]并在采取任何操作之前清空图像.. < strong>这可能,或多或少可靠以及如何?
我的另一个部分想法是在间隔或某个动作上清除剪贴板,但这对于人来说是烦人的,不适用于桌面保存的屏幕捕获,也许并不适用于所有浏览器。
任何其他想法?
那么从哪里开始呢? 这是一个实际的问题,我知道人们可以拍摄他们的屏幕照片或使用hdmi电缆捕捉设备..但严重的是,这是矫枉过正,没有人会这样做这些图片,我们不是在谈论绝密机密文件......
答案 0 :(得分:1)
可以捕获任何显示的内容。所有解决方案均来自服务器端:添加水印,或使用小型低分辨率图像进行显示。
答案 1 :(得分:1)
一般经验法则是:如果可以使用浏览器访问它,则用户已经拥有对它的完全访问权限,并且可以在需要时进行访问。示例选项:
通过JavaScript阻止右键单击。
用户时无效:
将图像作为div的背景图像。
用户时无效:
使用水印和/或低分辨率图像。
这可能是最好的方法。如果您的客户是想要保护他/她的工作的摄影师,则显示低分辨率图像并提供购买高分辨率版本的选项/链接可能是最佳行动方案。添加水印也可能会阻止访客免费拍摄图像,因为没有人想要在中间拍摄带有摄影师徽标的照片。
答案 2 :(得分:0)
答案 3 :(得分:0)
没有100%的保护..
客户端总是可以从图像中制作一个屏幕截图。 或者可以使用浏览器的代码检查器获取图像链接。
添加水印是最佳解决方案。
答案 4 :(得分:0)
所以这是我的实施:
首先在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的请求字符串中加密 如果图像可以绕过一切并被称为普通图像,则基础是真实的。
<?
//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显然是一条非公开路径
希望这或多或少清楚,基本上这个(按顺序):
希望这可以帮助某人...